电脑上有个硬件设备叫做中断控制器,而CPU上若干个引脚,中断控制器的输出引脚会和CPU的输入引脚链接起来,如果发生中断,对应引脚会收到信号。CPU在执行完一个指令后就会去检查引脚上是否有信号来,如果有就去处理信号(也就是中断函数)。中断函数是提前准备好的(系统启动时),cpu收到信号就去执行。这些流程都是硬件完成的,我们只需要遵循规则就可以了。
所以在收到信号和信号处理函数执行之间,是CPU硬件在进行衔接处理。
有人可能会疑惑CPU每次执行完指令都去检测引脚信号会不会导致性能问题?实际上不会,这些都是硬件电路完成的,这个检测逻辑处理速度基本就是电信号传递速度,而目前CPU已经很小了,电信号那点传播距离所耗费的时间基本可以忽略。
----------下面是以前的-------
简单说下我的理解。
从CPU的角度看,它的工作就是一直读取指令,然后执行。如果没有意外,这个过程会一直持续下去。
程序是由指令序列组成的,CPU执行某个程序时,就是读取对应程序的指令并执行(不太严谨)。如果没有意外,这个过程就不会中断,直到所有的指令都执行完。
linux是分时操作系统,就是CPU时间会分为多个时间片,比如10毫秒一个时间片,程序执行一个时间片之后,操作系统会重新选择一个任务来执行。问题是CPU是怎么知道时间片到了呢?又是如何触发任务选择的呢?
关键原理就是CPU有个外部时钟,这是一个倒数计时器,初始时会设置一个数字,比如1000,然后每个时钟脉冲数字减一,减到0的时候,就给CPU发一个信号,CPU会中断当前程序,来处理这个信号,这个信号的处理程序会重置计时器,并执行信号处理函数,如此反复,起到了时间分片的效果。
信号处理函数可能会重新选择另一个任务来执行,这个就是进程切换。
当然这些都需要CPU在硬件层级进行支持,比如可以接受外部中断信号,暂停当前任务,转去执行信号处理函数。然后操作系统会利用这种底层机制,做出分时功能。
注:实际中,能打断当前程序的中断事件有很多种,包括硬中断和软中断两大类,可以到网上找到相关的资料研究研究