网站首页 > 技术文章 正文
一般情况下,一次网络IO读操作会涉及两个系统对象:(1) 用户进程(线程)Process;(2)内核对象kernel,两个处理阶段:
[1] Waiting for the data to be ready - 等待数据准备好
[2] Copying the data from the kernel to the process - 将数据从内核空间的buffer拷贝到用户空间进程的buffer
1 同步阻塞IO
用户进程process在Blocking IO读recvfrom操作的两个阶段都是等待的。在数据没准备好时,process原地等待kernel准备数据。kernel准备好数据后,process继续等待kernel将数据copy到自己的buffer。在kernel完成数据的copy后process才会从recvfrom系统调用中返回
2 同步非阻塞IO
process在NonBlocking IO读recvfrom操作的第一个阶段是不会block等待的,如果kernel数据还没准备好,那么recvfrom会立刻返回一个EWOULDBLOCK错误。当kernel准备好数据后,进入处理的第二阶段的时候,process会等待kernel将数据copy到自己的buffer,在kernel完成数据的copy后process才会从recvfrom系统调用中返回
3 同步IO之多路复用
IO多路复用,就是熟知的select、poll、epoll模型。从图上可见,在IO多路复用的时候,process在两个处理阶段都是block等待。初看好像IO多路复用没什么用,其实select、poll、epoll的优势在于可以以较少的代价来同时监听处理多个IO
4 异步IO
异步IO要求process在recvfrom操作的两个处理阶段上都不能等待,也就是process调用recvfrom后立刻返回,kernel自行去准备好数据并将数据从kernel的buffer中copy到process的buffer在通知process读操作完成,然后process在去处理。遗憾的是,linux的网络IO中是不存在异步IO的,linux的网络IO处理的第二阶段总是阻塞等待数据copy完成的。真正意义上的网络异步IO是Windows下的IOCP(IO完成端口)模型
同步与异步,关注的是消息通信机制(或应答模式),是对响应本身而言
阻塞与非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态,是对请求本身而言
猜你喜欢
- 2024-10-01 太详细了!Java语言异步非阻塞模式(原理篇)
- 2024-10-01 老张烧开水的故事-带你了解同步异步与阻塞非阻塞
- 2024-10-01 一文读懂并发与并行,同步与异步阻塞
- 2024-10-01 IO模型 阻塞 非阻塞 同步 异步概念对比区分
- 2024-10-01 精通Redis!epoll?IO的同/异步、阻塞/非阻塞?都懂了吗?
- 2024-10-01 深入理解非阻塞同步IO和非阻塞异步IO
- 2024-10-01 产品经理需要了解的那些技术2:同步、异步、阻塞、同步服务
- 2024-10-01 数据库讲坛|有关阻塞与非阻塞、同步与异步、I/O 模型-爱可生
- 2024-10-01 I/O模型 - 同步/异步/阻塞/非阻塞
- 2024-10-01 一个例子说清楚阻塞与非阻塞,同步与非同步
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)