进程按以下步骤创建:
- 给新进程分配一个唯一的进程标识符
- 给新进程分配空间(包括进程映像中的所有元素)
- 初始化进程控制块
- 设置正确的连接(保存到相应队列)
会导致创建进程的事件:
会导致终止进程的事件:
运行态->就绪态:1)超时:即正在运行的进程到达了”允许不中断执行“的最大时间段(所有多道程序操作系统都实现了这类时间限定)2)优先级低的进程被优先级高进程抢占(并不是所有操作系统都实现了)
图b)中一个事件对应一个队列。当事件发生时,相应队列中的所有进程都转换到就绪态
除此之外,就绪队列也可以按照优先级组织成多个队列
考虑一个没有使用虚拟内存的系统,每个被执行的进程必须完全载入内存,因此,2.3图b)中,所有队列中的所有进程必须驻留在内存中
所有这些设计机制的原因都是由于I/O活动比计算速度慢得多,因此在单道程序系统中的处理器大多数时候是空闲的。但是2.3图b)的方案并未完全解决这个问题。在这种情况下,内存保存有多个进程,当一个进程正在等待时,处理器可以转移到另一个进程,但是处理器比I/O要快的多,以至于内存中所有的进程都在等待I/O的情况很常见。因此,即使是多道程序设计,大多数时候处理器仍然处于空闲
因此,可以把内存中某个进程的一部分或全部移出到磁盘中。当内存中没有处于就绪状态的进程时,操作系统就把被阻塞的进程换出到磁盘中的”挂起队列“。操作系统在此之后取出挂起队列中的另一个进程,或者接受一个新进程的请求,将其纳入内存运行
“交换”是一个I/O操作,因而也可能使问题更加恶化。但是由于磁盘I/O一般是系统中最快的I/O(相对于磁带或打印机I/O),所以交换通常会提高性能
- 就绪/挂起->就绪:1)内存中没有就绪态进程,需要调入一个进程继续执行;2)处于就绪/挂起的进程具有更高优先级
- 就绪->就绪/挂起:1)如果释放空间以得到足够空间的唯一方法是挂起一个就绪态的进程;2)如果操作系统确信高优先级的阻塞态进程很快将会就绪,那么可能会挂起一个低优先级的就绪态进程而不是一个高优先级的阻塞态进程
- 新建->就绪/挂起:进程创建需要为其分配内存空间,如果内存中没有足够的空间分配给新进程,会使用”新建->就绪/挂起“转换
- 阻塞/挂起->阻塞:比较少见。如果一个进程终止,释放了一些内存空间,阻塞/挂起队列中有一个进程比就绪/挂起队列中任何进程的优先级都要高,并且操作系统有理由相信阻塞进程的事件很快就会发生
- 运行->就绪/挂起:如果位于阻塞/挂起队列中的具有较高优先级的进程变得不再阻塞,操作系统抢占这个进程,也可以直接把这个进程转换到就绪/挂起队列中,并释放一些内存
操作系统为了管理进程和资源,必须掌握关于每个进程和资源当前状态的信息。普遍使用的方法是:操作系统构造并维护它所管理的每个实体的信息表:
内存表用于跟踪内(实)存和外存(虚拟内存)
使用进程映像来描述一个进程,进程镜像包括:程序、数据、栈和进程控制块(属性的集合):
下图为一个典型的进程映像结构:
大多数处理器至少支持两种执行模式:
- 用户态
- 内核态(系统态、控制态):软件具有对处理器及所有指令、寄存器和内存的控制能力
使用两种模式的原因是很显然的,它可以保护操作系统和重要的操作系统表(如进程控制块)不受用户程序的干涉
处理器如何知道它正在什么模式下执行及如何改变模式?
程序状态字(PSW)中有一位表示执行模式,这一位应某些事件的要求而改变。在典型情况下,
- 当用户调用一个操作系统服务或中断触发系统例程的执行时,执行模式被设置为内核态
- 当从系统服务返回到用户进程时,执行模式被设为用户态
在下列事件中,进程可能把控制权交给操作系统:
- 系统中断:
- 中断:与当前正在运行的进程无关的某种类型的外部事件相关。控制首先转移给中断处理器,做一些基本的辅助工作后,转到与已经发生的特定类型的中断相关的操作系统例程
- 陷阱:与当前正在运行的进程所产生的错误或异常条件相关。操作系统首先确定错误或异常条件是否是致命的。1)如果是,当前进程被换到退出态,发生进程转换;2)如果不是,动作取决于错误的种类或操作系统的设计,可能会进行一次进程切换或者继续执行当前进程
- 系统调用:转移到作为操作系统代码一部分的一个例程上执行。通常,使用系统调用会把用户进程置为阻塞态
进程切换步骤如下: 1. 保存处理器上下文环境(包括程序计数器和其它寄存器) 2. 更新当前处于运行态进程的进程控制块(状态和其它信息) 3. 将进程控制块移到相应队列 4. 选择另一个进程执行 5. 更新所选择进程的进程控制块(包括将状态变为运行态) 6. 更新内存管理的数据结构 7. 恢复处理器在被选择的进程最近一次切换出运行状态时的上下文环境
进程切换一定有模式切换;模式切换不一定有进程切换(中断会发生模式切换,但是在大多数操作系统中,中断的发生并不是必须伴随着进程的切换的。可能是中断处理器执行之后,当前正在运行的程序继续执行);