Advertisement

IO多路复用 Poll 详细说明及编程实现

阅读量:

引入poll

与select相比,poll同样在设定的时间范围内检查一定数量的文件描述符,以判断其是否处于就绪状态;相较于select而言,poll的代码量更少,使用起来也更为便捷。其使用方式上的差异并不明显,但整体上比select更具灵活性。

复制代码
       poll是一个系统调用,其内核入口函数为sys_poll,sys_poll几乎不做任何处理直接调用do_sys_poll,do_sys_poll的执行过程可以分为三个部分:
       1,将用户传入的pollfd数组拷贝到内核空间,因为拷贝操作和数组长度相关,时间上这是一个O(n)操作,这一步的代码在do_sys_poll中包括从函数开始到调用do_poll前的部分。
       2,查询每个文件描述符对应设备的状态,如果该设备尚未就绪,则在该设备的等待队列中加入一项并继续查询下一设备的状态。查询完所有设备后如果没有一个设备就绪,这时则需要挂起当前进程等待,直到设备就绪或者超时,挂起操作是通过调用schedule_timeout执行的。设备就绪后进程被通知继续运行,这时再次遍历所有设备,以查找就绪设备。这一步因为两次遍历所有设备,时间复杂度也是O(n),这里面不包括等待时间。相关代码在do_poll函数中。
       3,将获得的数据传送到用户空间并执行释放内存和剥离等待队列等善后工作,向用户

全部评论 (0)

还没有任何评论哟~