《深入理解计算机系统》第八章复习总结

在任何情况下,当处理器检测到有事件发生时,他就会通过异常表进行跳转,执行异常处理程序。
异常可以分为四类:中断、陷阱、故障、终止。
中断是异步发生的,是来自处理器外部的I/O设备的信号的结果。硬件中断不是由任何一条专门的指令造成的,从这个意义上来说,它是异步的,而其他异常时同步发生的,是执行当前指令的结果。
陷阱是有意的异常,是执行一条指令的结果。陷阱最重要的用途是在用户程序和内核之间提供一个向过程一样的接口。
故障由错误情况引起,它可能能够被故障处理程序修正。如果错误能够修正,它就将控制返回到引起故障的命令,否则将返回到内核中的abort例程,终止引起故障的应用程序。
终止是不可恢复的致命错误造成的影响,通常是硬件错误。终止从不将控制返回给应用程序。

异常是允许操作系统提供进程的概念所需要的基本结构快。进程的经典定义就是一个执行中的程序的实例。系统中的每个程序都是运行在某个进程的上下文中,上下文由程序正确运行所需的状态组成,状态包括存放在存储器中的程序代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
一个进程为每个程序提供它自己的私有地址空间,一般来说,和这个空间中的某个地址相关联的那个存储器字节是不能被其他进程读或者写的,从这个意义上说,这个地址空间是私有的。
在Linux中,可以通过fork函数新建一个子进程,子进程得到与父进程用户级虚拟地址空间相同的但是相互独立的一份拷贝,包括文本、数据、bss段、堆以及用户栈。子进程还获得与父进程任何打开文件描述符相同的拷贝,这意味着当父进程调用fork时,子进程可以读写父进程打开的任何文件。在父进程中fork函数返回子进程的pid值,而在子进程中fork函数返回0,因此fork函数调用一次却返回两次(一次在父进程,一次在子进程)。
当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除掉,相反,进程被保持在僵死状态,必须由父进程回收。如果父进程还没有回收僵死子进程就终止了,内核会安排init进程来回收它们。即使僵死进程没有运行,他们仍然消耗系统的存储器资源。

一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。一种信号类型对应于一种系统事件,内核通过更新目的进程上下文中的某个状态,来表明发送一个信号给目的进程。当目的进程被内核强迫以某种方式对信号的发送作出反应时,目的进程就接收了信号。进程可以选择忽略、终止或者执行一个信号处理程序来捕获信号。
一种类型的信号最多只能有一个被捕获、一个待处理。如果有一个信号待处理,则相同类型的其他信号会被忽略(抛弃)。
在某些系统中,当处理程序捕获到一个信号时,被中断的慢速系统调用将会不再继续,而是立刻返回给用户一个错误条件。

C语言提供了一种用户级异常控制流形式,成为非本地跳转,可以控制直接从一个函数转移到另一个当前正在执行的函数,而不经过正常的调用-返回序列。非本地跳转通过setjmp和longjmp函数实现。setjmp函数在参数缓冲区(env)中保存当前的调用环境,以供后面longjmp使用,并立刻返回0。longjmp函数从env中恢复调用环境,然后从最近一次初始化env的setjmp函数调用处返回。setjmp函数调用一次,但返回多次(每次调用longjmp函数时返回),而longjmp函数调用一次却不返回(从setjmp函数调用处返回)。C++和Java中的异常机制是较高层次的setjmp和longjmp函数的结构化版本。

posted @ 2012-03-18 23:02  o0慢节奏0o  阅读(694)  评论(0编辑  收藏  举报