set_current_state

set_current_state(TASK_INTERRUPTIBLE) 简介 进程状态

进程状态定义:include/linux/sched.h

set_current_state_第1张图片

TASK_RUNNING : 进程处于可运行状态,但并不意味着进程已经实际上已分配到 CPU ,它可能会一直等到调度器选中它。该状态只是确保进程一旦被 CPU 选中时立马可以运行,而无需等待外部事件。

TASK_INTERRUPTIBLE : 这是针对等待某事件或其他资源而睡眠的进程设置的。在内核发送信号给该进程时表明等待的事件已经发生或资源已经可用,进程状态变为 TASK_RUNNING,此时只要被调度器选中就立即可恢复运行。

TASK_UNINTERRUPTIBLE : 处于此状态,不能由外部信号唤醒,只能由内核亲自唤醒。

TASK_STOPPED : 表示进程特意停止运行。比如在调试程序时,进程被调试器暂停下来。

TASK_TRACED : 本来不属于进程状态,用于从停止的进程中,将当前被调试的那些进程与常规进程区分开来。

下面常量既可以用于 struct task_struct 的进程状态字段,也可以用于 exit_state 字段(该字段明确的用于退出进程):

EXIT_ZOMBIE 僵尸状态

EXIT_DEAD : 处于该状态, 表示 wait 系统调用已经发出,而进程完全从系统移除之前的状态。只有多个线程对同一个进程发出 wait 调用时,该状态才有意义(为了防止其他执行线程在同一个进程也执行wait()类系统调用,而把进程的状态由僵死状态(EXIT_ZOMBIE)改为撤销状态(EXIT_DEAD)。)。


set_current_state() 的使用

在驱动程序中,进程睡眠往往通过 3 个步骤进行:
1. 将进程加入等待队列中。
2. 然后使用 set_current_state() 来设置进程的状态,设置的状态为 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUTIBLE 。
3. 上面的设置完后,我们就要放弃处理器了。但在放弃处理器之前,还有一件重要的事情需要做:检查睡眠等待的条件。如果不检查,如果此时条件正好变为真,那么就漏掉了继续运行的机会,从而会睡眠更长的时间。就好比如,你在等一辆车,你觉得车还没来,你很困并就打算先睡一会儿,此时有一辆车刚好过来了,你睡眼朦胧的并没打算睁开眼睛去看一下,结果得花更长的时间来等下一趟。所以,一般在睡前需要类似的动作:

set_current_state(TASK_UNINTERRUPTIBLE);
if (do_i_need_to_sleep())
      schedule();


你可能感兴趣的:(Linux)