1.异常
- 异常是异常控制流的一种形式,它一部分由硬件实现,一部分由操作系统实现。
- 异常就是控制流中的突变,用来响应处理器状态中的某些变化
- 在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用(异常),调用后,会发生以下3中情况中的一种:
- 处理程序将控制返回给当前指令
- 处理程序将控制返回给下一条指令
- 处理程序终止被中断的程序
- 系统中可能的每种类型的异常都分配了一个唯一的负整数的异常号。 其中一些号码是由处理器的设计者分配的(被零除、缺页、内存访问、断点以及算数溢出),其他号码是由操作系统内核的设计者分配的(系统调用和来自外部I/0设备的信号)。
- 在系统启动时,操作系统分配和初始化一张异常表。
异常表的起始地址放在一个叫做异常表基址寄存器的特殊CPU寄存器里。 - 异常和过程调用的不同之处:
- 异常的类别
- 中断:是异步发生的,是来自处理器外部的I/O设备的信号的结果。硬件中断的异常处理程序常常被称为中断处理程序
- 陷阱和系统调用:陷阱是有意的异常,是执行一条指令的结果。陷阱最重要的用途的就是系统调用(读文件,创建进程,加载新的程序或终止当前进程等)
普通函数调用和系统调用时不同的:一个运行在用户模式下,一个运行在内核模式下。 - 故障:故障由错误情况引起,它可能能够被故障处理程序修正,也能终止
经典的故障示例就是缺页异常。 - 终止:不可恢复的致命错误造成的结果,通常是一些硬件错误。
2.进程
- 异常是允许操作系统内核提供进程概念的基本构造块
- 进程的经典定义就是一个执行中程序的实例。系统中的每个程序都运行在某个进程的上下文中。上下文是由程序正确运行所需的状态组成的。包括内存中的程序的代码和数据等。
- 进程提供给应用程序的关键抽象:
- 一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器
- 一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用内存系统
- 逻辑控制流
- 并发流:一个逻辑流的执行时间上与另一个流重叠,称为并发流,这两个逻辑流被称为并发地运行。
- 多个流并发执行的一般现象被称为并发。一个进程和其他进程轮流运行的概念称为多任务。一个进程执行它的控制流的一部分的每一时间段叫做时间片。
- 并发流不是并行,和计算机核数无关。如果两个流并发地运行在不同的处理器核或计算机上,叫做并行流。
- 私有地址空间:进程为每个程序提供它自己的私有地址空间。一般而言,和这个空间中某个地址相关联的那个内存字节是不能被其他进程读或者写的。
- 用户模式和内核模式:处理器通常是用某个控制寄存器中的一个模式位来提供这种功能的,该寄存器描述了进程当前享有的特权。当设置了模式位,进程就运行在内核模式中,可以执行指令集的任何指令,访问系统中的任何内存位置。
- 上下文切换:操作系统内核使用一种称为上下文切换的较高层形式的异常控制流来实现多任务。
内存为每个进程维持一个上下文。上下文就是内核重新启动一个被抢占的进程所需的状态。它由一些对象的值组成,这些对象包括通用目的寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈和各种内核数据结构。 - 在进程执行的某一个时刻,内核可以决定抢占当前进程,并重新开始一个先前被强占的进程。这种决策就叫做调度。