process scheduling
process scheduling
进程切换
中断源
- 外中断:来自处理器之外的硬件中断信号
- 如时钟中断、键盘中断、外围设备中断
- 外部中断均是异步中断,所谓的异步就是随机
- 内中断(异常 Exception):来自于处理器内部,指令执行过程中发生的中断,属同步中断
- 硬件异常:掉电、奇偶校验错误等
- 程序异常:非法操作、地址越界、断点、除数为0
- 系统调用
由于系统调用是内中断所以系统调用存在陷阱机制(这才是系统调用陷阱机制的原因)
外中断是不可预测的是随机的。但是内中断(异常)的发生均是在预定指令的执行过程中发生的,所以异常属于同步中断
中断处理过程
在详细的说一遍中断的过程:
- 程序在用户态执行时由于自身原因遇到了异常或由于外部时间导致程序产出中断
- save the context(上下文) of the executing process,如当前寄存器状态,cpu时间片使用
- 陷入内核态,determine(确认) the cause of exception or interrupt,Handle the exception / interrupt
- select a process to restore and resume(复原) 选择要恢复的进程
restore the context of the selected process 恢复所选择进程的上下文
resume execution of the selected process 恢复所选择进程的执行
特权指令和非特权指令
- Privileged(特权) Instructions : The Instructions that can run only in Kernel Mode are called Privileged Instructions .
- I/O instructions and Halt(停顿/暂定) instructions
- Turn off all Interrupts 关闭所有中断
- set the Timer(定时器)
- process switching(切换)
- Non-Privileged Instructions : The Instructions that can run only in User Mode are called Non-Privileged Instructions
模式切换
中断是用户态向核心态转换的唯一途径!系统调用 实质上也是一种中断
OS提供Load PSW
指令装载用户进程返回用户状态
进程切换
切换时机
进程需要进入等待状态,主动离开CPU可能因为执行 IO 操作
进程被抢占CPU而进入就绪状态,被动离开可能因为时间片切换
进程切换一定发生在中断/异常/系统调用处理过程中,常见的有以下情况:
- 时间片中断、IO中断后 更改优先级进程;(导致被中断进程进入就绪态);
- 阻塞式系统调用、虚拟地址异常;(导致被中断进程进入等待态)
- 终止用系统调用、不能继续执行的异常;(导致被中断进程进入终止态)
切换过程
- 由用户态切换到内核态,之后的切换工作均在内核态完成
- 保存被中断进程的上下文信息(Context)
- 修改被中断进程的控制信息(如状态等)
- 将被中断的进程加入相应的状态队列 ,若为等待状态则进入等待状态的队列
- 调度一个新的进程并恢复它的上下文信息
进程控制
A Process Control Block(PCB)contains many pieces of information associated(与……有关) with a specific(特定的) process.
每个进程中都有一个PCB控制块
PCB进程控制块中包含了
process state:进程状态,如就绪,等待,运行
process num:进程号 pid
programe counter
registers:寄存器的值
memory limits:内存信息,如:加载地址,最大上限,虚拟地址
list of open file:进程所打开的文件描述符
等一系列信息
进程在物理内存
存放方式如图:
进程实际在物理内存中并不是连续存放的,而是离散的
进程队列
如图,第一个队列为就绪队列,其余均为等待队列。等待队列有多个是因为针对不同的IO设备存在对应个数的等待对垒。没有运行队列的原因,对于单处理器来说哦同一时间只有一个进程可以运行。
注意进程队列中存放的是对于进程的PCB信息而非进程的全部信息,因为PCB足以描述进程切换所用到的信息
进程调度(process sheduling)
进程在整个生命周期中会在各个调度队列中迁移, 由操作系统的一个调度器(scheduler)来执行。
如图:显示了进程调度中可能的情况,从等待状态 - > 就绪状态 - > 运行状态 , 这个迁移过程是由 scheduler 完成的
由于学过linux系统编程了实验二就是fork函数的使用,我就没有做