IO多路复用

作用

处理服务器的并发
IO多路转接也称为IO多路复用,它是一种网络通信的手段(机制),通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的,一旦检测到有文件描述符就绪( 可以读数据或者可以写数据)程序的阻塞就会被解除,之后就可以基于这些(一个或多个)就绪的文件描述符进行通信了。通过这种方式在单线程/进程的场景下也可以在服务器端实现并发。常见的IO多路转接方式有:select、poll、epoll。

与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

方式

select

  • 可跨平台,windows linux
  • 底层是线性表,效率低

poll

  • 不可跨平台,只能在linux下
  • 底层是线性表,效率低

epoll

  • 不可跨平台,只能在linux下
  • 底层是红黑树,效率高

过程

IO多路转接并发

  • 使用IO多路转接函数委托内核检测服务器端所有的文件描述符(通信和监听两类),这个检测过程会导致进程/线程的阻塞,如果检测到已就绪的文件描述符阻塞解除,并将这些已就绪的文件描述符传出
  • 根据类型对传出的所有已就绪文件描述符进行判断,并做出不同的处理
    • 监听的文件描述符:和客户端建立连接
      • 此时调用accept()是不会导致程序阻塞的,因为监听的文件描述符是已就绪的(有新请求)
    • 通信的文件描述符:调用通信函数和已建立连接的客户端通信
      • 调用 read() / recv() 不会阻塞程序,因为通信的文件描述符是就绪的,读缓冲区内已有数据
      • 调用 write() / send() 不会阻塞程序,因为通信的文件描述符是就绪的,写缓冲区不满,可以往里面写数据
  • 对这些文件描述符继续进行下一轮的检测(循环往复。。。)
posted @ 2023-11-02 16:03  LiviaYu  阅读(53)  评论(0)    收藏  举报