最近一套方案涉及到内核线程之间的同步,用到了函数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的更多相关文章

  1. linux内核--wait_event_interruptible_timeout()函数分析(转)

    原文:https://blog.csdn.net/wuyongpeng0912/article/details/45723657 网上有关于此函数的分析,但大都是同一篇文章转载来转载去,没有进一步的分 ...

  2. linux内核中的wait_event_interruptible_timeout接口解析

    1. 原型 #define wait_event_interruptible_timeout(wq_head, condition, timeout) \ ({ \ long __ret = time ...

  3. insmod过程详解【转】

    转自:http://blog.csdn.net/chrovery/article/details/51088425 转自 http://blog.chinaunix.net/xmlrpc.php?r= ...

  4. I2C

    1.I2C协议个. 2.1 I2CADR 地址寄存器CPU也可以是I2C的Slave,CPU的I2C地址有 I2CADR指定 2.2 I2CFDR 频率设置寄存器The serial bit cloc ...

  5. 【Linux驱动】内核等待队列

    在Linux中, 一个等待队列由一个"等待队列头"来管理,等待队列是双向链表结构. 应用场合:将等待同一资源的进程挂在同一个等待队列中. 数据结构 在include/linux/w ...

  6. Linux Module

    catalog . 概述 . 使用模块 . 插入和删除模块 . 自动化与热插拔 . 版本控制 1. 概述 模块(module)是一种向Linux内核添加设备驱动程序.文件系统及其他组件的有效方法,而无 ...

  7. I/O多路复用 SELECT POLL -- 内核实现

    等待队列 先补充个基础知识――等待队列 认识 定义 wait_queue_head_t wait_queue; 初始化 init_waitqueue_head(&wait_queue); 等待 ...

  8. FL2440驱动添加(5)ADC驱动学习笔记

    由图可知,模拟ADC分为两部分功能,一部分是触屏功能,另一部分就是普通ADC功能.分别可以产生INT_TC和INT_ADC 两个中断.该ADC模块总共有8个通道可以进行模拟信号的输入,分别是AIN0. ...

  9. FL2440驱动添加(4)LED 驱动添加

    硬件信息:FL2440板子,s3c2440CPU带四个LED,分别在链接GPB5,GPB6,GPB8,GPB10 内核版本:linux-3.8.0 led驱动代码如下: 值得注意地方地方: 1,定时器 ...

随机推荐

  1. SAP物料主数据的屏幕字段控制,必输,隐藏

    http://www.cnblogs.com/275147378abc/p/5699077.html 1.事务码MM01,把物料组设为选填字段. 2.找到物料组的屏幕字段. 3.在后台根据屏幕字段找到 ...

  2. eventlet详解

    正真工作才发现很懒,没这么多时间写文,毕竟小白,参照大神写的,不喜勿喷 1.eventlet是什么eventlet - 具有WSGI支持的异步框架eventlet是python库函数,一个是处理和网络 ...

  3. linux下进程的最大线程数、进程最大数、进程打开的文件数

    linux下进程的最大线程数.进程最大数.进程打开的文件数   ===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_TH ...

  4. SQL中EXCEPT函数在 Mysql 和 sqlServer 中的替代方法

    示例摘自:极客代码:http://wiki.jikexueyuan.com/project/sql/useful-functions/except-clause.html EXCEPT 子句 EXCE ...

  5. 【linux运维递进】

    ================================云计算和虚拟化=================================== docker openstack svn git ...

  6. 前端pc版的简单适配

    我们都知道对于前端pc版本的适配是一个难题,大部分都是做的媒体查询.但是有时间公司不要媒体查询 就是需要不管多大的屏幕都是满屏显示.我就在考虑为啥不用rem给pc端做个适配. 我是基于设计图是1920 ...

  7. 【坑】记录一个docker 1.13.1 build 07f3374 版本的坑

    在自家的开发环境中,一般都是直接yum安装最新的docker来做镜像和容器,没有仔细深究,一直相安无事.但这几天却发现一个惊悚的现象,新申请的两台虚机,一台安装好后正常,另一台却出现异常: docke ...

  8. NAND Flash结构及驱动函数

    目标:以NAND Flash K9F2G08U0M为例介绍其结构及其驱动程序的书写 1. 结构 由芯片手册中的图可知:K9F2G08U0M大小为2112Mbits(即 256MB = 2Gb ) 共有 ...

  9. 对URI的理解

    在了解RESTful api的设计规范的时候,遇到了一个问题,就是uri和url有什关系,有什么区别,所以就在这里记录一下. URI(Uniform Resource Identifier),统一资源 ...

  10. 人人都会设计模式:观察者模式--Observer

    https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...