第八章 异常控制流
学习目标:
1.了解异常及其种类
2.理解进程和并发的概念
3.掌握进程创建和控制的系统调用及函数使用:fork、exec、wait、waitpid、exit、getpid、getppid、sleep、pause、setenv、unsetenv。
4.理解数组指针、指针数组、函数指针、指针函数的区别
5.理解信号机制:kill,alarm,signal,sigaction
6.掌握管道和I/O重定向:pipe, dup, dup2
异常控制流简介(ECF)
1、控制转移:从ak到ak+1指令的过渡。
2、异常控制流(Exceptional Control Flow, ECF):现代操作系统通过使控制流发生突变来对系统状态做出反应。
3、ECF是操作系统用来实现I/O、进程和虚拟存器的基本机制,是计算机系统中实现并发的基本机制。
异常
1、异常是异常控制流的一种形式,是控制流中的突变,用来响应处理器状态中的某些变化,由硬件和操作系统实现。
2、事件:状态变化,可能和当前指令的执行有关。
3、异常处理程序完成后会发生的情况:
1)处理程序将控制返回给事件发生时正在执行的当前指令
2)处理程序将控制返回给没有发生异常将会执行的下一条指令
3)处理程序终止被中断的程序
4、异常表与异常号
1)异常表:当处理器检测到有事件发生时,它会通过跳转表,进行一个间接过程调用(异常),到异常处理程序。系统启动时操作系统分配和初始化一张异常表。
2)异常号:系统中可能的某种类型的异常都分配了一个唯一的非负整数的异常号。异常号是到异常表中的索引,异常表的起始地址放在一个叫做异常表基址寄存器的特殊CPU寄存器里。
5、异常的类别
6、Linux/IA32系统中的异常
1)故障和终止
除法错误(浮点异常)
异常0 原因:除以零,或结果太大 终止程序
一般保护故障(段故障)
异常13 原因:程序引用了一个未定义的虚拟存储器区域,或因为程序试图写一个只读的文本段 终止程序
缺页
异常14 重新执行产生故障的指令 返回当前地址
机器检查
异常18 在导致故障的指令执行中检测到致命的硬件错误 终止程序
7、系统调用
进程
1、基本概念
1)进程的经典定义:一个执行中的程序的实例
2)并发:多个流并发的执行
3)多任务:一个进程和其他进程轮流运行(也叫时间分片)
4)时间片:一个进程执行它的控制流的一部分的每一时间段
5)并行:两个流并发的运行在不同的处理机核或者计算机上。
并行流并行的运行,并行的执行。
注:私有地址空间—进程为程序提供的假象,好像它独占的使用系统地址空间。一般而言,和这个空间中某个地址相关联的那个存储器字节是不能被其他进程读写的。
2、用户模式和内核模式—指的是对系统资源使用的权限。
1)模式位
2)转换模式
3)/proc文件系统
3、上下文切换—内核代表用户执行系统调用时(进程休眠)或者中断
系统调用错误处理
Unix系统中的错误处理及错误处理包装函数
Unix风格的错误处理
Posix风格的错误处理
DNS风格的错误处理
进程控制
1)进程的三种状态:运行、停止、终结
2)创建进程
父进程通过调用fork函数来创建一个新的运行子进程。fork函数定义如下:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
fork函数只被调用一次,但是会返回两次:父进程返回子进程的PID,子进程返回0.如果失败返回-1。
3)终止进程
exit函数
#include <stdlib.h>
void exit(int status);
exit函数以status退出状态来终止进程。
信号
传送一个信号到目的进程
1)发送信号。
发送信号的两种原因:
内核检测到一个系统事件。
一个进程调用了kill函数,显式地要求内核发送一个信号给目的进程,一个进程可以发送信号给它自己。
2)接收信号。
3)注:
待处理信号被阻塞。Unix信号处理程序通常会阻塞当前处理程序正在处理的类型的待处理信号。
待处理信号不会排队等待。任意类型至多只有一个待处理信号。因此,如果有两个类型为K的信号传送到一个目的进程,而由于目的进程当前正在执行信号K的处理程序,所以信号K时阻塞的,那么第二和信号就简单地被简单的丢弃,不会排队等待。
系统调用可以被中断。像read、wait和accept这样的系统调用潜在地会阻塞进程一段较长的时间,称为慢速系统调用。在某些系统中,当处理程序捕获到一个信号时,被中断的慢速系统调用在信号处理程序返回时不再继续,而是立即返回给用户一个错误的条件,并将errno设置为EINTR。
4)重要的教训:不可以用信号来对其他进程中发生的事件计数。
其他学习内容:
可移植的信号处理
显式地阻塞和取消阻塞信号
同步流避免并发错误
参考资料——20135317韩玉琪同学的博客