中断
要想在任何需要的时候回到操作系统,这相当于是改变了CPU的正常执行流程,所以一个非常熟悉的字眼——中断(Interrupt)就出现了。通过中断,可以保证回到操作系统,从而将CPU的控制权交给操作系统。
中断的字面意思就是打断正常执行流程,但是注意,它表示的是打断流程而不是终止流程,这是不同的概念。中断是操作系统中非常重要的机制,正如上面所描述的:中断用于保证CPU控制权交给操作系统,从而让操作系统可以执行某些操作。
中断分为硬件中断和软件中断。
任何硬件,都有自己的IRQ(中断请求),都可以在需要的时候通过总线向CPU发送硬件中断通知。比如时钟中断,当进程执行耗光时间片时将产生一个时钟中断,使得能够立刻进入操作系统并调度下一个要执行的进程,时钟中断是操作系统具有安全感的保证,只要时钟开始运行后,就意味着操作系统最终总能够获取到CPU控制权。再比如硬盘的IO中断,当硬盘读取所请求的数据完成后,就会发送硬盘IO中断,CPU接到该中断后就会切换到操作系统,让操作系统去处理这个中断事件。
软件也可以发送中断,比如请求一个系统调用(system call),关于系统调用,后面再介绍。
无论是软中断还是硬件中断,最终的目的都是为了回到操作系统,将CPU交给操作系统。那么,中断是如何回到操作系统的呢?换句话说,中断时是如何进入内核态的呢?内核态又如何回到用户态呢?
其实要进入内核态只需要特殊的指令即可,一般称之为trap指令,当执行trap指令后,就会进入内核态,回到操作系统。trap这个词的意思就是陷阱,在这里它表示的是动词:陷入,非常形像,它表示的是执行trap指令以便陷入到内核,即进入内核态。
当操作系统执行完相关操作后,就要回到用户态,要回到用户态也只需执行特殊的指令即可,一般称之为return-from-trap指令。(此处的trap又似乎是个名词,表示脱离陷阱,回到用户态之下。它将内核态描述为陷阱,这其实也是可以理解的,中断是事件,收到事件表示捕获到事件,什么具有捕获的能力?陷阱。在bash中也有一个trap命令,也可以理解为陷进,它用来设置信号处理程序,当捕获到信号时就做出某些处理。我们不管trap是陷入还是陷阱,我们关注的是作用:进入内核态和退出内核态。)
中断既然是打断CPU的执行流程,那么可能需要重新回到中断点继续正常的执行流程。所以,在发生中断时,需要保存好中断点以及相关的一些状态,以便能够在处理完中断后恢复执行流程继续向下执行。
所以,中断就像是突发事件,处理完成后如果恢复到断点处,那么对整个流程来说,中断就像是从未发生过的事一样,但却实实在在的被处理了。但是,中断后并不一定会恢复到断点处,因为中断处理程序可能会在恢复断点前直接退出这个执行流程,比如有些硬件中断表示一些异常现象(比如除0异常),这些异常可能会导致终止进程。