唤醒等待队列中的等待进程的函数wake_up()函数的核心实现函数是__wake_up_common()函数。

   __wake_up_common(wait_queue_head_t *q, int mode,

          int nr_exclusive, int wake_flags, void *key)

  参数介绍:

           q   : 是等待队列头;

           mode: 是进程的状态模式 

                 其取值为: TASK_INTERRUPTIBLE, TASK_UNITERRUPTIBLE

           nr_exclusive:是 number exclusive;

           wake_flags  : 是同步唤醒sync,还是异步唤醒 async;

           key : 一般为NULL;


static void __wake_up_common(wait_queue_head_t *q, int mode,

              int nr_exclusive, int wake_flags, void *key)

 {

     wait_queue_t *curr, *next;

     list_for_each_entry_safe(curr, next, &q->task_list, task_list)

     {

         unsigned int flags = curr->flags;

         if( curr->func(curr, mode, wake_flags, key) &&

            (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive )

               break;

     }

 }   

解读一下 __wake_up_common()函数:

     list_for_each_entry_safe()函数用于遍历等待队列中的数据项,并且在curr中存放当前的wait_queue_t项的地址;

     curr->func()是用来唤醒等待队列中的进程的实现函数;

 curr->func = autoremove_wake_function() 或 default_wake_function

其实autoremove_wake_function()与default_wake_function()函数的本质上是相同的,他们最终是在调用try_to_wake_up()函数的。

 try_to_wake_up()函数是从等待队列中移走一个进程,然后将其放入到就绪队列中等待调度器schedule()的调度。

    所以curr->func()函数的作用就是从等待队列中移走进程,将其放到就绪队列中,达到实现进程唤醒的目的。

    __wake_up_common()函数是每次唤醒所有的等待进程,还是只唤醒一个,还是唤醒N个。这取决于 nr_exclusive 参数

     当 nr_exclusive = 0时,__wake_up_common()每次唤醒所有的等待进程。

     当 nr_exclusive = 1时,并且等待队列中的等待进程时互斥等待唤醒进程,则__wake_up_common()每次只唤醒一个等待进程。

     当 nr_exclusive = N时,__wake_up_common()每次唤醒N个等待进程或者N-1个非互斥等待进程与1个互斥等待进程;

   __wake_up()函数的实现:

void __wake_up(wait_queue_head_t *q, unsigned int mode,

               int nr_exclusive, void *key)

{

    unsigned int flags;

    spin_lock_irqsave(&p->lock,flags);

    __wake_up_common(q,mode,nr_exclusive,0,key);

    spin_unlock_irqstore(&p->lock, flags);

}

  wake_up()函数的实现:

#define wake_up(wq)  __wake_up(wq, TASK_NORMAL, 1,NULL)

#define wake_up_nr(wq,nr) __wake_up(wq, TASK_NORMAL,nr, NULL)

#define wake_up_all(wq) __wake_up(wq, TASK_NORMAL, 0, NULL)


#define wake_up_interruptible(wq)  \

          __wake_up(wq,TASK_INTERRUPTIBLE,1,NULL)


#define wake_up_interruptible_nr(wq,nr) \

          __wake_up(wq, TASK_INTERRUPTIBLE,nr,NULL)


#define wake_up_interruptible_all(wq) \

          __wake_up(wq, TASK_INTERRUPTIBLE,0,NULL)


 

转载于:https://blog.51cto.com/weiguozhihui/1566980

wake_up()函数集合相关推荐

  1. R语言setdiff函数集合作差运算实战

    R语言setdiff函数集合作差运算实战 目录 R语言setdiff函数集合作差运算实战 #基本语法 #setdiff函数用于数值向量

  2. 简洁明了——STL容器库之set头文件常用函数集合

    简介: 1.同vector封装数组,list封装链表一样,set和map封装了二叉树(红黑树,性能优于平衡二叉树) 2.有序且去重 3.插入.删除.查找效率高(二叉树) 4.插入or删除后迭代器仍有效 ...

  3. SQL Server日期函数集合

    SQL Server日期函数集合--1:获取系统日期和时间值函数 --getdate() SELECT GETDATE() AS 'today' --getutcdate() SELECT GETUT ...

  4. java反射的工具类的函数集合

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...

  5. php打印出函数的内容吗,PHP打印函数集合详解以及PHP打印函数对比详解(精)

    1 echo();2 print();3 die();4 printf();5 sprintf();6 print_r();7 var_dump(); 1 echo() 可以同时输出多个字符串,可以多 ...

  6. oracle 时间集合,oracle 日期函数集合(集中版本)第2/2页

    oracle 日期函数集合(集中版本)第2/2页 更新时间:2009年06月16日 23:45:55   作者: oracle 日期函数网上已经有了不少,特我们跟集中一下,免得大家麻烦. 一. 常用日 ...

  7. matlab中的mkdir函数_matlab所有函数集合

    matlab所有函数集合 更新时间:2017-2-10 14:33:00  浏览量:568  手机版 一.常用命令 1.常用命令-->管理命令和函数 addpath 添加目录到MATLAB 搜索 ...

  8. 怎么用计算机求浮动额,计算机一级题库中Excel曾出现的所有函数集合

    原标题:计算机一级题库中Excel曾出现的所有函数集合 进入正题之前,提一个小细节. 值得注意的是,当我们在Excel里输入函数的时候,最好还是切换成英文状态下去输入,不管输入的是括号.引号还是逗号这 ...

  9. PHP函数集合-一揽子方案

    /** PHP函数集合     * 1输出1-10000000以内的所有质数.     * 2展示出一个目录下面所有的文件     * 3统计出一个文件夹下面目录的数量和文件的数量 引用传值     ...

最新文章

  1. jQuery.fn和jQuery.prototype区别。
  2. 工具栏对象GUI Status 与GUI Title
  3. Elasticsearch2.x Cluster Health
  4. mongodb 服务器时区设置_关于MongoDB-Balancer设置时间窗口的问题
  5. php多主写数据,多数据库的配置(从主)
  6. 每日程序C语言19-求阶乘的前20项和
  7. 了解SQL Server中的GUID数据类型
  8. 洛谷 P1144 最短路计数 解题报告
  9. java 邮件发送 多人_java 发送邮件(可发送多人,抄送多人,可带附件)
  10. pdf转word工具大全
  11. 记录学习使用vue2.0请求qq音乐歌手数据
  12. IDEA 之搭建spring-boot maven报错Project ‘org.springframework.boot:spring-boot-starter-parent:2.2.0.RELEAS
  13. 期货开户公司行情资讯及时高效
  14. RK3399平台开发系列讲解(内核设备树篇)3.25、WIFI设备树的解析
  15. ajax获取的数据中包含html代码,执行ajax返回数据中包含的script脚本代码
  16. 298本R语言书籍免费送!!!
  17. suricata 命令
  18. github ip映射
  19. Unable to load class ‘org.gradle.api.internal.plugins.DefaultConvention‘
  20. java 自动发货_徐子曰《徐子曰:讲给孩子的中国历史第一季》

热门文章

  1. chatGPT与软件测试
  2. php怎么定义浮点型,php:浮点型(float)数据类型实例详解
  3. 技嘉B360M AORUS PRO i5-9400F电脑 Hackintosh 黑苹果efi引导文件
  4. Jmeter书中不会教你的(38)——快递时效查询8用户自定义变量User Defined Variables
  5. 二叉树的建立和三种遍历
  6. 解决使用mybatis-plus时,生成的SQL大写变小写加下划线
  7. 随机森林的几个重要参数
  8. 抖音上用记事本写“爱心”小程序教程
  9. 简谈对ES7的async和await的理解
  10. 从零开始之驱动发开、linux驱动(六十三、内核调试篇--基础知识1[earlyprintk建立过程])