linux Tasklets 机制
tasklet 类似内核定时器在某些方面. 它们一直在中断时间运行, 它们一直运行在调度它 们的同一个 CPU 上, 并且它们接收一个 unsigned long 参数. 不象内核定时器, 但是, 你无法请求在一个指定的时间执行函数. 通过调度一个 tasklet, 你简单地请求它在以后 的一个由内核选择的时间执行. 这个行为对于中断处理特别有用, 那里硬件中断必须被尽 快处理, 但是大部分的时间管理可以安全地延后到以后的时间. 实际上, 一个 tasket, 就象一个内核定时器, 在一个"软中断"的上下文中执行(以原子模式), 在使能硬件中断时 执行异步任务的一个内核机制.
一个 tasklet 存在为一个时间结构, 它必须在使用前被初始化. 初始化能够通过调用一 个特定函数或者通过使用某些宏定义声明结构:
#include <linux/interrupt.h> struct tasklet_struct {
/* ... */
void (*func)(unsigned long); unsigned long data;
};
void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data);
DECLARE_TASKLET(name, func, data); DECLARE_TASKLET_DISABLED(name, func, data);
tasklet 提供了许多有趣的特色:
- 一个 tasklet 能够被禁止并且之后被重新使能; 它不会执行直到它被使能与被禁 止相同的的次数.
- 如同定时器, 一个 tasklet 可以注册它自己.
- 一个 tasklet 能被调度来执行以正常的优先级或者高优先级. 后一组一直是首先
执行. - taslet 可能立刻运行, 如果系统不在重载下, 但是从不会晚于下一个时钟嘀哒.
- 一个 tasklet 可能和其他 tasklet 并发, 但是对它自己是严格地串行的 -- 同样 的 tasklet 从不同时运行在超过一个处理器上. 同样, 如已经提到的, 一个
tasklet 常常在调度它的同一个 CPU 上运行.
- 一个 tasklet 可能和其他 tasklet 并发, 但是对它自己是严格地串行的 -- 同样 的 tasklet 从不同时运行在超过一个处理器上. 同样, 如已经提到的, 一个
- 一个 tasklet 能被调度来执行以正常的优先级或者高优先级. 后一组一直是首先
jit 模块包括 2 个文件,
/proc/jitasklet 和 /proc/jitasklethi, 它返回和在"内核定 时器"一节中介绍过的
/proc/jitimer 同样的数据. 当你读其中一个文件时, 你取回一个 header 和 sixdata 行. 第一个数据行描述了调用进程的上下文, 并且其他的行描述了一
个 tasklet 过程连续运行的上下文. 这是一个在编译一个内核时的运行例子:
phon% cat /proc/jitasklet
time delta inirq pid cpu command
|
6076139 |
0 |
0 |
4370 |
0 cat |
|
6076140 |
1 |
1 |
4368 |
0 cc1 |
|
6076141 |
1 |
1 |
4368 |
0 cc1 |
|
6076141 |
0 |
1 |
2 |
ksoftirqd/0 |
|
6076141 |
0 |
1 |
2 |
ksoftirqd/0 |
|
6076141 |
0 |
1 |
2 |
ksoftirqd/0 |
如同由上面数据所确定的,
tasklet 在下一个时间嘀哒内运行只要 CPU 在忙于运行一个 进程, 但是它立刻被运行当 CPU 处于空闲. 内核提供了一套 ksoftirqd 内核线程,
每个 CPU 一个, 只是来运行 "软件中断" 处理, 就像 tasklet_action 函数. 因此, tasklet 的最后 3 个运行在关联到
CPU 0 的 ksoftirqd 内核线程的上下文中发生. jitasklethi 的实现使用了一个高优先级 tasklet, 在马上要来的函数列表中解释.
jit 中实现 /proc/jitasklet 和 /proc/jittasklethi 的实际代码与
/proc/jitimer 的 实现代码几乎是一致的, 但是它使用 tasklet 调用代替那些定时器. 下面的列表详细展 开了 tasklet 结构已被初始化后的内核对
tasklet 的接口:
void
tasklet_disable(struct tasklet_struct *t);
这个函数禁止给定的
tasklet. tasklet 可能仍然被 tasklet_schedule 调度, 但 是它的执行被延后直到这个 tasklet 被再次使能. 如果这个
tasklet 当前在运行, 这个函数忙等待直到这个 tasklet 退出; 因此, 在调用 tasklet_disable 后, 你 可以确保这个
tasklet 在系统任何地方都不在运行.
void
tasklet_disable_nosync(struct tasklet_struct *t);
禁止这个
tasklet, 但是没有等待任何当前运行的函数退出. 当它返回, 这个 tasklt 被禁止并且不会在以后被调度直到重新使能, 但是它可能仍然运行在另一 个
CPU 当这个函数返回时.
void tasklet_enable(struct tasklet_struct
*t);
使能一个之前被禁止的
tasklet. 如果这个 tasklet 已经被调度, 它会很快运行. 一个对 tasklet_enable 的调用必须匹配每个对
tasklet_disable 的调用, 因为 内核跟踪每个 tasklet 的"禁止次数".
void tasklet_schedule(struct tasklet_struct
*t);
调度
tasklet 执行. 如果一个 tasklet 被再次调度在它有机会运行前, 它只运行 一次. 但是, 如果他在运行中被调度, 它在完成后再次运行; 这保证了在其他事件
被处理当中发生的事件收到应有的注意. 这个做法也允许一个 tasklet 重新调度 它自己.
void tasklet_hi_schedule(struct
tasklet_struct *t);
调度
tasklet 在更高优先级执行. 当软中断处理运行时, 它处理高优先级 tasklet 在其他软中断之前, 包括"正常的"
tasklet. 理想地, 只有具有低响应周 期要求( 例如填充音频缓冲 )应当使用这个函数, 为避免其他软件中断处理引入的 附加周期. 实际上,
/proc/jitasklethi 没有显示可见的与 /proc/jitasklet 的 区别.
void tasklet_kill(struct tasklet_struct *t);
这个函数确保了这个
tasklet 没被再次调度来运行; 它常常被调用当一个设备正 被关闭或者模块卸载时. 如果这个 tasklet 被调度来运行, 这个函数等待直到它 已执行.
如果这个 tasklet 重新调度它自己, 你必须阻止在调用 tasklet_kill 前它重新调度它自己, 如同使用 del_timer_sync.
tasklet 在 kernel/softirq.c 中实现.
2 个 tasklet 链表( 正常和高优先级 )被声明 为每-CPU 数据结构, 使用和内核定时器相同的 CPU-亲和 机制. 在 tasklet 管理中的数 据结构是简单的链表, 因为 tasklet 没有内核定时器的分类请求.
linux Tasklets 机制的更多相关文章
- Linux模块机制浅析
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...
- android & Linux uevent机制
Linux uevent机制 Uevent是内核通知android有状态变化的一种方法,比如USB线插入.拔出,电池电量变化等等.其本质是内核发送(可以通过socket)一个字符串,应用层(andro ...
- 利用linux信号机制调试段错误(Segment fault)
在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...
- Linux 内存机制详解宝典
Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...
- Linux Namespaces机制——实现
转自:http://www.cnblogs.com/lisperl/archive/2012/05/03/2480573.html 由于Linux内核提供了PID,IPC,NS等多个Namespace ...
- Linux Namespaces机制
转自:http://www.cnblogs.com/lisperl/archive/2012/05/03/2480316.html Linux Namespaces机制提供一种资源隔离方案.PID,I ...
- Linux分页机制之概述--Linux内存管理(六)
1 分页机制 在虚拟内存中,页表是个映射表的概念, 即从进程能理解的线性地址(linear address)映射到存储器上的物理地址(phisical address). 很显然,这个页表是需要常驻内 ...
- [转帖]Linux分页机制之分页机制的演变--Linux内存管理(七)
Linux分页机制之分页机制的演变--Linux内存管理(七) 2016年09月01日 20:01:31 JeanCheng 阅读数:4543 https://blog.csdn.net/gatiem ...
- [转帖]Linux分页机制之概述--Linux内存管理(六)
Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...
随机推荐
- 如何用SPSS分析学业情绪量表数据
如何用SPSS分析学业情绪量表数据 1.数据检验.由于问卷.量表的题目是主观判断和选择,因而难免有些人不认真填,所以,筛选出有效.高质量的数据非常关键.通常需要作如下检查:(1)是否有人回答互相矛盾, ...
- DAY1-作业
Python-day1-------> 本节内容: Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据 ...
- pl/sql基础知识—函数快速入门
n 函数 函数用于返回特定的数据,当建立函数式,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据,我们可以使用create function来建立函数,实际案例: ...
- 小爬爬1.requests基础操作
1.requests安装的问题 (1)如果requests没有安装,我们需要先安装这个模块,在cmd安装不了,我们可以在下面的位置,打开的窗体安装requests模块 pip install requ ...
- 洛谷P4126 [AHOI2009]最小割
题目:洛谷P4126 [AHOI2009]最小割 思路: 结论题 在残余网络上跑tarjan求出所有SCC,记id[u]为点u所在SCC的编号.显然有id[s]!=id[t](否则s到t有通路,能继续 ...
- 纯CSS3打造圆形菜单
原理是使用相对定位和绝对定位确定圆形菜单位置. 使用伪类选择器E:hover确定悬浮时候的效果,动画效果用CSS3的transition属性. 大概代码如下. html: <div id=&qu ...
- 用select提取List元素自身序号
var cs = currentCitys.Select((c, i) => new { id = c.CITY_ID, 序号 = (i + 1).ToString(), 城市类型 = c.IS ...
- qt 中lineEdit->setText()输出double
在qt中需要将获取到的double 值在ui界面上显示出来,便于观察.但是lineEdit控件的setText()要求的参数是string. 所以我们先要进行转化,将double 转化为string. ...
- Laravel中利用队列发送邮件的方法示例
https://www.jb51.net/article/121647.htm 本文主要给大家介绍了关于Laravel中队列发送邮件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的 ...
- 消息点击率翻倍的背后——闲鱼无侵入可扩展IFTTT系统
一.面临问题 在闲鱼生态里,用户之间会有很多种关系.其中大部分关系是由买家触发,联系到卖家,比如买家通过搜索.收藏.聊天等动作与卖家产生联系:另外一部分是平台与用户之间的关系.对这些关系分析之后我们发 ...