关于epoll:Epoll-源码剖析-视频笔记
epoll_createwq: 期待过程队列的队列头 (task_struct),通常只有一个 rdllist: readylist 1 1 rbn: 指向红黑树quqList : poll wait listrdllink: 筹备好的列表epoll_event: epoll_ctl加进来的构造体ffd: epoll 监听文件 111 111 1 1 11 阻塞版本 11 1 2
epoll_createwq: 期待过程队列的队列头 (task_struct),通常只有一个 rdllist: readylist 1 1 rbn: 指向红黑树quqList : poll wait listrdllink: 筹备好的列表epoll_event: epoll_ctl加进来的构造体ffd: epoll 监听文件 111 111 1 1 11 阻塞版本 11 1 2
epoll、poll、select的区别?目前的罕用的IO复用模型有三种:select,poll,epoll。================================== (1)select==>工夫复杂度O(n) 它仅仅晓得了,有I/O事件产生了,却并不知道是哪那几个流(可能有一个,多个,甚至全副),咱们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具备O(n)的无差别轮询复杂度,同时解决的流越多,无差别轮询工夫就越长。 (2)poll==>工夫复杂度O(n) poll实质上和select没有区别,它将用户传入的数组拷贝到内核空间,而后查问每个fd对应的设施状态, 然而它没有最大连接数的限度,起因是它是基于链表来存储的. (3)epoll==>工夫复杂度O(1) epoll能够了解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流产生了怎么的I/O事件告诉咱们。所以咱们说epoll实际上是事件驱动(每个事件关联上fd)的,此时咱们对这些流的操作都是有意义的。(复杂度升高到了O(1)) select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,能够监督多个描述符,一旦某个描述符就绪(个别是读就绪或者写就绪),可能告诉程序进行相应的读写操作。但select,poll,epoll实质上都是同步I/O,因为他们都须要在读写事件就绪后本人负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需本人负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 epoll跟select都能提供多路I/O复用的解决方案。在当初的Linux内核里有都可能反对,其中epoll是Linux所特有,而select则应该是POSIX所规定,个别操作系统均有实现 参考https://www.cnblogs.com/fnlin...
https://www.bilibili.com/vide...
I/O流概念(1)c++中将数据的输入输出称之为流(stream),在c++中,流被定义为类,成为流类(stream class),其定义的对象为流对象。 (2)文件,套接字(socket),管道(pipe)等可能进行I/O操作的对象,能够被看做为流 工作机制(1)大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,读取数据时,都会将数据先拷贝到操作系统内核的缓冲区中,而后将操作系统内核缓冲区的数据拷贝到应用程序的地址空间,写的过程则相同。 (2)缓存I/O应用操作系统内核缓冲区,在肯定水平上拆散了应用程序空间和理论的物理设施,通过将数据写入缓冲区后,再一次性解决,缩小了读盘的次数,从而进步了性能 I/O模型同步与异步:关注的是音讯通信机制同步(synchronous):调用者会始终“期待”被调用者返回音讯,能力继续执行,在此期间,调用者不能做其它事 异步(asynchronous):被调用者通过状态、告诉或回调机制被动告诉调用者被调用者的运行状态,在此期间,调用者能够边“期待”,边做其它事 阻塞和非阻塞:关注调用者的状态阻塞(blocking):调用者始终“期待”所处的状态 非阻塞(blocking):调用者可能边“期待”,边做其它事的状态 同步I/O(1)阻塞式I/O:程序收回I/O申请,如果内核缓冲区为空,此时进行读操作,那么该程序就会阻塞 (2)非阻塞式I/O:程序收回I/O申请,如果内核缓冲区为空,此时进行读操作,此时就会立即返回一个谬误 (3)I/O复用 a. 这是一种机制,程序注册一组文件描述符给操作系统,监督多个描述符,一旦某个描述符就绪(个别是读就绪或者写就绪),可能告诉程序进行相应的读写操作。示意“我要监督这些fd是否有I/O事件产生,有了就通知程序处理”。 b. 当多个I/O流共用一个期待机制时,该模型会阻塞过程,然而过程时阻塞在这种机制的零碎调用上,不是阻塞在真正的I/O操作上 c. I/O多路复用须要和非阻塞I/O一起应用,非阻塞I/O和I/O多路复用式绝对独立的。非阻塞I/O仅仅指流对象立即返回,不会被阻塞;而I/O多路复用只是操作系统提供的一种便当的告诉机制。 (4)信号驱动式I/O a. 用户过程能够通过零碎调用注册一个信号处理程序,而后主程序能够持续向下执行,当有I/O操作准备就绪时,由内核告诉触发一个SIGIO信号处理程序执行,而后将用户过程所须要的数据从内核空间拷贝到用户空间 b. 此模型的劣势在于期待数据报达到期间过程不被阻塞。用户主程序能够继续执行,只有期待来自信号处理函数的告诉。 异步I/Oa. 程序过程向内核发送I/O调用后,不必期待内核响应,能够持续承受其余申请,内核调用的I/O如果不能立刻返回,内核会持续解决其余事物,直到I/O实现后将后果告诉给内核 b. 信号驱动式IO是由内核告诉咱们何时启动一个IO操作,而异步IO是由内核告诉咱们IO操作何时实现。 I/O复用模型selectselect的大抵工作流程: (1)采纳数组组织文件描述符 (2)通过遍历数组的形式,监督文件描述符的状态(可读,可写,异样) (3)如果没有可读/可写的文件描述符,过程会阻塞期待一段事件,超时就返回 (4)当有一个可读/可写的文件描述符存在时,过程会从阻塞状态醒来 (5)进行无差别轮询,找出可能操作的I/O流,若解决后,会移除对应的文件描述符 select的毛病: (1)每次调用select,都须要把文件描述符汇合从用户空间贝到内核空间,这个开销在I/O流很多时会很大 (2)同时每次调用select都须要在内核遍历传递进来的所文件描述符数组,这个开销在I/O流很多时也很大 (3)select反对的文件描述符数量太小了,默认是1024 poll(1)采纳链表组织文件描述符 (2)原理和select统一 (3)只是解决了反对的文件描述符受限的毛病 (4)select和poll都是程度触发:找到可操作的I/O流并告诉过程,但过程本次没有解决,文件描述符没有被移除,下次轮询时依旧会告诉 epoll工作原理: (1)红黑树和就绪链表,红黑树用于治理所有的文件描述符,就绪链表用于保留有事件产生的文件描述符。 (2)接管到I/O申请,会在红黑树查找是否存在,不存在就增加到红黑树中,存在则将对应的文件描述符放入就绪链表中 (3)如果就绪链表为空,过程则阻塞否则遍历就绪链表,并告诉利用过程解决文件描述符对应的I/O 工作模式: (1)LT模式(程度触发):检测到可解决的文件描述符时,告诉应用程序,应用程序能够不立刻解决该事件。后续会再次告诉 (2)ET模式(边缘触发):检测到可解决的文件描述符时,告诉应用程序,应用程序必须立刻解决该事件。如果本次不解决,则后续不再告诉 参考资料IO五种模型和select与epoll工作原理(引入nginx) - osc_1ont5xz2的个人空间 - OSCHINA - 中文开源技术交换社区 IO模型:同步、异步、阻塞、非阻塞 | 神奕的博客 (songlee24.github.io) (3) io复用与epoll模型详解_集体文章 - SegmentFault 思否 (3) Linux IO模式及 select、poll、epoll详解_人云思云 - SegmentFault 思否 ...