什么是IO多路复用?怎么实现?

作者:guoxj
浏览:513

IO多路复用(IO Multiplexing)是指单个进程/线程就可以同时处理多个IO请求。

实现原理:用户将想要监视的文件描述符(File Descriptor)添加到select/poll/epoll函数中,由内核监视,函数阻塞。一旦有文件描述符就绪(读就绪或写就绪),或者超时(设置timeout),函数就会返回,然后该进程可以进行相应的读/写操作。




登录后回复

共有2条评论


guoxj

select/poll/epoll三者的区别?

  • select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间(缺点1:每次都要复制,**开销大**),由内核根据就绪状态修改该集合的内容。(缺点2)**集合大小有限制**,32位机默认是1024(64位:2048);采用水平触发机制。select函数返回后,需要通过遍历这个集合,找到就绪的文件描述符(缺点3:**轮询的方式效率较低**),当文件描述符的数量增加时,效率会线性下降;
  • poll:和select几乎没有区别,区别在于文件描述符的存储方式不同,poll采用链表的方式存储,没有最大存储数量的限制
  • epoll:通过内核和用户空间共享内存,避免了不断复制的问题;支持的同时连接数上限很高(1G左右的内存支持10W左右的连接数);文件描述符就绪时,采用回调机制,避免了轮询(回调函数将就绪的描述符添加到一个链表中,执行epoll_wait时,返回这个链表);支持水平触发和边缘触发,采用边缘触发机制时,只有活跃的描述符才会触发回调函数。

总结,区别主要在于: - 一个线程/进程所能打开的最大连接数 - 文件描述符传递方式(是否复制) - 水平触发 or 边缘触发 - 查询就绪的描述符时的效率(是否轮询)

2022-03-07 21:38 回复

guoxj

什么时候使用select/poll,什么时候使用epoll?

 

当连接数较多并且有很多的不活跃连接时,epoll的效率比其它两者高很多;但是当连接数较少并且都十分活跃的情况下,由于epoll需要很多回调,因此性能可能低于其它两者。

2022-03-07 21:39 回复