Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. Java
  3. 正文
                           

【原创】笔记 | 5种网络IO模型

2021-04-10 2447点热度 0人点赞 0条评论

笔记 | 5种网络IO模型
点击上方蓝色字关注我们~

01

阻塞I/O blocking i/o

笔记 | 5种网络IO模型

①等待数据:需要等待数据拷贝进内核

②需要等内核将数据复制到用户空间。

◇优点:①能够及时返回数据,无延迟。②内核开发者省事。

◇缺点:对用户来说处于等待就要付出性能的代价了

02

非阻塞I/O nonblocking i/o

笔记 | 5种网络IO模型

用户进程需要不断的主动询问kernel数据好了没有。

用户进程发出read操作,由于内核还没有准备好数据,所以马上返回一个error标识,用户进程知道内核还没准备好,所以并没有block,而且还会轮询的调用read询问数据是否准备好,内核准备好后就返回给用户进程。

 

同步非阻塞方式相比同步阻塞方式:

◇优点:能够在等待任务完成的时间里干其他活了(包括提交其他任务,也就是 “后台” 可以有多个任务在同时执行)。

◇缺点:任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。

03

I/O多路复用 i/o multicomplexing

笔记 | 5种网络IO模型

基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

 

当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

 

同步是需要主动等待消息通知,而异步则是被动接收消息通知,通过回调、通知、状态等方式来被动获取消息。IO多路复用在阻塞到select阶段时,用户进程是主动等待并调用select函数获取数据就绪状态消息,并且其进程状态为阻塞。所以,把IO多路复用归为同步阻塞模式。

 

 

04

信号驱动式IO(signal-driven IO)

笔记 | 5种网络IO模型、

05

异步 IO(asynchronous IO)

笔记 | 5种网络IO模型

用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。IO两个阶段,进程都是非阻塞的。
 
异步 IO 的读写操作不会被缓存或缓冲,这就无法利用操作系统的缓存与缓冲机制。

 

06

5种IO模型区别

笔记 | 5种网络IO模型

◇blocking和non-blocking区别

调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下会立刻返回。

◇synchronous IO和asynchronous IO区别

两者的区别就在于synchronous IO做”IO operation”的时候会将process阻塞。之前所述的blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO。

而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。

non-blocking IO和asynchronous IO的区别还是很明显的。在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。

如果喜欢视频版的,请点击左下角“查看原文”,我录的B站视频↓↓↓,希望对你有用。

笔记 | 5种网络IO模型

【笔记系列】

笔记 | Java对象探秘

笔记 | JVM内存区域结构:一计两栈一堆一区

笔记 | 面试官问我高并发的问题:并发编程的三大挑战

笔记 | 面试官问我:TCP与UDP的区别

笔记 | 网络编程基础:TCP如何保证可靠性

笔记 | 面试又挂了,只因问了:TCP三次握手和四次挥手

回复公众号【资料】获得干货资料集锦:技术ppt、IT大会资料、架构、分布式资料等。
推荐好文

1、互联网Code Review最佳实践分享

2、dubbo面试题!会这些,说明你看懂了dubbo源码

3、Kafka面试题!掌握它才说明你真正懂Kafka
4、
Netty 5.0为啥被舍弃?原因竟然是...
5、
中台之上——业务架构系列【汇总】

6、必备瑞士军刀IDEA插件,你使用了哪些

7、线上热更新代码只需3步 Arthas实战

8、Eureka源码剖析之七:架构&面试题【总结】

9、互联网工程师应该用这种姿势打印日志

笔记 | 5种网络IO模型

-关注搬运工来架构,与优秀的你一同进步-

原创不易,如果喜欢这篇文章可以点在看哦↘

本文仅供学习!所有权归属原作者。侵删!文章来源: 搬运工来架构

更多文章:

  1. 笔记08 | 搜狗面试题:IO多路复用之select、poll、epoll的区别
  2. Spring事务无法生效的11个场景
  3. 笔记 | 面试又挂了,只因问了:TCP三次握手和四次挥手
  4. 万字长文全面了解学习Netty!
  5. 【视频】NettyInAction作者:统治一切的框架Netty- One Framework to rule them all
  6. 腾讯的这道面试题,我懵了... —— Redis的hashtable是如何扩容的
  7. 面试题:系统出现高CPU的原因是什么
  8. Eureka源码剖析之七:架构&面试题【总结】
  9. log4j2同步日志引发的性能问题
  10. 笔记 | Java对象探秘
标签: 原创 同步 面试题 笔记 IO 异步 网络
最后更新:2023-12-19

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
文章目录
  • 笔记 | 面试官问我高并发的问题:并发编程的三大挑战
最新 热点 推荐
最新 热点 推荐
Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务?
基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代
tomcat应用服务启不来,没有报错日志?不可能! 你所说的“事件驱动”是什么? What do you mean by “Event-Driven”? 可插拔组件设计机制—SPI 系统设计 | 处理业务公式 系统设计 | UUID 和 自增 ID 怎么选? RocketMQ 很慢?引出了一个未解之谜 关于状态机的技术选型,最后一个真心好! 浅析设计模式4——模板方法模式

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2