系统相关
首页 > 系统相关> > Linux(内核剖析):23---下半部之(下半部总体概述)

Linux(内核剖析):23---下半部之(下半部总体概述)

作者:互联网

一、为什么要下半部

二、下半部

三、为什么要用下半部

四、下半部的环境(下半部的实现机制)

①“下半部”的起源

  • 最早的Linux只提供“bottom half”这种机制用于实现下半部。这个名字在那时毫无异义,因为当时它是将工作推后的唯一方法。这种机制也被称为“BH”,我们现在也这么叫它,以避免和“下半部”这个通用词汇混淆
  • 像过往的那段美好岁月中的许多东西一样,BH接口也非常简 单。它提供了一个静态创建、由32个bottom halves组成的链表。上半部通过一个32位整数中的一位来标识出哪个bottom half可以执行。每个BH都在全局范围内进行同步。即使分属于不同的处理器,也不允许任何两个bottom half时执行。这种机制使用方便却不够灵活,简单却有性能瓶颈

②任务队列

  • 不久,内核开发者们就引入了任务队列(task queue) 机制来实现工作的推后执行,并用它来代替BH机制。内核为此定义了一组队列,其中每个队列都包含一个由等待调用的函数组成链表。根据其所处队列的位置,这些函数会在某个时刻执行。驱动程序可以把它们自己的下半部注册到合适的队列上去
  • 这种机制表现得还不错,但仍不够灵活,没法代替整个BH接口。对于一些性能要求较高的子系统,像网络部分,它也不能胜任

③软中断和tasklet

  • 在2.3这个开发版本中,内核开发者引入了软中断(softirqs) 和tasklet。如果无须考虑和过去开发的驱动程序兼容的话,软中断和tasklet可以完全代替BH接口
    • 软中断:是一组静态定义的下半部接口,有32个,可以在所有处理器上同时执行——即使两个类型相同也可以
    • tasklet:这一名称起得很糟糕,让人费解,它们是一种基于软中断实现的灵活性强、动态创建的下半部实现机制。两个不同类型的tasklet可以在不同的处理器上同时执行,但类型相同的tasklet不能同时执行。tasklet其实是一种在性能和易用性之间寻求平衡的产物
  • 对于大部分下半部处理来说,用tasklet就足够了,像网络这样对性能要求非常高的情况才需要使用软中断。可是,使用软中断需要特別小心,因为两个相同的软中断有可能同时执行。此外,软中断还必须在编译期间就进行静态注册。与此相反,tasklet可以通过代码进行动态注册
  • 有些人被这些概念彻底搞糊涂了,他们把所有的下半部都当成是软件产生的中断或软中断。 换句话说,就是他们把软中断机制和下半部统统都叫软中断。別管他们好了。软中断与BH和 tasklet并驾其名

工作队列

  • 在开发2.5版本的内核时,BH接口最终被弃置了,所有的BH使用者必须转而使用其他下 半部接口。此外,任务队列接口也被工作队列接口取代了。工作队列是一种简单但很有用的方法,它们先对要推后执行的工作排队,稍后在进程上下文中执行它们。稍后的内容中我们再来探究它们

内核定时器

  • 另外一个可以用于将工作推后执行的机制是内核定时器。不像本章到目前为止介绍到的所有这些机制,内核定时器把操作推迟到某个确定的时间段之后执行。也就是说,尽管本章讨论的其他机制可以把操作推后到除了现在以外的任何时间进行,但是当你必须保证在一个 确定的时间段过去以后再运行时,你应该使用内核定时器
  • 较之本章讨论到的这些机制,定时器还有一些其他功能。有关定时器的详细内容在后面的文章会讨论

五、总结

江南、董少 博客专家 发布了1325 篇原创文章 · 获赞 849 · 访问量 20万+ 他的留言板 关注

标签:23,中断,处理程序,内核,Linux,半部,机制,执行
来源: https://blog.csdn.net/qq_41453285/article/details/103996429