第十一周学习总结
异常控制流
程序计数器假设一个值的序列a0,a1,,,,,an-1;每个ak是某个相应的指令Ik的地址。每次从ak到ak+1的过渡称为控制转移。这样的控制转移序列叫做处理器的控制流。
异常控制流发生在计算机的各个层次中:
硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序
操作系统层,内核通过上下文转换将控制从一个用户进程转移到另一个用户进程
应用层,一个进程可以发送信号到另一个进程,而接收者会将控制突然转移到它的一个 信号处理程序。
*一个程序可以通过回避通常的栈规则,并执行到其他函数中任意位置的非本地跳转来对错误进行反应。
8.1
异常是异常控制流的一种形式,一部分由硬件实现,一部分由操作系统实现
异常就是控制流的突变,用来响应处理器状态中的某些变化
在任何情况下,当处理器检测到事件发生,通过一张“异常表”的跳转表,进行一个间接过程调用,到一个专门设计要来处理这类事件的操作系统子程序——异常处理程序
1.异常处理
系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号;
在系统启动时,操作系统分配和初始化“异常表”的跳转表,使得条目k包含异常k的处理程序的地址;
运行时,处理器检测到发生事件,确定相应的异常号k,随后处理器触发异常,方法是执行间接过程调用,通过异常表的条目k转到相应的处理程序。异常号是异常表的索引,异常表的起始地址放在一个叫做异常表基址寄存器的特殊cpu。
异常类似于过程调用,但有区别:P482
2.异常的类别
中断:硬件中断的异常处理程序通常称为中断处理程序;(异步;来自I/O设备的信号;总是返回下一条指令)。
剩下的陷阱,故障和终止都是同步指令——故障指令
陷阱:最重要的用途是用户程序和内核之间的提供一个像过程的——系统调用(同步;有意的异常;总是返回到下一条指令)
故障:同步;潜在的可恢复错误;可能返回当前指令
终止:同步;不可恢复的错误;不会返回
3.linux/IA32系统中的异常
P485 图8-9
8.2
系统中每个程序都是运行某个进程的上下文中的;上下文是由程序正确运行所需的状态组成的(包括存储器的代码和数据,栈,通用目的寄存器的内容,程序寄存器等)
进程提供给应用程序的两个重要抽象:
一个独立的逻辑控制流
一个私有的地址空间
1.逻辑控制流
Pc值的序列叫做逻辑流
2.并发流
一个逻辑流的执行在时间上和另一个流重叠,称为并发流
多个流并发地执行的一般现象叫做并发。一个进程和其他进程轮流执行叫做多任务。
3.私有地址空间
4.用户模式和内核模式
模式位:限制一个应用可以执行的指令和可以访问的地址空间范围
内核模式:设置了模式位,进程可以执行指令集的任何指令,并且可以访问系统的任何存储位置。
用户模式:没有设置模式位,进程不允许执行特权指令。
5.上下文切换
操作系统内核使用一种上下文切换的异常控制流来实现多任务;
调度:在进程执行的某些时刻,内核可以觉得抢占当前进程,并重新开始一个先前被抢占的进程。由内核中的调度器实现
8.3
错误处理包装函数:简化代码,又不能给人错误的假象
8.4
1.获取进程ID
P492
2.创建和终止进程
父进程和新创建的子进程最大的区别:有不同的PID
创建子进程函数:fork
关于fork函数的调用:P493-494
3.回收子进程
如果没有被父进程回收,调用init进程来回收他们。
等待子进程终止或停止:waitpid
关于waitpid函数:P495-496
4让进程休眠
Sleep函数和pause函数
5.加载并运行程序
当前进程的上下文中加载并运行一个新程序:execve
8.5
解决回收后台子进程——信号
1.信号术语
传送一个信号到目的进程由两个步骤组成:发送信号;接收信号
2.发送信号
内核通过更新目的进程上下文的某个状态,发送一个信号给目的进程。
P506-509(基于进程组的几种发送信号方式)
3.接收信号
P509-510(几种终止的情况)
4.信号处理问题
待处理信号被阻塞;
待处理信号不会排队等待;
系统调用可以被中断;
*不可以用信号来对其他进程中发生的事件计数。
8.6
非本地跳转:将控制直接从一个函数跳转到另一个当前执行的函数,而不需要正常的调用-返回序列。
非本地跳转通过:setjump函数和longjump函数提供。
P522.
心得:第八章重点讲了异常和进程提供的两个抽象。通过书上的例题,能更好的理解异常与过程调用的区别,也能理解进程并发、多任务的运用,多任务的运行提高了系统的吞吐量,处理机的效率也得到了提高。