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,定时器 ...
随机推荐
- HDU1159(LCS)
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...
- Python常用的数据类型
Python常用的数据类型有很多,今天暂时介绍这三种,int(整数类型).str(字符串).bool(布尔类型)一.int(整数类型)1.不带小数的,integer 的缩写,常用于数据的计算或者大小的 ...
- CSS3--j惊艳到你的新前端
一.css3的选择器 1. 父子选择器 直接关系 .box>.com 2. 兄弟选择器 相邻关系 .box+.com <span>hello</span> <p&g ...
- 【cisco下针对冗余链路故障备份的处理措施】
对于中小型的网络中,为了流量的分担,可制定负载均衡方案,但往往带来的是链路的冗余.导致多条物理线路不能够最大的发挥其作用:冗余链路随可避免环路,但在实际的网络中还是存在一些需要完善的地方: 假设有一组 ...
- z-blog博客组插件openSug.js百度搜索下拉框提示代码
z-blog安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让z-blog搜索更便捷! https://www.opensug.org/.../opensug_z-blog_v1.0 ...
- Python基本图形绘制
turtle的一个画布空间最小单位是像素 turtle的绘制窗体:turtle.stup(width,heigth,startx,starty) 四个参数中后两个可选 turtle空间坐标体系:tur ...
- Leecode刷题之旅-C语言/python-28.实现strstr()
/* * @lc app=leetcode.cn id=28 lang=c * * [28] 实现strStr() * * https://leetcode-cn.com/problems/imple ...
- 自定义vim配置文件vimrc,用于c/c++编程
vim作为Linux下广受赞誉的代码编辑器,其独特的纯命令行操作模式可以很大程度上方便编程工作,通过自定义vim配置文件可以实现对vim功能的个性化设置. vim配置文件一般有两份,属于root的/e ...
- Linux中的目录功能(Red Hat 7)
目录的基本功能: /bin:存放普通用户使用的命令 /sbin:存放管理员可以执行的命令 /home:存放普通的家目录 如张三家目录为/home/zhangsan /root:管理员的家目录 /etc ...
- TensorFlow深层神经网络常用方法
深度学习所示深层神经网络的代名词,重要特性:多层.非线性. 若只通过线性变换,任意层的神经网络模型与单层神经网络模型的表达能力没有任何区别,这是线性模型的局限性.对于线性可分的问题中,线性模型可解决, ...