wait_event_interruptible_timeout
最近一套方案涉及到内核线程之间的同步,用到了函数wait_event_interruptible_timeout函数,大致是这样:
A:是一个后台的线程,平常没事就睡觉,有时被唤醒,或者每5分钟醒一次看看;
B:普通线程,负责唤醒后台的线程让它干活!
此处唤醒的操作使用到的函数是wake_up,然后进程A使用wait_event_interruptible_timeout让自己睡觉。下面详细分析其中的机制:
wait_event_interruptible_timeout: sleep util a condition get true or a timeout elapses
记得以前看侯捷老师那本MFC架构分析时,最吸引人的概念是事件触发模型,事件触发模型很好理解,但是AA事件发生了,那么BB事件就应该发生,在我们这个例子里就是B普通线程发生了,那么就让A发生!
具体是怎么实现的?
1)wait_event_interruptible_timeout是把调用这个函数的进程链入到一个list中,并且
最重要的结构体是wait_queue_head_t,这个结构体包含两个成员变量:spin_lock lock 和 struct list_head task_list
可知这个结构体的目的其实也是比较简单的:就是把一个进程插入到一个队列中去!
函数层层递进,其实调用的是 wait_event 函数,这个函数其实就是一个死循环:
schedule_timeout是什么意思。不断地把函数添加到wait_queue_head_t->task_list中去,然后调用schedule_timeout调度,这个schedule_timeout是什么意思?就是不断地调度出去,但是这个线程目前在两个地方存在,一个是内核的调度队列,一个是等待队列的链表中。那么问题来了,在这里一般问题是说[可中断的等待,不可中断的等待]有什么区别?
在非可中断的情况下,是怎么实现的事件触发,其实也是不断地去检查condition是否成立,那么这个检查的时间粒度肯定是比较低的。到底是多少?
在timeout之间的位置,怎么识别事件是否到来!
uninterruptible状态是指:uninterruptible的线程只能通过wake_up的方式【uninterruptible也是在schedule的视野范围之内!只是调度其肯定不会选你就对了】
调度器
wait_event_interruptible_timeout的更多相关文章
- linux内核--wait_event_interruptible_timeout()函数分析(转)
原文:https://blog.csdn.net/wuyongpeng0912/article/details/45723657 网上有关于此函数的分析,但大都是同一篇文章转载来转载去,没有进一步的分 ...
- linux内核中的wait_event_interruptible_timeout接口解析
1. 原型 #define wait_event_interruptible_timeout(wq_head, condition, timeout) \ ({ \ long __ret = time ...
- insmod过程详解【转】
转自:http://blog.csdn.net/chrovery/article/details/51088425 转自 http://blog.chinaunix.net/xmlrpc.php?r= ...
- I2C
1.I2C协议个. 2.1 I2CADR 地址寄存器CPU也可以是I2C的Slave,CPU的I2C地址有 I2CADR指定 2.2 I2CFDR 频率设置寄存器The serial bit cloc ...
- 【Linux驱动】内核等待队列
在Linux中, 一个等待队列由一个"等待队列头"来管理,等待队列是双向链表结构. 应用场合:将等待同一资源的进程挂在同一个等待队列中. 数据结构 在include/linux/w ...
- Linux Module
catalog . 概述 . 使用模块 . 插入和删除模块 . 自动化与热插拔 . 版本控制 1. 概述 模块(module)是一种向Linux内核添加设备驱动程序.文件系统及其他组件的有效方法,而无 ...
- I/O多路复用 SELECT POLL -- 内核实现
等待队列 先补充个基础知识――等待队列 认识 定义 wait_queue_head_t wait_queue; 初始化 init_waitqueue_head(&wait_queue); 等待 ...
- FL2440驱动添加(5)ADC驱动学习笔记
由图可知,模拟ADC分为两部分功能,一部分是触屏功能,另一部分就是普通ADC功能.分别可以产生INT_TC和INT_ADC 两个中断.该ADC模块总共有8个通道可以进行模拟信号的输入,分别是AIN0. ...
- FL2440驱动添加(4)LED 驱动添加
硬件信息:FL2440板子,s3c2440CPU带四个LED,分别在链接GPB5,GPB6,GPB8,GPB10 内核版本:linux-3.8.0 led驱动代码如下: 值得注意地方地方: 1,定时器 ...
随机推荐
- 安装Chrome插件
重装系统后重装了Chrome浏览器,想着将自己的东西同步到Chrome上.但是登录谷歌账号要FQ,我又是靠setup插件FQ,但插件又要靠账号同步到本地.形成了死循环. 其实重装系统前我将插件提取了, ...
- MySql Connector/c++8中JSON处理Demo
#include <iostream> #include <vector> #include <mysqlx/xdevapi.h> using std::cout; ...
- Git基本使用及工具
好久没用git管理代码了,最近忙着要实习,一直在看面试题,后天入职了,就提前再复习一下git吧. git比较方便的两个网站,如果你想逼格高就用GitHub(https://github.com/),如 ...
- vue 中父子组件之间的交互
1,最直接的也是最简单的方法是利用props来数据传值. 子组件定义如下: props: { iconClass: { type: String, required: true }, classNam ...
- laravel -- 路由
基本路由 Route::get('/get',function (){ return "this is get"; }); Route::post('/post',function ...
- unity独立游戏开发日记2018/09/27
今天优化了下昨天的代码,并且添加了树木和其他资源的生成.还修复了接近石头后,挖掘图标不出现的bug.目前可以在unity中稳定60-70fps. 详看文章:https://www.cnblogs.co ...
- Python爬虫爬取豆瓣电影之数据提取值xpath和lxml模块
工具:Python 3.6.5.PyCharm开发工具.Windows 10 操作系统.谷歌浏览器 目的:爬取豆瓣电影排行榜中电影的title.链接地址.图片.评价人数.评分等 网址:https:// ...
- c#vs连接SQL sever数据库入门操作
对于需要连接数据库的项目,可以参考的简单初级代码.实现打开数据库,读入数据功能 using System; using System.Collections.Generic; using System ...
- SQL Server中2008及以上 ldf 文件过大的解决方法
在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为“自动收缩”外,还可以使用下面的SQL命令进行快速清除数据库中的事务日志,命令如下: - 第一步:清空日志 ALTER DAT ...
- (转) Sqoop使用实例讲解
原博客地址:http://blog.csdn.net/evankaka 摘要:本文主要讲了笔者在使用sqoop过程中的一些实例 一.概述与基本原理 Apache Sqoop(SQL-to-Hadoop ...