select 和poll函数调用驱动的poll->poll_wait 理解
2012-04-10 19:53
369 查看
poll_wait不会挂起当前进程,而是把自己注册到某个事件等待队列中.
poll_wait()是用在select系统调用中的.
一般你的代码会有一个struct file_operations结构,
其中fop->poll函数指针指向一个你自己的函数,
在这个函数里应该调用poll_wait()
当用户调用select系统调用时,select系统调用会
先调用
poll_initwait(&table);
然后调用你的
fop->poll();
从而将current加到某个等待队列(这里调用poll_wait()),
并检查是否有效
如果无效就调用
schedule_timeout();
去睡眠.
事件发生后,schedule_timeout()回来,调用
fop->poll();
检查到可以运行,就调用
poll_freewait(&table);
从而完成select系统调用.
重要的是fop->poll()里面要检查是否就绪,
如果是,要返回相应标志
挂起与否是在sys_select()或sys_poll()两个系统调用中根据
用户传入的timeout和fd的具体情况决定的,是这两个系统调用
将进程挂起的
你的file_operation-->poll()只需要调用poll_wait(),并判断是否就绪,
如果就绪就设置标志,这样即可.
假设我没有使用timeout,也没有signal
我只关心writeable事件,但是设备在poll时总返回POLLRD事件,
那么就会出现这种情况啊,不停的加poll_entry成员到睡眠队列,总有一天会溢出 啊。
不会啊,因为如果没有timeout和signal,它不会醒的,
只要他醒了,只有三种可能:
1,timeout
2,signal
3,设备就绪
如果当前不可读,那么在sys_poll->do_poll中当前进程就会睡眠在等待队列上,这个等待队列是由驱动程序提供的(就是poll_wait中传入的那个)。当可读的时候,驱动程序可能有一部分代码运行了(比如驱动的中断服务程序),那么在这部分代码中,就会唤醒等待队列上的进程,也就是之前睡眠的那个,当那个进程被唤醒后do_poll会再一次的调用驱动程序的poll函数,这个时候应用程序就知道是可读的了。
poll_wait()是用在select系统调用中的.
一般你的代码会有一个struct file_operations结构,
其中fop->poll函数指针指向一个你自己的函数,
在这个函数里应该调用poll_wait()
当用户调用select系统调用时,select系统调用会
先调用
poll_initwait(&table);
然后调用你的
fop->poll();
从而将current加到某个等待队列(这里调用poll_wait()),
并检查是否有效
如果无效就调用
schedule_timeout();
去睡眠.
事件发生后,schedule_timeout()回来,调用
fop->poll();
检查到可以运行,就调用
poll_freewait(&table);
从而完成select系统调用.
重要的是fop->poll()里面要检查是否就绪,
如果是,要返回相应标志
挂起与否是在sys_select()或sys_poll()两个系统调用中根据
用户传入的timeout和fd的具体情况决定的,是这两个系统调用
将进程挂起的
你的file_operation-->poll()只需要调用poll_wait(),并判断是否就绪,
如果就绪就设置标志,这样即可.
假设我没有使用timeout,也没有signal
我只关心writeable事件,但是设备在poll时总返回POLLRD事件,
那么就会出现这种情况啊,不停的加poll_entry成员到睡眠队列,总有一天会溢出 啊。
不会啊,因为如果没有timeout和signal,它不会醒的,
只要他醒了,只有三种可能:
1,timeout
2,signal
3,设备就绪
如果当前不可读,那么在sys_poll->do_poll中当前进程就会睡眠在等待队列上,这个等待队列是由驱动程序提供的(就是poll_wait中传入的那个)。当可读的时候,驱动程序可能有一部分代码运行了(比如驱动的中断服务程序),那么在这部分代码中,就会唤醒等待队列上的进程,也就是之前睡眠的那个,当那个进程被唤醒后do_poll会再一次的调用驱动程序的poll函数,这个时候应用程序就知道是可读的了。
相关文章推荐
- select 和poll函数调用驱动的poll->poll_wait 理解
- select 和poll函数调用驱动的poll->poll_wait 理解
- struts2 <s:select>理解以及默认值的问题
- do_select()函数分析,理解select(),poll(),poll_wait()函数的关系
- [转]do_select()函数分析,理解select(),poll(),poll_wait()函数的关系
- 理解事件驱动select,poll,epoll三种模型
- poll, select & poll—wait底层数据结构
- socket模型使归纳(EventSelect—>HPR_WaitForMultipleObjects—>EnumNetworkEvents示例)
- IO多路复用机制--select、poll、epoll & poll-wait
- Linux Socket CAN驱动 <5.控制器的初始化过程>
- <html:select>
- 深入理解javascript原型和闭包(1)-->一切都是对象
- 在Matlab中调用C/C++程序<四>
- 一个Thiking泛型的例子,突然发现理解了List&lt;String&gt;的原理
- JNI-->C调用Java语言
- Java 中的 int 与 Integer 用于 List<Integer> 时,以及通过打印变量检測程序执行和函数调用次数计数
- struts2中<s:select>标签的使用
- Java【多线程知识总结(10)】线程通信之wait()与notify()的运用--模拟指挥官指挥2个连队交替轰炸战区<另外的写法>
- 关于参考帧中的x264_reference_update函数的补充及h->frames.unused[]的理解
- <s:ierator> 理解