Linux多路复用介绍

Select

首先什么是多路复用:一个进程监听多个文件描述符,Linux中一切皆文件,也就是一个进程管理多个客户端连接。

Select模型不断扫描文件描述符集合

Select模型缺点:

1.一个进程打开的fd(文件描述符)是有限制的,默认1024,所以select模型最大的并发数就是1024个(还要减去标准输入 标准输出 标准错误 )。

2.每次select调用都会线性扫描全部的fd集合,时间复杂度O(n)。如下图

3.用户/内核空间 内存拷贝问题(全量copy  copy的次数相比BIO很少) 如下图:

Poll和epoll

对上面三个缺点 后序的poll和epoll给出了优化

poll:

1.Poll相对Select比较,提高了可打开文件描述符的数量。一个进程打开fd的限制------>整个系统可用打开的文件数目。

在1G内存的服务器,限制是10w左右。poll只是提高了并发的数量,但效率并没有提高。

epoll:

2.内核查找红黑树中ready的socket放到就绪列表,这个过程使用了内核的中断机制。 然后复制到用户态因为有就绪列表

 此后 用户态使用的时候就不需要在遍历所有的fd,这个过程事件通知,只把准备好的fd告诉你,算是事件通知的方式。

3.和select轮询不断的从内核态向用户态复制fd相比,epoll在内核态中,准备了一个就绪链表起到缓冲作用,一次性复制多个就绪的fd.

epoll到底有没有mmap共享内存:

epoll早期版本是没有epoll_create、epoll_ctrl、epoll_wail这三个方法的,所以传递参数就用到了mmap,但是后来有了这三个方法之后,就不需要mmap了,用户和内核直接传递参数的

AIO

AIO希望的是,你select,poll,epoll都需要用一个函数去监控一大堆fd,那么我AIO不需要了,你把fd告诉内核,你应用程序无需等待,

内核会通过信号等软中断告诉应用程序,数据来了,你直接读了,所以,用了AIO可以废弃select,poll,epoll。

 

posted @ 2021-10-22 00:46  palapala  阅读(314)  评论(0编辑  收藏  举报