进程只有TASK_RUNNING状态才能重新被调度么?

徐行而致--浅唱而归 2013-08-16 06:34:37
/*globalfifo读函数*/
static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t count,
loff_t *ppos)
{
int ret;
struct globalfifo_dev *dev = filp->private_data;
DECLARE_WAITQUEUE(wait, current);

down(&dev->sem); /* 获得信号量 */
add_wait_queue(&dev->r_wait, &wait); /* 进入读等待队列头 */

/* 等待FIFO非空 */
if (dev->current_len == 0) {
if (filp->f_flags &O_NONBLOCK) {
ret = - EAGAIN;
goto out;
}
__set_current_state(TASK_INTERRUPTIBLE); /* 改变进程状态为睡眠 */
up(&dev->sem);

schedule(); /* 调度其他进程执行 */



上面的代码通过调用schedule函数使当前进程进入休眠,其他进程里面通过wake_up函数可以唤醒,wake_up为什么能唤醒它呢?不是说进程只有TASK_RUNNING状态才能重新被调度么?这个进程前面通过__set_current_state(TASK_INTERRUPTIBLE)将本进程设置成了TASK_INTERRUPTIBLE,应该调度不了啊?
...全文
221 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 Idle_Cloud 的回复:
算了,你还是就暂时这样记住吧,现在贴上来你可能也不理解。
锅,你是对的,结贴
  • 打赏
  • 举报
回复
引用 1 楼 Idle_Cloud 的回复:
把本进程设置成TASK_INTERRUPTIBLE,就是不希望本进程被调度,等待wake_up, 在wake_up前都不会被调度。因为wake_up前等待的条件都不会成熟,所以不需要进程再次被调度了。所以要改变状态。wake_up的时候状态会改成running的,别担心。
wake_up这个函数会设置TASK_RUNNING么?好像没有吧
  • 打赏
  • 举报
回复
引用 5 楼 Idle_Cloud 的回复:
算了,你还是就暂时这样记住吧,现在贴上来你可能也不理解。
引用 5 楼 Idle_Cloud 的回复:
算了,你还是就暂时这样记住吧,现在贴上来你可能也不理解。
我能理解的,就贴下吧,谢谢 还有就是我贴的代码后面为什么他还有设置为running状态的呢?如果wake_up会设置,那我贴的这个代码的后面应该就不用在设置了啊???
Carl_CCC 2013-08-19
  • 打赏
  • 举报
回复
把本进程设置成TASK_INTERRUPTIBLE,就是不希望本进程被调度,等待wake_up, 在wake_up前都不会被调度。因为wake_up前等待的条件都不会成熟,所以不需要进程再次被调度了。所以要改变状态。wake_up的时候状态会改成running的,别担心。
Carl_CCC 2013-08-19
  • 打赏
  • 举报
回复
算了,你还是就暂时这样记住吧,现在贴上来你可能也不理解。
  • 打赏
  • 举报
回复
引用 3 楼 Idle_Cloud 的回复:
我是看了源代码的,wake_up肯定会的。
1.那为什么我贴的代码后面还有设置状态为runinig的,这里没贴 2.能不能贴下wake_up里面设置running状态的? 谢谢!!
Carl_CCC 2013-08-19
  • 打赏
  • 举报
回复
我是看了源代码的,wake_up肯定会的。

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧