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