Linux性能优化读书笔记(3):中断机制

软中断

一个中断产生之后,内核在中断处理函数中可能需要完成很多工作。但是中断处理函数的处理是关闭了中断的。也就是说在响应中断时,系统不能再次响应外部的其它中断。这样的后果会造成有可能丢失外部中断

于是,linux内核设计出了一种架构,中断处理过程分成了两个阶段:上半部为中断处理程序

  • 上半部用来快速处理中断,在中断处理函数中执行,这时系统关闭中断(在中断禁止模式下运行)。主要处理跟硬件相关(比如鼠标输入)或者时间敏感工作。硬中断打断CPU正在执行任务,立即执行中断处理程序。

CPU响应中断之后,经过某些操作,转去执行中断服务程序。这些操作是由 硬件直接实现的,把它称为中断隐指令。中断隐指令并不是指令系统中的一条真正的指令,它没有操作码,所以中断隐指令是一种不允许、也不可能为用户使用的特殊指令。其所完成的操作主要有:

  (1)保存断点

  为了保证在中断服务程序执行完毕能正确返回原来的程序,必须将原来程序的断点(即程序计数器(PC)的内容)保存起来。断点可以压入堆栈,也可以存入主存的特定单元中。

  (2)暂不允许中断(关中断)

  暂不允许中断即关中断。在中断服务程序中,为了保护中断现场(即CPU主要寄存器的内容)期间不被新的中断所打断,必须要关中断,从而保证被中断的程序在中断服务程序执行完毕之后能接着正确地执行下去。

  并不是所有的计算机都在中断隐指令中由硬件自动地关中断,也有些计算机的这一操作是由软件(中断服务程序)来实现的。

  (3)引出中断服务程序

  引出中断处理程序的实质就是取出中断服务程序的入口地址送程序计数器(PC)。对于向量中断和非向量中断,引出中断服务程序的方法是不相同的。

  • 下半部用来延迟处理上半部未完成工作,这个时候开启中断,系统可以响应外部中断。通常以内核线程方式运行,每个CPU对应一个软中断内核线程。0号CPU对应的软中断内核线程为ksoftirqd/0。软中断是由软件产生的

网卡接受数据包,通过硬件中断方式通知内核数据来到

  • 内核调用中断处理程序来相应,直接处理硬件请求把网卡数据读到内存中,更新硬件寄存器状态,最后发一个软中断信号。
  • 下半部被软中断信号唤醒(被内核触发),从内存找到数据,根据网络协议栈,对数据逐层解析处理,发送到应用程序

所以大量的网络小包会导致性能问题:频繁的软硬中断

可以通过查看/proc/softirqs来观察软中断情况,而且软中断包括不同的类型。且同一种软中断在不同CPU也有不同分布情况,不过应该相差不大

 

 

你可能感兴趣的:(Linux性能优化读书笔记(3):中断机制)