多路复用这里理解起来是有一点困难的,今天说一下select,poll,epoll,在多路复用中的使用及优缺点。
1.select
监听所有的文件描述符,(监听文件描述符的集合,有事发生时,select不再阻塞,留下产生事件的文件描述符)
就像这样,可以同时监测文件描述符fd,和0(输入端)。
select的缺点:
1.select监听的文件描述符集合是一个数组,有上限(1024个)
2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销
3.select需要用户手动查找产生事件的文件描述符
4.select只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)
2.poll
类似于select的工作方式,监听文件描述符的集合;
poll的优点:
1.提升了监听个数,最多个数(允许打开文件描述符个数的最大值)
poll缺点:
1.监听事件在应用层,内核层监听后传递给应用层,带来资源开销
2.需要用户手动查找产生事件的文件描述符
3.只能工作在水平触发模式
3.epoll
在内核层创建一张监听事件表:
先将事件表的文件描述符都置位(-1),若有事件发生,添加该事件的文件描述符和events,监听事件,若有事件发生添加至新的events中,
epoll_create(创建)
epoll_ctl(添加/删除)
epoll_wait(监听事件发生)(会阻塞等待)
同样是用于多路复用,但相比poll和select有很大提升;
epoll的优点:
1.epoll没有文件描述符上限限制
2.epoll监听的事件表在内核层,内核监听事件不需要操作用户层空间提高效率
3.epoll会获得产生事件的文件描述符,不需要用户查找
4.epoll可以工作在边沿触发模式(高速模式),提高效率