刚好之前写过一个中断的总结,你看看有没有帮助。
这篇主要记录下我对中断的理解,可以从这篇中窥见计算机系统有趣的地方。
中断这个概念可以说是所有微机的基础,甚至可以说微机就是一条条执行指令+中断。
可是为什么要用中断呢,一条条执行下来不就好了吗?这个主要是因为微机必须要处理突发状况。假设突发状况标志为变量A,如果不用中断,处理的方法是不断检测A,也就是在一条条指令中加上一条检测A的指令。
诶,这不就解决了吗?确实,如果突发状况不多而且不紧急的话,这样来一点问题都没有。但是,我们假设突发状况很紧急,必须在10条指令执行时间内开始处理,那就是说必须每执行10条指令就加一条检测指令。这样一下子执行速度就慢了10%,因为大多数时间这条检测指令都是白执行的。可想而知,如果要应对的突发状况多了,执行速度会被拖得多慢。
也许你想到一个好方法:我们可以将多个突发状况标志位单独做个门电路,让他们共同触发一个标志,指令线上只检测一个标志,多余的处理跳转过去再看。这确实是个不错的想法,不过却有一个致命的漏洞:只要有一个特别紧急的突发状况要处理,整个突发状况的检测就必须按最紧急的来。假设有一个状况必须在一条指令时间内开始处理,那即使这个状况非常罕见,指令线也必须每执行一条就检测下标志。所以,指令线中检测突发状况的上限是50%的速度下降。
芯片商当然不会放过这个50%的速度优化空间,他们想出的方法就是中断。从老思路来理解,中断其实就是每执行一条指令就检测下标志:不过不是在指令线中,而是在更低一层上“截胡”。
大家知道,指令线并不是凭空而来说要指令跑指令就跑,而是用寄存器+门电路搭起来的。而且,为了用尽量少的硬件完成无穷的指令执行,芯片用到了晶振之类的节拍器,每执行完一条指令后就回头复用之前的硬件(现代CPU为了更高的效率,执行一条指令分为好几个阶段,每个阶段执行完后就开始复用硬件,称为指令流水线)。这个的好处是低成本满足了大多数应用:如果对时间要求不太苛刻的话跟着节拍一条条来执行就好了。不过,某些应用对时间要求太严格了,这个时候就直接用门电路搭(比如FPGA),左边给输入,右边就给结果,光速完成指令(这个的坏处当然是只能执行这一条指令...)。
中断就可以理解为门电路做的“光速指令”。在指令线上每条指令执行结束时,节拍器打开“光速指令”,中断标志会马上触发一个标志,导致正常指令线上下一条指令无法进入执行部分,被中断“截胡”,微机进入中断处理程序的入口。这样整个架构就达成这样的一个效果:指令线上每执行一条指令就执行一条检测突发状况的指令!同时一点都不影响指令线的效率!
由此可见,中断的构思是相当精巧的。当然,这个只是理解中断的核心概念,无论是硬件的设计还是在中断之上发展出来的操作系统都远远比这个复杂,更深入的学习理解还是要看计算机的几门核心课程。