各自支持的最大fd数上限以及原因
select支持的fd数是固定的,默认一般为1024,用一个常数FD_SETSIZE定义,如果要monitor更多的fd,需要修改这个常数,并且重新编译(?),一般如果要monitor超过1024的fd,推荐使用poll/epoll
poll和epoll,因为他们monitor的fd list是通过数组或者说链表来保存,所以没有数量限制
区别
select
select是三者中最早被使用的多路复用机制,因此可移植性最好
通过给定三个fd set(bit mask),分别对应关注的是否可读,可写,是否出现异常三种类别,在调用select的时候,这三个集合被传给内核,内核逐一检测这些fd是否ready,然后把三个集合中ready的fd对应的bit置为1,返回
然后用户再逐一检测set中的fd是否处于ready,如果是,就对对应的fd执行相应的操作
注意到,在上面的描述中,用户始终需要扫描整个集合,也就是说扫描的个数和io事件的个数无关,而是始终是FD_SETSIZE,为了提高效率,我们可以使用一个maxfd,这样可以只检测maxfd以下的,从而扫描的个数正比于监听的fd个数,而不是始终是固定的FD_SETSIZE
缺点:
1.每次调用select都需要把三个集合传给内核,然后内核又把修改过的三个集合传回来,耗费时间
2.扫描时耗时与monitor的fd个数成正比,所以如果监听的个数很多,就会很慢
3.监听个数有上限
poll
基本和selec