CSAPP 第八章:异常控制流

  • 异常
    异常是异常控制流的一种形式,一部分有硬件实现,一部分有软件实现。 系统中每一种可能的异常都分配了一个非负整数的异常号,异常号是异常表的索引,就像数字的下标那样,异常表是一个跳转表,包含异常号对应异常处理程序代码的地址

  • 异常的类型
    异常的类型有中断,陷阱,故障,终止。

    • 中断:来之I/O设备的信号,是异步发生的,中断总是返回到下一条指令。
    • 陷阱:是有意的异常,一般用于系统调用syscall,同步发生的,总是返回到下一条指令。
    • 故障:由错误情况引起,它可能能够被故障处理程序修正。
    • 终止:是不可恢复的错误,是不可返回的,直接退出程序。
  • 进程
    进程是代码程序执行的一个实例。

    • 进程提供给应用程序的抽象:

      • 独立的逻辑控制流,(好像是程序独占CPU)。
      • 私有地址空间,(好像是程序独占内存系统)。
    • 逻辑控制流(logical control flow )就是一个进程在逻辑上的执行过程,因为CPU并不是一直只在执行某个单独进程的指令,但是从某个单独的进程的角度来看,这个进程就像是(只是像而已,所以叫逻辑上)独占着CPU一样。

    • 由于CPU不断地在各个进程间切换执行,所以多个进程就像是在同时运行一样,这种现象我们称作并发(concurrency )。每次CPU在某个进程中执行其指令的这一小段时间我们称作一个时间片(time slice)。注意,即使只有一个CPU,也可以有并发,但为了区分,我们把多个逻辑控制流在不同的处理器(核)上同时运行的现象称作并行执行(parallel execution )。

    • 每个进程都有自己的私有地址空间(private address space),大小为2^n,n为机器的地址位数。私有是指不能被其他进程读写。

    • 处理器提供一种机制,使进程可能在用户模式或内核模式下运行。在内核模式下,进程拥有更高的权限,比如能执行更多的指令、发起一次I/O操作等等。一个进程最初都是用户进程,只有通过异常才能到内核模式。在私有地址空间中,有一部分专门为内核模式分配的空间,包括代码、数据、堆和栈。

    • 线程切换(context switch)必须在内核模式下发生。比如,当一个进程请求内核服务后,通过trap进入内核模式,这时候内核就可以进行线程切换;或者当一个定时器触发了一次中断后,内核也可以进行线程切换。

  • 信号:一个信号就是一小条消息,它通知进程系统中发生了一个某种类型的事件。传送一个信号到目的地的进程是由两个不同的步骤组成的:

    • 发送信号: 内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程
    • 接收信号: 当目的进程被内核强迫以某种方式对信号的发送作出响应时,它就接收了信号。进程可以忽略这个信号,终止或通过执行一个称为信号处理程序的用户层函数来捕获这个信号
  • 非本地跳转:C语言提供了一种用户级异常控制流形式,它将控制直接从一个函数转移到另一个当前正在执行的函数,而不需要经过正常的调用、返回序列,称作非本地跳转

  • Linux进程工具:
    STRACE: 打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹
    PS: 列出当前系统中的进程(包括僵死进程)
    TOP: 打印出关于当前进程资源使用的信息
    PMAP: 显示进程的内存映射

你可能感兴趣的:(CSAPP 第八章:异常控制流)