0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么要把软中断锁放到更底层去呢?

Linux阅码场 来源:Linux阅码场 2023-08-24 09:04 次阅读

大内核锁(BKL)现在已经成为了一个遥远的记忆,但在那么多年里,它都是内核开发社区面临的一项棘手问题。然而 BKL 的终结并不意味着内核没有其他有问题的锁。近来,已经有一些关注转向了软中断锁(software-interrupt lock)或“下半部锁”(bottom half lock),因为它可能会在实时系统上导致延迟。Frederic Weisbecker 正在采取最新行动来减小这个锁的影响范围,该方法就是基于移除 BKL 时所采取的方法。

最初,Linux内核是在单处理器系统上开发的 —— 当然可以理解,因为那时我们手头只有这种系统 —— 因此,代码在很大程度上基于这样的假设:它在CPU上运行,完全不存在其他的 CPU。于是 BKL 最终需要被引入,才能让 Linux 能够运行在那些产业分析师向我们保证的未来将会大行其道的多处理器机器上。它确保了只有一个 CPU 在任何给定时间内运行内核代码,从而避免了各种并发问题,但是显著地牺牲了性能,尤其是随着 CPU 数量的增加而更加明显。人们很快意识到 BKL 必须被移除。

在许多子系统中采取的方法是将 BKL 下移至系统的更底层级别。不再是在调用每个驱动程序的 open()函数时就申请持有 BKL,而是修改每个驱动程序来自行获取 BKL。然后,open()函数可以在不持有 BKL 的情况下安全地得到调用了,每个驱动程序可以在需要时进行独立的审查(audit)和修复,之后可以删除其对 BKL 的使用。这种把 BKL 下移的动作将一个大问题分解成了许多较小且更易处理的问题。经过多年的努力,BKL 终于在 2011 年被移除了。

软中断(software interrupt)是一种延后执行的方法,用于执行一些是紧急但又无法直接在硬件中断上下文中执行的工作。当有这种工作要做时,子系统会通过设置一个 flag 来触发软中断;这会使得在下一个合适的时机会调用其处理程序,通常是在硬件中断处理完成后就立即调用,或在从系统调用返回到用户空间之前调用。如果处理时间过长,相关处理也可以推送到专门的 ksoftirqd 线程中。

软中断有许多使用者,包括 tasklets、网络、块设备子系统、读-拷贝-更新(RCU)以及内核定时器。在某些工作场景中,软中断处理可能成为 CPU 总负载的一个重要部分;它可能会运行相当长的时间,从而对运行在用户空间中的软件导致延迟。会禁用软中断处理的那些内核代码(为了避免与处理程序的产生 race condition)会变成不可抢占的,这也会导致出现不太愉快的延迟。总之,与 BKL 一样,软中断反映了几十年前很适用但是现在存在问题的一种设计。

其中一个设计上的决策是,软中断处理程序需要互斥;在任何给定的 CPU 上,只能执行一个软中断处理程序。因此,如果块设备的软中断处理程序运行时间很长,那么网络和定时器处理程序可能就会被无限期地延迟。即使不同类型的软中断处理程序之间很少出现竞争,情况仍然是如此。没有确切的方法可以确定同时运行两个处理程序是否安全,因此人们不会这样做。

Weisbecker 的 patch set 旨在通过在定时器子系统中采用 BKL 方式的迁移到更底层实现的方法来解决这个问题。定时器函数会在内核的各个地方被放到队列里等待调用;它们往往是互相独立的,与其他软中断处理程序并不会产生并发问题。几乎所有的定时器函数都可以与其他软中断处理完全并发地运行 —— 但是这里说的是“几乎”。在没有确定每个定时器函数的安全性的情况下,使定时器处理完全独立于软中断处理可能会引入很难调试的问题。

相反,Weisbecker 采取了分成两步的方法来增加定时器处理的并发性。第一步是允许单个软中断向量在不完全禁用软中断处理的情况下被禁用。这个 patch set 的目的是允许定时器函数与其他软中断并发运行,但它们仍然不会跟彼此并发运行。通过禁用定时器事件的处理(在本地 CPU 上),定时器处理程序可以安全地重新启用软中断处理,而无需担心会再次调用它。

第二步是允许单个 timer 函数来通知到定时器(timer)子系统,说它们可以跟其他软中断处理并发运行。任何不会与软中断处理程序竞争、或者在需要时得执行自己的软中断禁用代码的定时器函数,都可以在设置其定时器事件时添加 TIMER_SOFTINTERRUPTIBLE flag 来标记。当定时器子系统看到此标志时,就会在该定时器函数运行时重新启用软中断处理。因此,如果出现更重要的工作的话,这个 timer 函数就可以被抢占。

在 patch set 中只有一个定时器函数 process_timeout()是以这种方式标记的。然而,Weisbecker 期待着“几年后”的一天内核的所有定时器函数都已经过 audit,并可以安全地与软中断处理程序并发运行;在那时,将可以完全从软中断机制中移除定时器处理。这样以来就是朝着最终消除软中断的一个小步骤。

显然,需要进行相当多的工作才能达到这一点。即使这个 patch set 也需要“更多微调”,以使可以中断的 timer 函数能够抢占其他软中断处理程序,这是解决问题的重要部分。但是,如果这项工作能够进入 mainline 的话,它可能就能代表着朝着这个方向迈出了一步。Weisbecker 现在已经尝试了几次解决软中断的问题,但没有取得太大的成功。然而最终,就像 BKL 一样,正确的方法将会被找到,长期存在的问题终将得到解决。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18823

    浏览量

    226499
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10647

    浏览量

    208809
  • 定时器
    +关注

    关注

    23

    文章

    3212

    浏览量

    113433
  • LINUX内核
    +关注

    关注

    1

    文章

    315

    浏览量

    21548
  • 软中断
    +关注

    关注

    0

    文章

    8

    浏览量

    3009

原文标题:LWN:把软中断锁放到更底层去!

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问TC39x如何将变量放到自定义的段中去呢

    哪位知道如何将变量 放到自定义的段中 去呢?__attribute__ ((section(\".MySec\")))const tU32 M_A1 = 0
    发表于01-31 08:18

    已解决_紧急救助-如何把贴片元件放到底层

    本帖最后由 lsergao 于 2013-3-29 07:53 编辑 我把一个贴片元件双击选择 放到底层,怎么打印 底层没有焊盘啊,请高手指点,我是一个新手
    发表于03-28 16:39

    转第16章 FreeRTOS调度,任务中断

    第16章 FreeRTOS调度 ,任务 中断 本章教程为大家讲解调度 ,任务
    发表于09-01 07:45

    第11章 临界段,任务中断

    转rtx操作系统 本章教程为大家讲解几个重要的概念,临界段,任务 中断 。本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407。11.1 临界
    发表于10-04 19:58

    面向嵌入式Linux系统的中断设计与实现

    本文在分析标准Linux 内核的 中断机制的演化以及实现原理的基础上,提出并实现了一个面前嵌入式Linux 系统的 中断技术。该技术为嵌入式系统开发提供一个统一的
    发表于08-03 11:20 16次下载

    中断程序设计

    实 验 五 中断程序设计 一、实验目的 通过对 中断程序的编写和调试,掌握IBM-PC系列机的
    发表于09-28 23:26 2649次阅读
    <b class='flag-5'>软</b><b class='flag-5'>中断</b>程序设计

    什么是CDMA的"切换"?

    什么是CDMA的" 切换"? 在CDMA系统中还有一种切换称为" 切换"。它指发生在同一基站具有相同频率的不同扇区间的切换。另外,CDMA系统中还
    发表于06-01 20:27 535次阅读

    什么是CDMA的"切换"

    什么是CDMA的" 切换" 在CDMA系统中还有一种切换称为" 切换"。它指发生在同一基站具有相同频率的不同扇区间的切换。另外,CDMA
    发表于06-15 09:42 700次阅读

    关于FPGA中的PLL等价于MCU中的中断指令

    FPGA几乎都有PLL,而Altera和Xilinx的CPLD,几乎都没有PLL。PLL在可编程逻辑器件中的地位非常关键,它不仅仅是区分CPLD和FPGA的标准, 类似MCU中的 中断指令,决定了
    发表于09-20 18:15 0次下载

    Linux 2.4.x内核中断机制

    本文从Linux内核几种 中断机制相互关系和发展沿革入手,分析了这些机制的实现方法,给出了它们的基本用法。 中断概况
    发表于11-02 11:01 0次下载

    如何制作一个存电路

    在这个项目中,我们将制作一个 存电路,通过按一个按钮来打开和关闭电子设备。该电路称为 存开关。
    的头像 发表于08-25 16:32 4475次阅读
    如何制作一个<b class='flag-5'>软</b><b class='flag-5'>锁</b>存电路

    自旋和互斥的区别有哪些

    自旋 自旋 与互斥 很相似,在访问共享资源之前对自旋 进行上锁,在访问完成后释放自旋 (解锁);事实上,从实现方式上来说,互斥
    的头像 发表于07-21 11:19 8799次阅读

    中断与硬中断介绍

    • 硬 中断是由外部事件引起的因此具有随机性和突发性;硬 中断是否可以嵌套的,是否有优先级(由硬件设计体系决定)。 • 中断是执行 中断指令产生
    的头像 发表于11-07 17:02 688次阅读

    互斥和自旋的区别 自旋临界区可以被中断吗?

    互斥 和自旋 的区别 自旋 临界区可以被 中断吗? 互斥 和自旋 是在多线程编程中常用的
    的头像 发表于11-22 17:41 620次阅读

    CPU中断程序:从硬件看什么是中断

    CPU响应 中断转去执行 中断服务程序前,需 要把中断程序的现场信息保存起来,以便执行完 中断服务程序后,接着从被
    发表于03-26 11:36 1520次阅读
    CPU<b class='flag-5'>中断</b>程序:从硬件看什么是<b class='flag-5'>中断</b>?