当前位置: 首页 > Linux

I-O模型解析——select、poll、epoll

时间:2023-04-06 05:38:27 Linux

I/O流概念(1)在c++中,数据的输入输出称为流(stream)。在c++中,stream被定义为一个类,成为一个streamClass(流类),它所定义的对象就是一个流对象。(2)文件、套接字、管道等能够进行I/O操作的对象,可以看作是流式工作机制(1)大多数文件系统默认的I/O操作都是缓存I/O。在Linux的缓存I/O机制中,读取数据时,会先将数据复制到操作系统内核的缓冲区中,然后再将操作系统内核缓冲区中的数据复制到操作系统内核的地址空间中。应用程序,与编写过程相反。(2)CacheI/O使用操作系统内核缓冲区,在一定程度上将应用程序空间和实际物理设备分开。通过将数据写入缓冲区然后一次处理,减少了磁盘读取次数。这提高了I/O模型的性能。同步与异步:重点是消息通信机制的同步(synchronous):调用者总是会“等待”被调用者返回消息,然后再继续执行。在此期间,调用者不能做其他事情异步(asynchronous):被调用者主动通过状态、通知或回调机制将被调用者的运行状态通知给调用者。在此期间,调用者可以一边“等待”一边做其他事情。阻塞和非阻塞:关注调用者阻塞(blocking)的状态:调用者一直在“等待”的状态非阻塞(blocking):调用者的状态可以在“等待”的同时做其他事情SynchronousI/O(1)阻塞式I/O:程序发出I/O请求。如果内核缓冲区为空,此时进行读操作,程序就会阻塞(2)非阻塞I/O:程序发出I/O请求。如果内核缓冲区为空,此时如果进行读操作,会立即返回错误(3)I/O多路复用a.这是一种机制,程序将一组文件描述符注册到操作系统并监视多个描述符。描述符就绪(通常是read-ready或write-ready),可以通知程序进行相应的读写操作。意思是“我要监控这些fds上是否发生了I/O事件,发现了就告诉程序去处理”。b.当多个I/O流共享一个等待机制时,该模型会阻塞进程,但进程阻塞在该机制的系统调用上,而不是真正的I/O操作上c.I/O太多Multiplexing需要和non-blockingI/O一起使用,non-blockingI/O和I/Omultiplexing是相对独立的。Non-blockingI/Oonly表示流对象立即返回,不会被阻塞;而I/O多路复用只是操作系统提供的一种方便的通知机制。(4)信号驱动I/Oa。用户进程可以通过系统调用注册一个信号处理程序,然后主程序可以继续向下执行。当一个I/O操作就绪时,内核会通知并触发一个SIGIO信号处理函数Exec??ute,然后将用户进程需要的数据从内核空间拷贝到用户空间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支持的文件描述符数量太少,默认是1024poll(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-中国开源技术交流社区屏蔽|神一的博客(songlee24.github.io)(三)io多路复用与epoll模型详解_个人文章-SegmentFault思不(三)LinuxIO模式及Select、Poll、epoll详解_人云思云-SegmentFault五IOSifuLinux网络编程模型:多路复用(select/poll/epoll)网络编程与epoll的无IO模型-简书(jianshu.com)吃透epoll的高效运行原理-简书(jianshu.com)如果这篇文章可以'不解释epoll的本质,来掐死我!(3)-知乎(zhihu.com)