20165232 第七周学习总结
第七周学习总结
第八章 异常控制流
异常
- 异常就是控制流中的突变,如图
- 在处理器中,状态被编码为不同的位和信号。状态变化称为事件
- 处理器检测到异常事件发生时,会进行一个间接过程调用。
- 当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下三种情况的一种:
- 处理程序将控制返回给当前指令Icurr,即当事件发生时正在执行的指令。
- 处理程序将控制返回给Inext,即如果没有发生异常将会执行的下一条指令。
- 处理程序终止被中断的程序。
异常处理
- 如图,若处理器检测到发生一个事件,并确定相应的异常号k,处理器执行间接过程调用,通过异常表的表目k,转到相应处理程序。
- 异常与过程调用的不同之处
- 过程调用时,在跳转到处理器之前,处理器将返回地址压入栈中。然而,根据异常的类型,返回地址要么是当前指令,要么是下一条指令。
- 处理器把一些额外的处理器状态压入栈里,在处理程序返回时,重新开始被中断的程序会需要这些状态。
- 如果控制从一个用户程序转移到内核,那么所有这些项目都被压到内核栈中,而不是压到用户栈中。
- 异常处理程序运行在内核模式下,它们对所有的系统资源都有完全的访问权限。
异常的类别
- 中断:如图便是一个中断处理
- 陷阱和系统调用
- 陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
- 陷阱是有意的异常,最重要的用途是在用户程序和内核之间提供一个向过程一样的接口,叫做系统调用。
- 为了允许内核服务的受控访问,使用“syscall n”指令,跳转到一个异常处理程序的陷阱,处理程序对参数解码并调用适当的内核程序。
故障
- 故障是由错误情况引起的。
例如:abort例程会终止引起故障的应用程序。 根据故障是否能够被修复,故障处理程序重新执行引起故障的指令,或者终止。 - 终止
进程
- 进程的经典定义:一个执行中程序的实例
- 系统中的每个程序都是定义在运行在某个进程的上下文中的。
- 进程提供给应用程序的关键抽象:
- 一个独立的逻辑控制流,独占地使用处理器;
- 一个私有的地址空间,它提供一个假象,就想程序独占地使用存储器系统。
并发流
- 并发:多个流并发地执行的一般现象。
- 多任务:一个进程和其他进程轮流运行。
- 时间片:一个进程执行他的控制流的一部分的每一时间段。
- 时间分片:多任务。
进程控制
获取进程ID
- 每个进程都有一个唯一的正数(非零)进程ID(PID)。
pid_t getpid(void); /*返回调用进程的PID*/
pid_t getppid(void); /*返回父进程的PID*/
- getpid和getppid函数返回一个类型为pid_t的整数值,linux系统上它在types.h中被定义为int。
回收子进程
- 判定等待集合的成员
- pid>0,等待集合是一个单独子进程。
- pid=-1,就是由父进程的所有子进程组成的。
- 修改默认行为
- 可以通过将options设置为常量WNOHANG,WUNTRACED,WCONTINUED的各种组合来修改。
- 检查已回收子进程的退出状态
利用fork和exec运行程序
两个重要命令
man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
grep -nr XXX /usr/include :查找宏定义,类型定义