标签:调用 epoll driver 遍历 fd IO poll select
select原理
说在前面,整个select在内核空间中的工作事实上非常有趣,中间还会穿插一些可抢占点,检测当前是否有进程可以调度,增加系统的实时性
初始化阶段:
FD_set,把要监听的fd都添加到监听集合中去
监听阶段:
调用select()
通过系统调用,会把监听集合中所有fd都copy到kernel space,并填充fds数据结构
调用poll_initwait(),(作用待探究)
(第一次遍历!)遍历fds中有效的fd,判断fd对应的文件有没有打开,如果打开了就调用设备文件节点对应的driver中的poll
这个poll做的事情是把当前进程挂到对应driver的等待队列中,并设置一个回调函数(当数据到了,有数据可读,则触发硬件中断,并在硬件中断处理中调用回调函数,从而唤醒这个driver的等待队列中的进程去对数据进行操作)
在do_select中调用schedule_timeout挂起进程,当数据来了,driver中断处理调用wake_up来唤醒进程,也是返回到这个time_out这里
(第二次遍历!)从schedule_timeout返回后又要重新遍历fd,给有事件发生的fd添加一个mask掩码
把fd复制回userspace
从select()返回
数据处理阶段:
(FD_ISSET)通过FD_ISSET()判断是什么fd可读/可操作,从而去进行数据处理
总结:
以上这个过程一般放在一个for(;;)中,也就是说会重复调用select,这个过程会发生多次内核态和用户态的切换和数据拷贝,此外,还有两次对全部fd的遍历,当fd数量上来以后,性能上的损耗就会非常大。
标签:调用,epoll,driver,遍历,fd,IO,poll,select 来源: https://www.cnblogs.com/jiayu-code/p/16641957.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。