LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1580|回复: 1

关于“工作队列”的睡眠和嵌套的两个问题。多谢!

[复制链接]
发表于 2010-12-28 03:11:19 | 显示全部楼层 |阅读模式
1,我们知道:每个工作队列(struct workqueue_struct)都有一个每cpu变量(struct cpu_workueue_struct),在这个每cpu变量里有一个“待处理工作队列节点的双向链表(worklist)”,然后“队列处理线程”就按照这个双向链表 来一个一个处理每一个节点的任务。那么当其中一个队列节点的任务执行了一个导致睡眠的系统函数,那么“队列处理线程”将睡眠,这样岂不就导致该节点后面的所有节点上的任务都被阻塞了吗??? 如果有几个节点执行了导致睡眠的函数,那么后面的节点上的任务岂不是要很久以后才能被执行???

2,一个关于工作队列线程的嵌套的问题:
   书上说:“在对称多处理器系统中,如果创建工作队列时使用了选项singlethread,那么系统为该工作队列只创建了一个工作队列处理线程。系统中任一处理器上激活的工作队列节点都将唤醒唯一的工作队列处理线程,而该工作队列处理线程可能由于工作队列节点的处理函数调用了导致睡眠的系统函数已经从处于睡眠状态,此时会造成工作队列线程的嵌套”。

我的问题是:假设一个“工作队列节点”执行一个引起睡眠的函数,从而导致工作队列处理线程进入了睡眠状态。之后当工作队列处理线程被唤醒的时候,也应该是从“刚才睡眠的那个地方”接着执行啊,怎么会引起工作队列线程的嵌套呢???

以上多谢!
发表于 2011-3-30 12:54:27 | 显示全部楼层
For the first question, you can see here:
http://www.linuxjournal.com/article/8144

Basically, the sleeping task will get pulled off of the run queue, nothing will be blocked.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表