wake_up()函数集合
唤醒等待队列中的等待进程的函数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()函数集合相关推荐
- R语言setdiff函数集合作差运算实战
R语言setdiff函数集合作差运算实战 目录 R语言setdiff函数集合作差运算实战 #基本语法 #setdiff函数用于数值向量
- 简洁明了——STL容器库之set头文件常用函数集合
简介: 1.同vector封装数组,list封装链表一样,set和map封装了二叉树(红黑树,性能优于平衡二叉树) 2.有序且去重 3.插入.删除.查找效率高(二叉树) 4.插入or删除后迭代器仍有效 ...
- SQL Server日期函数集合
SQL Server日期函数集合--1:获取系统日期和时间值函数 --getdate() SELECT GETDATE() AS 'today' --getutcdate() SELECT GETUT ...
- java反射的工具类的函数集合
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- php打印出函数的内容吗,PHP打印函数集合详解以及PHP打印函数对比详解(精)
1 echo();2 print();3 die();4 printf();5 sprintf();6 print_r();7 var_dump(); 1 echo() 可以同时输出多个字符串,可以多 ...
- oracle 时间集合,oracle 日期函数集合(集中版本)第2/2页
oracle 日期函数集合(集中版本)第2/2页 更新时间:2009年06月16日 23:45:55 作者: oracle 日期函数网上已经有了不少,特我们跟集中一下,免得大家麻烦. 一. 常用日 ...
- matlab中的mkdir函数_matlab所有函数集合
matlab所有函数集合 更新时间:2017-2-10 14:33:00 浏览量:568 手机版 一.常用命令 1.常用命令-->管理命令和函数 addpath 添加目录到MATLAB 搜索 ...
- 怎么用计算机求浮动额,计算机一级题库中Excel曾出现的所有函数集合
原标题:计算机一级题库中Excel曾出现的所有函数集合 进入正题之前,提一个小细节. 值得注意的是,当我们在Excel里输入函数的时候,最好还是切换成英文状态下去输入,不管输入的是括号.引号还是逗号这 ...
- PHP函数集合-一揽子方案
/** PHP函数集合 * 1输出1-10000000以内的所有质数. * 2展示出一个目录下面所有的文件 * 3统计出一个文件夹下面目录的数量和文件的数量 引用传值 ...
最新文章
- 关于JS中switch语句的判断条件!
- python 同时给多个变量赋值
- 数学建模——层次分析法Python代码
- 树莓派做无线打印服务器,亲测可用 树莓派打造无线共享打印机
- Android Jetpack组件之数据库Room详解(二)
- 06-CABasicAnimation基础核心动画
- moodle 用户 权限_用户和社区反馈如何驱动Moodle
- 文本居于图片左侧html,CSS实现图片与文本的居中对齐的常见方式
- php 高德地图创建标注,高德地图 JS API的覆盖物—编辑矢量图形
- BOW和LSH的一点理解
- 5G 协议 标准 下载
- 羡慕别人表格做的快?6个Excel小技巧+25个Excel快捷键!收藏没错
- 键盘驱动出现黄色感叹号解决方法
- python lambda拉姆达表达式
- ReportingService报表入门
- 1|homework
- 【方向盘】使用IDEA的60+个快捷键分享给你,权为了提效(操作系统、终端篇)
- docker exec -it进入及退出容器
- 计算机开机硬件检查,开机bios检测硬件信息方法
- 外部电源和锂电池自动切换电路