+ -
当前位置:首页 → 问答吧 → 任务等待操作sleep_on

任务等待操作sleep_on

时间:2010-09-07

来源:互联网

本帖最后由 nathan10 于 2010-09-07 11:49 编辑
  1. static inline void __sleep_on(struct task_struct **p, int state)
  2. {
  3.         struct task_struct *tmp;
  4.         unsigned int flags;

  5.         if (!p)
  6.                 return;
  7.         if (current == &(init_task.task))
  8.                 panic("task[0] trying to sleep");
  9.         __asm__("pushfl ; popl %0":"=r" (flags));
  10.         tmp = *p;
  11.         *p = current;
  12.         current->state = state;
  13. /* make sure interrupts are enabled: there should be no more races here */
  14.         sti();
  15. repeat:        schedule();
  16.         if (*p && *p != current) {
  17.                 current->state = TASK_UNINTERRUPTIBLE;
  18.                 (**p).state = 0;
  19.                 goto repeat;
  20.         }
  21.         if (*p = tmp)
  22.                 tmp->state=0;
  23.         __asm__("pushl %0 ; popfl"::"r" (flags));
  24. }
复制代码
上述代码repeat位置执行任务调度schedule()后,为何一定在当前这个等待任务*P被唤醒以后,调度程序才返回这里,并继续向下执行?这里我遗漏了什么吗?
百思不得其解。。。请教,谢谢

作者: nathan10   发布时间: 2010-09-07

因为这里是让进程睡眠... 等待某个特定的事件...有TASK_INTERRUPTABLE和TASK_UNINTERRUPTABLE两种睡眠方式...
    在这个函数里. 将进程状态改变为这两个之一之后再执行schedule()函数就会重新调度...
    而在调度进程的时候... 会将状态为TASK_INTERRUPTABLE且有pending信号到来的进程状态改为
  TASK_RUNNING... 然后再计算所有处于TASK_RUNNING的goodness...最后选择一个进程运行...
   所以要这个进程被唤醒之后... 且! 被调度运行... 才能返回到repeat标号处...
   
   为何回到这里...就是进程切换的问题啦... 总之会保持进程执行的连续性...

作者: PCliangtao   发布时间: 2010-09-07

热门下载

更多