您的位置:首页 > 大数据 > 人工智能

http://www.bubuko.com/infodetail-425054.html try_to_wake_up()

2015-10-04 15:26 591 查看
先介绍一个非常基础的函数: 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()函数将其加入到等待队列之中。

try_to_wake_up()、default_wake_function()、autoremove_wake_function()函数详解

标签唤醒进程的处理函数wait_queue_func_t
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: