操作系统学习笔记-异常控制流

    从处理器家店开始,程序计数器会设置一个代码执行的序列,当执行完代码k之后执行代码K+1则称为控制转移,这样的控制转移则称作处理器的控制流。其中控制流有两种,一种为平滑的控制流,即没两行代码都是在存储器中相邻的,另外一种称为突变的控制流,也就是执行的代码不相邻。现代操作系统正是通过这种控制流突变实现系统的并发,我们也称这种控制流突变为异常控制流。异常控制流体现在系统的各个层次。

在硬件层次

    通常是通过处理器中的事件来触发控制流的突变,当这种异常发生之后通常是通过专门的异常处理程序进行处理。操作系统维护着一张异常表,内容为异常号和异常处理程序的对应关系,系统正是根据异常发生时的异常号根据异常表来寻找对应的异常处理程序的。

    通常异常分为4种:中断,陷阱,故障,终止。在这四种异常中中断是异步发生的,通常是由系统外部的I/O设备向处理器的中断引脚发出的中断信号引起的,当发生中断时系统通常由当前处理程序直接跳转致异常处理程序,当从中断处理程序返回之后系统从中断代码的下一条代码处继续执行。其余的三种异常都是同步的。陷阱是一种非常有意义的异常,陷阱是用户程序进行系统调用所必须的过程。通常用户的程序都工作在用户模式下,然而当进程需要进行磁盘读写之类的系统级的操作时便需要在内核模式下进行,也就是需要系统权限,这时,系统便进行一次系统调用,操作系统将当前进程的上下文信息压入内核栈中并陷入内核中进行系统调用,完成后返回用户模式并继续执行中断处的下一条代码。故障是一种可恢复的异常,比如存储器缺页时,系统运行异常处理程序将所缺页导入内存并返回刚才发生异常的代码出重新执行异常代码,若无法从故障中恢复系统也可以终止。最后一种异常也就是终止,当发生这种异常时进行直接终止。

操作系统层次

    在这个层次操作系统提供了进程这个概念,这也是计算机科学中最成功的概念之一,所谓的进程就是执行中的程序实例,其中每个进程运行过程中系统各个寄存器的取值等信息组成了程序的运行状态描述,我们称之为进程的上下文。进程为程序提供了两个关键的抽象:独立的逻辑控制流,私有的地址空间,他为我们提供了一个假象,我们的程序独占地使用处理器与存储系统。每个程序在运行过程中程序计数器标记了系统运行的语句,也就是说指明了程序的控制流。通过将其保存,并指向另一程序的运行地址就可以实现运行程序的切换,同样在适当的时候也可以恢复到当前的状态以继续执行当前程序,这也就是操作系统中进程的抢占与挂起,它实现了控制流的切换,实现控制流的重叠也就是并发。但光解决控制流的问题并不能完全解决并发的问题,因为程序的很多信息都存储于存储器中,存储器的内容也应当随之改变,这也就是私有地址空间的方式。系统为每个进程提供了相同的地址空间结构,并且地址空间是相互独立的,有了这些概念结合上下文切换便能够有效的实现进程之间的切换实现并发。然而处理器的高速缓存才发生进程切换之后便不再有用了,也就是高速缓存的污染。

操作系统与应用程序接口处

    在这个层面操作系统提供了很多进程控制的方式,利用这些进程控制方式能够有效的进行父进程子进程的操作,有效的控制进程的切换与并发。在这个层面上同样存在一种类似于硬件层面的异常方式,也就是一种软中断,我们称之为信号。利用信号能够实现类似于硬中断的功能,不过信号更加强大,他不仅能够利用现有的方式处理异常,而且能够自己编写处理异常的方式,更加的灵活实用,但是不同系统对于信号的返回方式处理是不同的,尤其是在处理read,wait,accept这样的慢速系统调用时应当格外小心,尽量编写可移植的信号处理方案。

应用层

    在应用层,操作系统能够利用非本地跳转的方式来规避正常的调用返回规则,从一个函数分支直接跳转致另一个函数分支,其实现的结果就类似于异常处理中的throw与catch的应用。

    在操作系统的各个层面都利用异常控制流来实现切换,支持并发的处理,要彻底的理解这些概念与具体的应用,还是具体的编写一些程序来验证效果比较好一些。

你可能感兴趣的:(操作系统)