ch08 异常控制流

目录

教材内容

一、异常
  • 控制流中的突变,用来响应处理器状态中的某些变化
  • 是异常控制流的一种形式,一部分由硬件实现,一部分由操作系统实现
  1. 异常处理
  • 异常号:系统中可能的每种类型的异常都有,唯一的,非负整数
  • 异常表基址寄存器
  1. 异常类别
  • 中断:异步发生,来自处理器外部的I/O设备信号,总是返回到下一条指令
  • 陷阱:同步发生,有意的异常,总是返回到下一条指令。(与系统调用有关)
  • 故障:同步发生,潜在可恢复的错误,可能返回到当前指令
  • 终止:同步发生,不可恢复的错误,不会返回
  1. Linux/IA32系统中的异常
  • 除法错误(0):浮点异常
  • 一般保护故障(13):段故障
  • 缺页(14):重新产生故障指令
  • 机器检查(18):硬件错误,不返回
  • 系统调用(128 0x80):c程序用syscall函数可以直接调用任何系统调用
  • 所有的到Linux系统调用的参数都是通过通用寄存器而不是栈传递的,寄存器%eax包含系统调用号
二、进程
  • 一个执行中的程序的实例。
  • 系统中的每个程序都是运行在某个进程的上下文中的
  1. 逻辑控制流(逻辑流)
    程序计数器PC的值得序列
  2. 并发流
    一个逻辑流的执行在时间上与另一个重叠
  • 多任务:一个进程和其他进程轮流运行(时间分片)
  • 时间片:一个进程执行它的控制流的一部分的每一时间
  1. 私有地址空间
  • 32位进程:代码段从地址0x08048000开始
  • 64位进程:代码段从地址0x00400000开始
  1. 用户模式和内核模式
  • 用户模式:未设置模式位,不允许执行特权指令以及直接引用地址空间中内核区内的代码和数据
  • 内核模式:设置模式位,可以执行指令集中的任何指令,访问系统中任何存储器的位置
  1. 上下文切换
  • 保存当前进程的上下文
  • 恢复某个先前被抢占的进程的被保存的上下文
  • 将控制传递给这个新恢复的进程
四、进程控制
  1. 获取进程id
  • PID:每个进程唯一,正数
  • getpid函数:返回调用进程的PID,pid_t的整数值,types.h(int)
  • getppid函数:返回父进程的PID,pid_t的整数值,types.h(int)
  1. 创建和终止进程
  • 程序员的角度,进程三种状态:运行、停止、终止
  • 父进程通过调用fork函数创建一个新的运行子进程
  • fork函数:
    • 调用一次,返回两次
    • 并发执行
    • 相同但是独立的地址空间
    • 共享文件
  1. 回收子进程
    进程终止后保持已终止状态直到被父进程回收,终止未被回收的称作僵死进程。
  • 一个进程可以通过调用waitpid来等待它的紫禁城终止或停止
  • wait(&status)等价于waitpid(-1,&status,0)
  1. 让进程休眠
  • sleep函数
  • pause函数
  1. 加载并运行程序
  • execve函数:在当前进程的上下文中加载并运行一个新程序

课下测试总结

  • 在硬件层,硬件检测到的事件会触发控制突然转移到另一个信号处理程序,即中断。
  • 上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
  • 不能用char[][] 来传递argv,结尾的0(null)无法处理;system=fork+exec+wait;
  • 非本地跳转是通过setjmp和longjmp函数来提供的

参考资料

wait函数详解
fork函数详解