网络编程笔记(一. 网络IO多路复用)
多路复用有select, poll, epoll三种实现
select中的描述符集合结构类似这样
struct fd_set{ long a[1024/2048];//大小由宏决定 //监听时a[i]=0,1表示是否监听文件描述符i;返回事件后a[i]=0,1表示是否i可操作 };
比较:
poll与select 1.不需要计算最大文件描述符maxfdp+1 2.大数目时,select需要扫描[0,maxfdp]范围,而poll只需要扫描所有需要监听的描述符 3.select监听的数目固定(fd_set里固定了数组大小),在稀疏的文件描述符时效率低下;而poll可以使用恰当大小来存放监听事件 4.select调用返回会修改fd_set(监听、发生事件使用同一个数组表示),所以每次都需要重新添加监听;而poll将监听与返回的事件区分开来,可以复用。 select可移植性强,超时值精度高 epoll: 1.监听数目很多(能创的文件描述符个数) 2.通过返回的发生事件(里保存了fd)来回调处理,而不需要轮询所有监听的描述符 3.内核与用户空间共享内存,减少描述符、数据在内核与用户空间的移动
感觉理解的哪里怪怪的,哪位大佬帮忙指正下,最好解释下select的那几个操作宏