6.1 基本技巧:受限直接执行
6.2 问题1:受限制的操作
直接执行的明显优势是快速。该程序直接在硬件CPU上运行。但是如果进程希望执行某种受限操作(如向磁盘发出I/O请求或获得更多系统资源(如CPU或内存)),该怎么办?
为了防止任何用户进程向磁盘发出I/O等越权行为的操作,我们引入一种新的处理器模式,称为用户模式。在用户模式下运行的代码会受到限制。例如,在用户模式吓,进程不能发出I/O请求。
内核模式下运行的代码可以做受限指令。
- 如果用户希望执行特权操作,就要执行系统调用
要执行系统调用,程序必须执行特殊的陷阱指令。该指令同时跳入内核并将特权级别提升到内核模式。返回时回到用户模式。
- 陷阱如何知道在OS内运行那些代码
6.3 问题 2:在进程之间切换
如果一个进程在CPU上运行,这就意味着操作系统没有运行。如果操作系统没有运行,那么如何实现进程的切换?
- 协作方式:等待系统调用
运行时间过长的进程被假定会定期放弃CPU,以便操作系统可以决定运行其他任务。大多数进程通过系统调用,将CPU的控制权转移给操作系统。
OS通过被动等待系统调用或者某种非法操作发生,从而重新获得CPU控制权,不太理想。
- 非协作方式:操作系统进行控制
没有硬件的帮助,如果进程拒绝进行系统调用,那么操作系统永远无法重获CPU控制权
时钟中断:操作系统在每个几毫秒发生的时钟中断时,运行预先配置的中断处理程序,此时操作系统重获CPU控制权。
- 保存和恢复上下文
如果切换进程,那么OS就要执行一些底层代码,即上下文切换:OS要为正在执行的进程保存一些寄存器的值(到它的内核栈),并为即将执行的进程恢复一些寄存器的值(从它的内核栈)。
通过切换栈实现