先介绍一个非常基础的函数: try_to_wake_up()
此函数的作用是:从等待队列中唤醒一个进程,让后将其放到就绪队列中。
static int try_to_wake_up(struct task_struct *p, int state,
int wake_flags)
参数的含义:p : 表示的是将要被唤醒的进程;
state : 可以被唤醒的进程的状态掩码;
wake_flags : 同步唤醒还是异步唤醒;
try_to_wake_up()返回失败值,如果p进程本身已经是active状态的话。
成功返回 1;失败返回 0;
等待队列中的等待进程的默认唤醒函数:default_wake_function()
int default_wake_function(wait_queue_t *curr, unsigned int mode,
int wake_flags, void *key)
{
return try_to_wake_up(curr->private, mode, wake_flags);
}
EXPORT_SYMBOL(default_wake_function);
可以看出,default_wake_function()本质上也是对 try_to_wake_up()函数的封装。
int autoremove_wake_function(wait_queue_t *wait,
unsigned int mode, int sync, void *key)
{
int ret;
ret = default_wake_function(wait, mode, sync, key);//从等待队列
中找到满足条件的等待进程;
if(ret)
list_del_init(&wait->task_list); // 将满足条件的等待进程从等待
队列中删除;
return ret;
}
从以上的几个函数可以总结出linux内核中对进程的状态的处理过程:
当一个正在运行的进程需要被阻塞时,调用 set_curent_state()或者__set_current_state()函数来改变一个进程的状态,然后通过init_wait()来分配一个wait_queue_t结构体,并将其一当前进程进行挂钩,最后通过add_wait_queue()函数或者add_wait_queue_exclusive()函数将其加入到等待队列之中。