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

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

    

时间: 2024-10-15 15:18:30

try_to_wake_up()、default_wake_function()、autoremove_wake_function()函数详解的相关文章

php socket函数详解

转自:http://blog.163.com/[email protected]/blog/static/2889641420138213514298/ 最近在用socket实现服务端向客户端主动推送消息函数名 描述socket_accept() 接受一个Socket连接socket_bind() 把socket绑定在一个IP地址和端口上socket_clear_error() 清除socket的错误或最后的错误代码socket_close() 关闭一个socket资源socket_connec

delphi中的Format函数详解

首先看它的声明:[[email protected]][@21ki!] function Format(const Format: string; const Args: array of const): string; overload;[[email protected]][@21ki!] 事实上Format方法有两种形式,另外一种是三个参数的,主要区别在于它是线程安全的,[[email protected]][@21ki!]但并不多用,所以这里只对第一个介绍:[[email protect

c++ 虚函数详解

下面是对C++的虚函数的理解. 一,定义 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 classA { publi

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

linux中fork()函数详解[zz]

转载自:http://www.cnblogs.com/york-hust/archive/2012/11/23/2784534.html 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有

Python内置函数详解

置顶   内置函数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii 此文参考了别人整理好的东西(地址:http://www.cnblogs.com/sesshoumaru/p/6140987.html#p1),然后结合自己的理解,写下来,一方面方便自己,让自己好好学习,顺便回忆回忆:另一方面,让喜欢的盆友也参考一下. 经查询,3.6版本总共有68个内置函数,主要分类如下: 数学运算(7个) 类型转换

【转载】3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解

原文:3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解 3D中z值会影响屏幕坐标系到世界坐标系之间的转换,2D中Z值不会产生影响(而只是屏幕宽高比会产生影响,z值只对深度剔除产生影响).所以U3D中如果用2D摄像机那么屏幕坐标和世界坐标之间的转换需要用指定的2D摄像机才行,如果用主3D摄像机那么UI转换会产生计算结果异常. 一.D3DXMatrixPerspectiveFovLH函数 作用:Builds a left-handed

CreateFile函数详解

CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns a handle that can be used to accessthe object: files pipes mailslots communications resources disk devices(Windows NT only) consoles directories(open

Android总结篇系列:Activity中几个主要函数详解

专注Android领域开发. 仰望星空,同时需要脚踏实地. ——好记性不如烂博客 Android总结篇系列:Activity中几个主要函数详解 Activity作为Android系统中四大基本组件之一,包含大量的与其他的各大组件.intent.widget以及系统各项服务等之间的交互的函数.在此,本文主要选取实际项目开发中常用的,但完全理解又需要有一定深入了解的几个函数进行讲解,后续本文会根据需要不断更新. 1. startActivityForResult / onActivityResult