小林Coding阅读笔记:操作系统篇之硬件结构,中断问题

Posted adventure.Li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小林Coding阅读笔记:操作系统篇之硬件结构,中断问题相关的知识,希望对你有一定的参考价值。

前言

  1. 参考/导流:
    小林coding - 2.6 什么是软中断?
  2. 学习意义
  • 学习CPU与外设如何去提升处理效率的设计思想,异步机制的理解与借鉴
  • 掌握相关的Linux命令,帮助问题排查
  1. 相关说明
    该篇博文是个人阅读的重要梳理,仅做简单参考,详细请阅读小林coding的原文!

六、中断问题

中断的概念

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。【通过该描述,可以看出是具有抢占、优先级的体现】

在计算机中,中断是系统用来响应硬件设备请求的一种机制,操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。它是一种异步的事件处理机制,可以提高系统的并发处理能力。【理解中断异步,异常同步;对比消息队列去做异步处理; 关键点在于中断处理程序保存现场,正在执行的程序可以再返回继续接着执行】

操作系统收到了中断请求,会打断其他进程的运行,所以中断请求的响应程序,也就是中断处理程序,要尽可能快的执行完,这样可以减少对正常进程运行调度地影响。

而且,中断处理程序在响应中断时,可能还会「临时关闭中断」,这意味着,如果当前中断处理程序没有执行完之前,系统中其他的中断请求都无法被响应,也就说中断有可能会丢失,所以中断处理程序要短且快。

中断的作用

  • 提高计算机系统效率:协调 CPU 和 外设 处理速度不匹配问题;当外设需要CPU时在通过中断CPU进行交换信息,平时则互不干扰、独立并行工作。若没有中断机制,那么CPU则需要自己主动去轮询外设,开销大,利用效率低。

[CPU和外设通信方式:*轮询、中断、DMA*和通道]

  • 维持系统可靠正常工作。现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发生,由存储管理部件进行监测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施。【抽象出来一个中间层,解放CPU,对比思考 中介者模式,代理模式,中间件-消息队列等第三者来出来,减轻本身的职责或直接联系】

基本过程

①中断源发出中断请求;
②判断当前处理机是否允许中断和该中断源是否被屏蔽;
③优先权排队;
④处理机执行完当前指令或当前指令无法执行完,则立即停止当前程序,保护断点地址处理机当前状态,转入相应的中断服务程序;
⑤执行中断服务程序;
⑥恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序。

软中断

Linux 系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别是「上半部和下半部分」

  • 上半部用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。
  • 下半部用来延迟处理上半部未完成的工作,一般以「内核线程」的方式运行。

示例

网卡收到网络包后,通过 DMA 方式将接收到的数据写入内存,接着会通过硬件中断通知内核有新的数据到了,于是内核就会调用对应的中断处理程序来处理该事件,这个事件的处理也是会分成上半部和下半部。

上部分要做的事情很少,会先禁止网卡中断,避免频繁硬中断,而降低内核的工作效率。接着,内核会触发一个软中断,把一些处理比较耗时且复杂的事情,交给「软中断处理程序」去做,也就是中断的下半部,其主要是需要从内存中找到网络数据,再按照网络协议栈,对网络数据进行逐层解析和处理,最后把数据送给应用程序。

简述

  • 上半部直接处理硬件请求,也就是硬中断,主要是负责耗时短的工作,特点是快速执行;
  • 下半部是由内核触发,也就说软中断,主要是负责上半部未完成的工作,通常都是耗时比较长的事情,特点是延迟执行;

另外,硬中断(上半部)是会打断 CPU 正在执行的任务,然后立即执行中断处理程序,而软中断(下半部)是以内核线程的方式执行,并且每一个 CPU 都对应一个软中断内核线程,名字通常为「ksoftirqd/CPU 编号」,比如 0 号 CPU 对应的软中断内核线程的名字是 ksoftirqd/0

不过,软中断不只是包括硬件设备中断处理程序的下半部,一些内核自定义事件也属于软中断,比如内核调度等、RCU 锁(内核里常用的一种锁)等

系统里有哪些软中断

在 Linux 系统里,我们可以通过查看 /proc/softirqs的 内容来知晓「软中断」的运行情况,以及 /proc/interrupts 的 内容来知晓「硬中断」的运行情况【看到的是累计的次数】

通过该指令watch -d cat /proc/softirqs ,可动态分析

如何定位软中断 CPU 使用率过高的问题?

0.0% us — 用户空间占用CPU的百分比。
0.1% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
99.8% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比

top指令的使用

一般对于网络 I/O 比较高的 Web 服务器,NET_RX 网络接收中断的变化速率相比其他中断类型快很多。

如果发现 NET_RX 网络接收中断次数的变化速率过快,接下来就可以使用 sar -n DEV 查看网卡的网络包接收速率情况,然后分析是哪个网卡有大量的网络包进来。

接着,在通过 tcpdump 抓包,分析这些包的来源,如果是非法的地址,可以考虑加防火墙,如果是正常流量,则要考虑硬件升级等。

以上是关于小林Coding阅读笔记:操作系统篇之硬件结构,中断问题的主要内容,如果未能解决你的问题,请参考以下文章

小林Coding阅读笔记:操作系统篇之硬件结构,伪共享问题及CPU的任务执行

小林Coding阅读笔记:操作系统篇之硬件结构,CPU Cache一致性问题

小林coding阅读笔记:操作系统篇之内核设计

小林coding阅读笔记:操作系统篇之内核设计

小林coding阅读笔记:操作系统篇之内存分配与回收

小林coding阅读笔记:操作系统篇之内存分配与回收