IO模式 select、poll、epoll
阻塞(blocking)、非阻塞(non-blocking):最常听到阻塞与非阻塞这两个词就是在函数调用中,比如waitid这个函数,通过NOHANG参数可以把waitid设置为非阻塞的,也就是问询一遍子进程,看看有没有可回收子进程,如果没有,直接返回不等待,而如果不设置NOHANG,waitid会一直问询子进程,直到有一个可回收子进程再返回,也就是说如果没有子进程可回收,waitid会一直阻塞在这条函数调用上,后面的操作就无法执行。如果把函数调用笼统的规划到一个事件的执行,那么阻塞与非阻塞的区别就是 是否仅仅只等待事件完成(事件返回)才进行下一步操作。比如 烧开水这个例子(参考资料中有提到),如果人从水壶开始烧水到水烧开这段时间一直在水壶前等待烧水,这就是阻塞,如果人比较聪明,在水壶烧水的过程中,人去看电视了或者干其他事情了,这就是不阻塞的,但是在这种情况下,人想要知道水是否烧开了,只能隔一段时间去看一下水壶“烧开了没有?”,这个隔一段时间去看一下的方法 就是 轮询。所以,再回到waitid这个例子,我们设置NOHANG参数的时候,一般都要在waitid上加一个用于轮询的循环。
同步(synchronous)、异步(asynchronous):同步和异步,一开始看很容易把同步和阻塞的概念混淆在一起,我倾向于将同步理解为一种现象,而阻塞/非阻塞作为这个现象中的某种状态存在。同步和异步的区别,参考资料中的说法我觉得虽然把同步异步区别说出来了,但是同步和阻塞还是很容易混淆。那我再对烧开水这个例子重写一下以供参考,水壶分为 普通水壶 和 智能水壶,普通水壶需要人手工操作,需要人判断水是否烧开,水烧开了需要人把水壶从火上拿下来(不然会溢出来),而智能水壶提供两个作用,水烧开后自动关火并且发出响声提示人水已经烧好。烧开水就分为了两个过程,等待水开和拿开水壶,首先说同步和异步,同步就是使用普通水壶烧水,水烧开后需要人主动拿开水壶,而等待水烧开的这个过程可以是阻塞(站那等)的和非阻塞(看电视轮询)的,整个操作需要人的全程参与;异步就是使用智能水壶烧水,等待水开的过程人可以干任何事(即异步本身就是非阻塞的,所以异步并不区分阻塞/非阻塞)并且人不用关心水是否烧开(敲重点),水烧开后,智能水壶会发出响声提示人(发出信号),这完成了等待水开这第一过程,紧接着,智能水壶会自动关火,这代替了人拿开水壶的这个动作完成了第二过程。可以发现,同步整个过程需要人全程参与,而异步整个过程是两个“人”在做,一个“人”就是这个智能水壶,一个人就是始终在做其他事的人,这个人将烧开水这件事托管给了智能水壶由智能水壶完成一切过程,最后提示人完成了。因此,判断同步只需要看,事件的监管和完成方是不是事件发起者即可。
在接下来即将要说到的IO操作中,异步IO就是进程将IO操作完全交由内核控制,由内核中的DMA控制器完成全部IO操作并在完成后通过信号提示进程IO操作已完成,这也是两个“人”的事情,进程将IO托管给DMA控制器,而进程又可以干其他的事,二者在不同的事件上各自执行操作,是并行的。
IO模式:
比如对于一个read操作发生时,它会经历下面两个阶段:
A, 等待数据准备,数据是否拷贝到内核缓冲区;
B, 将数据从内核拷贝到用户进程空间
如果把这两个阶段对应到前文中我写的烧开水的两个过程中,对于下面的几种IO模式就容易理解的多。
《Unix网络编程卷1:套接字联网API》(即UNP)中第六章对unix 系统将IO模型分为五类:阻塞IO,非阻塞IO,IO复用,信号驱动,异步IO。
1、阻塞IO:A阶段阻塞等待,进程调用recvfrom询问内核数据是否准备好,直到数据准备好再返回。(注意:由内核监听数据,进程询问内核数据是否准备好)
2、非阻塞IO:A阶段非阻塞等待,即采用轮询机制(即进程不断的询问内核数据是否准备好(不断调用recvfrom),这么做往往消耗大量CPU时间)判断数据是否拷贝到内核缓冲区。
3、IO复用:IO复用技术是对阻塞IO的改进,首先非阻塞大量消耗CPU,不予考虑。在数据准备阶段,内核监听一个IO也好,监听一群IO也好,都在监听,因此复用,就是内核同时监听进程的多个IO操作,在进程询问时返回有数据到来的IO。此时进程不是阻塞在recvfrom上,而是阻塞在IO复用系统调用——select、poll、epoll上,这几个系统调用会在所监听的所有IO中某个或某几个有数据到来时返回。
多路IO共用一个同步阻塞接口,任意IO可操作都可激活IO操作,这是对阻塞IO的改进(主要是select和poll、epoll,关键是能实现同时对多个IO端口进行监听)。此时阻塞发生在select/poll的系统调用上,而不是阻塞在实际的I/O系统调用上。IO多路复用的高级之处在于:它能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select等函数就可以返回。
4、信号驱动:
注册一个IO信号事件,在数据可操作时通过SIGIO信号通知线程,这应该算是一种异步机制;
5、异步IO:进程通知内核完成一个IO操作,由内核完成A+B阶段后通知进程。
参考中的这张图很好的解释了上述5种IO模型。

POSIX将IO只分成了同步IO、异步IO两种模型。
同步I/O操作:实际的I/O操作将导致请求进程阻塞,直到I/O操作完成。
异步I/O操作:实际的I/O操作不导致请求进程阻塞。
由此,阻塞式I/O,非阻塞式I/O,I/O复用,信号驱动I/O模型都属于同步I/O,因为第二阶段的数据复制都是阻塞的,也可以理解为都由进程完成。而只有异步I/O模型属于这里的异步I/O操作(IO由内核完成)。
参考资料:知乎Linux分享官
《Unix网络编程卷1:套接字联网API(第3版)》6.2 IO模型
IO模式 select、poll、epoll的更多相关文章
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- 最快理解 - IO多路复用:select / poll / epoll 的区别.
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
- python的协程和异步io【select|poll|epoll】
协程又叫做微线程,协程是一种用户态的轻量级的线程,操作系统根本就不知道协程的存在,完全由用户来控制,协程拥有自己的的寄存器的上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来后, ...
- Linux IO多路复用 select/poll/epoll
Select -- synchronius I/O multiplexing select, FS_SET,FD_CLR,FD_ISSET,FD_ZERO #include <sys/time. ...
- python网络编程——IO多路复用select/poll/epoll的使用
转载博客: http://www.haiyun.me/archives/1056.html http://www.cnblogs.com/coser/archive/2012/01/06/231521 ...
- Linux IO模式以及select poll epoll详解
一 背景 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network ...
- Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)
一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...
- Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO
本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO 1. 多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...
随机推荐
- Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?
面试题 redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? 面试官心理分析 这个是问 redis 的时候,最基本的问题吧,redi ...
- 阿里P8大佬熬夜10天,把所有Android第三方库整理成了PDF
缘起 随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑.快速迭代的目的越来越难,还有应用之间的互相调用等等问题,插件化技术应用而生.如果没有插件化技术,美团. ...
- 时间序列数据的定义,读取与指数平滑(Java)
应上头的要求,需要实现以下指数平滑进行资源调度负载的预测,那就是用我最喜欢的Java做一下吧. 引用<计量经济学导论>的一句话:时间序列数据区别于横截面数据的一个明显特点是,时间序列数据集 ...
- 嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种?
持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 自带的多环境配置 创建不同环境的配置文件 指定运行的环境 Maven 的多环境配置 创建多环境配置文件 定义激活的变量 pom 文 ...
- CSS3之transition属性
transition属性可直译为"过渡",主要用于检索或设置对象变换的过渡. 语法: transition:property duration [timing-function] ...
- http代理阅读3 发送mem处理
每次客户端有可读数据触发时,优先检测是否还有数据没有发送,如果有则发送数据,然后在读取client数据 //向后端发送请求的调用过程 //ngx_http_upstream_send_request_ ...
- IP 层收发报文简要剖析1-ip报文的输入
ip层数据包处理场景如下: 网络层处理数据包文时需要和路由表以及邻居系统打交道.输入数据时,提供输入接口给链路层调用,并调用传输层的输入接口将数据输入到传输层. 在输出数据时,提供输出接口给传输层,并 ...
- redis重点ppt
- rhel8/centos8网络网卡设置ping不通,连接不上,各种问题
[解决问题]: 1-ping不通宿主机 2-ping不通外网 3-ping不通网关 4-网络中心VMnet8 VMnet1 VMnet0 不见了 5-rhel8网络设置全攻略 环境:win10宿主机+ ...
- rados put striper功能的调试
前言 之前对于striper这个地方的功能并没研究太多,只是知道这个里面可以以条带方式并行的去写对象,从而加大并发性来提高性能,而默认的条带数目为1,也就是以对象大小去写,并没有条带,所以不是很好感觉 ...