第八章 异常控制流
8.1异常
异常是异常控制流的一种形式,它一部分是由硬件实现的,一部分是由操作系统实现的。
异常就是控制流中的突变,用来响应处理器状态中的某些变化。
8.1.1异常处理
异常号是到异常表中的索引,异常表的起始地址放在一个叫做机异常表基址存储器的特殊CPU寄存器里
8.1.2异常类别
1.中断异常号是到
2.陷阱和系统调用
3.故障
4.终止
8.1.3Linux/IA32系统中的异常
1.Linux/IA32故障和终止
(1)除法错误
(2)一般保护故障
(3)缺页
(4)机器检查
2.Linux/IA32系统调用
8.2进程
异常是允许操作系统提供进程的概念所需要的基本构造块
进程的经典定义就是一个执行中的程序的实例
进程提供给应用程序的关键抽象:
(1)一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器
(2)一个私有的地址空间,它提供他一个假象,好像我们的程序独占地使用存储器系统
8.2.1逻辑控制流
即使在系统中通常有许多其它程序在运行,进程也可以向每个程序提供一种假象,好像它在独占地使用处理器。如果想用调试器单步执行程序,我们会看到一系列的程序计数器(PC)的值,这些之唯一的对应于包含在程序的可执行目标文件中的指令,或是包含在运行时的动态链接到程序的共享对象中的指令。这个PC值的序列叫做逻辑控制流,或简称逻辑流。
8.2.2并发流
一个逻辑流的执行在时间上与另一个流重叠,称为并发流,这两个流被称为并发的运行。
8.2.3私有地址空间
一个进程为每个程序提供它自己的私有地址空间,和这个空间中某个地址相关联的那个存储器字节是不能被其他进程读或写的,从这方面的来说,这个私有地址空间是私有的。
8.2.4用户模式和内核模式
处理器通常是用某个控制寄存器中的一个模式位来提供这种功能的,该寄存器描述了进程当前享有的特权。当设置了模式位时,进程就运行在内核模式中。一个运行在内核模式的进程可以执行指令集的任何指令,并且可以访问系统中任何存储器位置。
8.2.5上下文切换
操作系统内核使用一种称为上下文切换的叫高层形式的异常控制流来实现多任务
内核为每个进程维持一个上下文。上下文就是内核重新启动一个被抢占的进程所需的状态。
8.3系统调用错误处理
当UNIX系统级函数遇到错误时,他们会典型的返回-1,并设置全局整数变量errno来表示什么错了。
通过使用错误处理包装函数,我们可以更进一步的简化我们的代码
8.4进程控制
8.4.1获取进程ID
每个进程都有一个唯一的正数进程ID。getpid函数返回调用的PID,getppid函数返回他的父进程的PID(创建调用进程的进程)
8.4.2创建和终止进程
从程序员角度,程序总是处于下面三种状态之一:
(1)运行
(2)停止
(3)终止
8.4.3收回子进程
当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除。相反,进程被保持在一种已终止的状态中,直到被它的父进程回收。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进展,从此时开始,该进程就不存在了。一个终止了但还未被回收的进程称为僵死进程。
(1)判定等待集合的成员
(2)修改默认行为
(3)检查已回收子进程的退出状态
(4)错误条件
(5)wait函数
8.5信号
UNIX信号,他允许进程中断其他进程
一个信号就是一条小消息,他通知进程中发生了一个某种类型的事件。
每种信号类型都对应每种系统事件。
8.5.1信号术语
发送一个信号到目的进程是由两个不同步骤组成:
(1)发送信号
(2)接收信号
8.5.2发送信号
(1)进程组
(2)用/bin/kill程序发送信号
(3)从键盘发送信号
(4)用kill函数发送信号
(5)用alarm函数发送信号
8.5.4信号处理问题
(1)待处理信号被阻塞
(2)待处理信号不会排队等待
(3)系统调用可以被中断
总结:
异常控制流发生在计算机系统的各个层次,是计算机系统中提供并发的基本机制。
在硬件层,异常是由处理器中的事件出发的控制流中的突变。控制流传递递给一个软件处理程序,该处理程序进行一些处理,然后返回控制给被中断的控制流。
异常分为:中断、故障、终止、陷阱。
在操作系统层,内核用ECF提供进程的基本概念。进程提供给应用两个中澳的抽象:(1)逻辑控制流(2)私有地址空间
在操作系统和应用程序之间的接口处,应用程序可以创建子程序,等待他们的子进程停滞 或者终止,运行新的程序,以及不活来自其他进程的信号
在应用层,c程序可以使用非本地跳转来规避正常的调用/返回栈规则,并且直接从一个函数分支到另一个函数
主要参考资料《深入理解计算机系统》
心得:
通过本章的学习,基本了解了ECF在计算机各个层次的发生,同时,部分内容也对我学习操作系统课程有很大的帮助,例如8.2进程,操作系统课程主要学习的是进程的具体作用,如何运行,如何产生最终结果,而书中关于进程的内容,是关于什么是进程,进程具体是什么,给程序提供了什么样的抽象,并对操作系统课程中常常提到的wait和signal两个函数也有了进一步的理解,知道了函数具体是什么,为什么是这样的,这对于我深刻了解这方面的知识起到了很大的帮助,对于8.5章的信号,比较难理解,我会多花些时间学懂该部分知识。