LinuxSir.cn,穿越时空的Linuxsir!

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

等待队列里面的进程都是sleeping的吧?

[复制链接]
发表于 2005-8-8 14:41:24 | 显示全部楼层 |阅读模式
在网上看到有人说不一定等待队列的进程都是睡眠的,不解其义
谁能给我讲讲2.6内核的等待队列结构
我看了代码和LKD2相关部分,不是很明朗

对于下面三个问题还是不够知道:
如何创建等待队列?
一个进程如何加入等待队列来将自己挂起(睡眠)?
所依赖的条件满足时,其他进程如何唤醒等待队列(进程)?

请高手指点,谢谢
发表于 2005-8-11 11:18:34 | 显示全部楼层
休眠:
首先创建一个结构wait_queue_t
就是
struct __wait_queue {
         unsigned int flags;
#define WQ_FLAG_EXCLUSIVE       0x01
         struct task_struct * task;
         wait_queue_func_t func;
         struct list_head task_list;
};

然后用里面的指针task_list把进程加入到睡眠的队列里面,也就是把上面这个
结构连入队列,结构里面有进程的结构指针。

但是这时候进程可能也同时在可运行队列中,所以可能也可以运行,你需要
把进程从可运行队列中移除
回复 支持 反对

使用道具 举报

发表于 2005-8-27 12:30:08 | 显示全部楼层
如果某进程A被剥夺CPU而进入睡眠队列,此时schedule重新调度进度,在完成切换到另一进程之前,进程A还是TASK_RUNNING,只有在__switch_to结束之后,另一进程才真正执行。此时A进程状态为睡眠。

如果schedule重新调度时,调度的还是A进程,此时,A的状态保持不变,而不是先变成睡眠而后又改回来。

所以。。。
回复 支持 反对

使用道具 举报

发表于 2005-8-27 14:32:25 | 显示全部楼层
你的概念有问题
1  睡眠并不是说进程当前在不在运行,而是说进程并不在可运行队列中
2  schedule重新选中A?这说明A就在可运行队列中
3  只要A在可运行队列中,不管他有没有被选中运行,他都是可运行进程,这和睡眠
    不是一个概念
     所以关键的问题是 有没有把A重可运行队列移出 ,而至于schedule选择谁来运行
这根本无所谓
回复 支持 反对

使用道具 举报

发表于 2005-8-27 15:34:24 | 显示全部楼层
还有一个suspend状态
回复 支持 反对

使用道具 举报

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

本版积分规则

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