请选择 进入手机版 | 继续访问电脑版

[LINUX] linux克制 的上半部和下半部详解

[复制链接]
查看71 | 回复19 | 2021-9-5 03:27:29 | 显示全部楼层 |阅读模式

与Linux制止 息息干系 的一个告急 概念是Linux制止 分为两个半部:上半部(tophalf)和下半部(bottom half)。上半部的功能是"登记制止 ",当一个制止 发生时,它举行 相应地硬件读写后就把制止 例程的下半部挂到该装备 的下半部实行 队列中去。因此,上半部实行 的速率 就会很快,可以服务更多的制止 哀求 。但是,仅有"登记制止 "是远远不够的,由于 制止 的变乱 大概 很复杂。因此,Linux引入了一个下半部,来完成制止 变乱 的绝大多数任务 。下半部和上半部最大的不同是下半部是可制止 的,而上半部是不可制止 的,下半部几乎做了制止 处理程序全部 的变乱 ,而且可以被新的制止 打断!下半部则相对来说并不黑白 常告急 的,通常还是比较耗时的,因此由体系 自行安排运行机遇 ,不在制止 服务上下文中实行 。

Linux实现下半部的机制重要 有tasklet和工作队列。

Tasklet基于Linux softirq,其使用 相称 简单,我们只必要 定义tasklet及其处理函数并将二者关联:

  1. void my_tasklet_func(unsigned long); //定义一个处理函数:
  2. DECLARE_TASKLET(my_tasklet,my_tasklet_func,data); //定义一个tasklet结构my_tasklet,与
  3. my_tasklet_func(data)函数相关联
复制代码

然后,在必要 调度tasklet的时间 引用一个简单的API就能使体系 在得当 的时间 举行 调度运行:

  1. tasklet_schedule(&my_tasklet);
复制代码

此外,Linux还提供了别的 一些别的 的控制tasklet调度与运行的API:

  1. DECLARE_TASKLET_DISABLED(name,function,data); //与DECLARE_TASKLET类似,但等待tasklet被使能
  2. tasklet_enable(struct tasklet_struct *); //使能tasklet
  3. tasklet_disble(struct tasklet_struct *); //禁用tasklet
  4. tasklet_init(struct tasklet_struct *,void (*func)(unsigned long),unsigned long); //类似
  5. DECLARE_TASKLET()
  6. tasklet_kill(struct tasklet_struct *); // 清除指定tasklet的可调度位,即不允许调度该tasklet
复制代码

我们先来看一个tasklet的运行实例,这个实例没有任何实际 意义,仅仅为了演示。它的功能是:在globalvar被写入一次后,就调度一个tasklet,函数中输出"tasklet is executing":

  1. #include
  2. //定义与绑定tasklet函数
  3. void test_tasklet_action(unsigned long t);
  4. DECLARE_TASKLET(test_tasklet, test_tasklet_action, 0);
  5. void test_tasklet_action(unsigned long t)
  6. {
  7. printk("tasklet is executing\n");
  8. }
  9. ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
  10. {
  11. if (copy_from_user(&global_var, buf, sizeof(int)))
  12. {
  13. return - EFAULT;
  14. }
  15. //调度tasklet执行
  16. tasklet_schedule(&test_tasklet);
  17. return sizeof(int);
  18. }
复制代码

下半部分的任务 就是实行 与制止 处理密切干系 但制止 处理程序本身不实行 的工作。在Linux2.6的内核中存在三种不怜悯 势 的下半部实现机制:软制止 ,tasklet和工作队列。

下面将比较三种机制的差别与接洽 。

软制止 :

1、软制止 是在编译期间静态分配的。

2、最多可以有32个软制止 。

3、软制止 不会抢占别的 一个软制止 ,唯一可以抢占软制止 的是制止 处理程序。

4、可以并发运行在多个CPU上(即使同一范例 的也可以)。以是 软制止 必须计划 为可重入的函数(答应 多个CPU同时操作),

因此也必要 使用 自旋锁来保护其数据布局 。

5、现在 只有两个子系直接使用 软制止 :网络和SCSI。

6、实行 时间有:从硬件制止 代码返回时、在ksoftirqd内核线程中和某些表现 检查并实行 软制止 的代码中。

tasklet:

1、tasklet是使用 两类软制止 实现的:HI_SOFTIRQ和TASKLET_SOFTIRQ。

2、可以动态增长 减少,没有数目 限定 。

3、同一类tasklet不能并发实行 。

4、不同范例 可以并发实行 。

5、大部分环境 使用 tasklet。

工作队列:

1、由内核线程去实行 ,换句话说总在历程 上下文实行 。

2、可以就寝 ,壅闭 。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 击管虽您 | 2021-9-12 10:02:43 | 显示全部楼层
大神好强大!
回复

使用道具 举报

avatar chuzhaofeng | 2021-9-13 01:48:42 | 显示全部楼层
雷锋做好事不留名,都写在帖子里!
回复

使用道具 举报

avatar 若宸2017 | 2021-9-16 23:32:18 | 显示全部楼层
被admin楼主的逻辑打败了!
回复

使用道具 举报

avatar 心清目明噶 | 2021-9-18 02:28:31 | 显示全部楼层
有机会找admin楼主好好聊聊!
回复

使用道具 举报

avatar 默默MYQ | 2021-10-5 02:41:03 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 永远就三年疗 | 2021-10-11 00:18:08 | 显示全部楼层
admin楼主,您主治大夫在到处找您呢!
回复

使用道具 举报

avatar 123457748 | 2021-10-11 11:56:28 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 123457783 | 2021-10-12 23:37:03 | 显示全部楼层
楼上的真不讲道理!
回复

使用道具 举报

avatar 彩云彩2017 | 2021-10-13 21:57:42 | 显示全部楼层
不错的帖子,值得收藏!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则