0%

CSAPP 学习笔记 6 异常控制流

最近看了CSAPP的第八章——异常控制流。

异常

在计算机中,假如没有异常,那么指令是顺序执行的。当遇到异常时,会执行异常处理程序。异常有不同的种类,有中断、陷阱、故障、终止。

中断,是在CPU执行某条指令的时候,其他部件异步产生的,比如定时器芯片、磁盘控制器、网络适配器等。CPU检测到中断后,会把当前指令执行完,然后转去执行异常处理程序,接着再返回来执行下一条指令。

陷阱,是有意的异常,最常见的陷阱是系统调用。系统调用,是指从用户模式转为内核模式,以执行一些特殊的指令,比如操作I/O设备。执行完系统调用后,会返回来执行下一条指令。

故障,是指执行指令的时候遇到了意外,比如遇到了缺页、访问了未定义的虚拟内存区域等。根据故障的不同,异常处理程序执行完后可能会返回执行当前指令,也有可能会终止程序。在写程序时常常遇到的Floating point exceptionSegmentation fault就属于故障,且在Linux中的处理是程序被终止。

终止,是指遇到了致命的硬件错误,必须结束程序。

因为异常种类繁多,所以计算机中有一张异常表,用来记录不同的异常及对应的异常处理程序。在CPU中,有一个特殊的寄存器——异常表基址寄存器,用来存放异常表在内存中的基址。当CPU遇到一种异常的时候,会拿到一个异常号。CPU拿着这个异常号及寄存器中的基址,便可以找到对应的异常处理程序了。

进程

进程,是执行中的程序实例,是操作系统对于程序的一种抽象。这种抽象,使得看起来进程是独占cpu和内存的。为了实现这种抽象,需要操作系统保存好进程的上下文,进行进程调度。

进程的上下文,是指进程执行的状态,包括CPU中的状态、用户模式中的状态、内核模式中的状态。具体来说,cpu中的状态,包括各种寄存器,比如通用寄存器,用来保存指令执行用到的数据,还有程序计数器,用来指明程序执行的进度。用户模式下的状态,包括用户栈等。内核模式中的状态,包括内核栈、进程已打开文件的信息的文件表、有关当前进程的信息的进程表等。

什么时候会触发进程调度呢?主要有两种情况。一种是进程执行了系统调用,阻塞住了,比如读写文件、sleep等。另一种是中断,包括IO操作完成以及时钟中断等。

操作进程的工具

  • PS:列出当前系统中的进程。
  • TOP:打印出关于当前进程资源使用的进程。
  • PMAP:显示进程的内存映射。
  • STRACE:打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹。-static是个实用的参数。
  • /proc:一个虚拟文件系统,以ASCII文件格式输出大量内核数据结构的内容。

(全文完)