异常控制流(ECF):为什么重要,主要是理解系统概念,应用程序和系统是如何交互的,理解并发,了解软件异常如何工作。
事件:状态变化:触发异常。
异常类别:
类别 | 原因 | 异步/同步 | 返回行为 |
中断 | 来自I/O的信号 | 异步 | 返回到下一条指令 |
陷阱 | 有意的异常 | 同步 | 返回到下一条指令 |
故障 | 潜在的可恢复的错误 | 同步 | 可能返回到当前指令 |
中值 | 不可恢复的错误 | 同步 | 不返回 |
后面这三个是故障指令。第一个指令是正常指令,指的是计算机同时处理多任务的能力
陷阱(trap)最重要的用途就是在用户程序和内核之间提供一个想过程一样的接口,例如读、写、创建进程,加载程序等。此时通过系统调用实现时钟中断,时间片可以轮转。
故障:经典实例:缺页异常。当虚拟地址对应的物理页面不在存储器中需要加载,这时就出现了缺页异常。
终止:异常退出。
进程:进程是执行中程序的实例。系统的每个程序的都是运行在进程的上下文中(context)。
进程对应用程序的抽象:逻辑控制流:好像是独一无二的程序。私有的地址空间:好像程序独占存储器系统
逻辑控制流:挂起。上下文切换。高速缓存污染
并发流:并发与并行。
进程控制:父进程建立子进程,并且系统自动销毁,当父进程终止时。
进程状态:运行,挂起,终止。
子进程复制了全部父进程的堆栈、数据区和代码区内容,。
特性:
- 调用一次,返回两次:子进程PID为0;父进程为...
- 并发执行:父进程和子进程是两个独立进程,内核能够以任意的方式执行逻辑控制流的指令。
- 相同但是独立的地址空间
- 共享文件(为什么能一起printf出来)
信号:个语言和系统都是类似的。还有框架,例如MFC。
并发错误:同步流,例子:如果先运行了子进程,内核注意到子进程,发出一个信号给父进程,然后运行了父进程的之前一部分指令,此时父进程处理了信号,此时子进程已经被删除了,但是父进程仍然运行addjob的代码,把不存在的子进程加入到任务列表中。
竞争的经典案例。