进程的状态

1) 创建

步骤 ​

1.为一个新进程创建PCB,并填写必要的管理信息 ​

2.把该进程转入就绪状态并插入就绪队列之中

触发创建的场景 ​ (1) 系统初始化 ​ (2) 作业调度 ​ (3) 提供服务 ​ (4) 应用请求

2) 就绪(Ready)

进程已分配到除CPU以外的所有必要资源后, 只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态,多个处于就绪状态的进程会形成一个就绪队列 ​

3) 执行(Running)

进程已获得CPU(执行权), 其程序正在执行 ​ 在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态

4) 阻塞(Blocked)

​ 正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,即阻塞 ​ 也称为等待状态或封锁状态 ​

阻塞状态的进程也会排成一个队列,由于不同原因导致的阻塞,可以会形成多个队列

5) 终止​

步骤 ​

1.OS将该进程标记为终止 ​

2.资源释放和回收 ​ 终止态的进程不能再执行,但会保留一个记录(保存状态码和一些计时统计数据),供其它进程收集 ​ 等待操作系统进行善后处理,然后将其PCB清零, 并将PCB空间返还系统,该进程被删除 ​

进入终止的原因

​ 1)正常结束 ​ 自然结束:运行到Holt指令(最后一条指令)时,将产生一个中断,去通知OS本进程已经完成

2)异常结束 ​ 由于出现某些错误和故障而迫使进程终止 ​ 越界错误, ​ 保护错误, ​ 非法指令, ​ 特权指令错误, ​ 运行超时, ​ 等待超时, ​ 算术运算错误, ​ I/O故障

​ 3)外界干预 ​ 进程应外界的请求而终止运行 ​ 被操作员或操作系统终结 ​ 被其他有终止权的进程(父进程)所终结

进程控制

操作系统中的进程控制是通过原语来进行的

创建原语:create()

阻塞原语:block()

唤醒原语:wakeup()

撤销原语:destroy()

挂起原语:suspend()

激活原语:active()

阻塞和唤醒

引起进程阻塞和唤醒的事件

1) 请求系统服务 等待OS分配打印机服务

2) 启动某种操作 等待I/O操作完成

3) 新数据尚未到达 B进程等待A进程的数据输入

4) 无新工作可做 进程空闲,等待新任务到来

进程阻塞过程是进程调用阻塞原语block()把自己阻塞 进程的阻塞是一种主动行为

具体过程:

1.立即停止执行

2.由执行状态(Running)改为阻塞状态(Blocked)

3.将PCB插入阻塞队列 因不同事件进行阻塞的进程可能会形成多个阻塞队列,直到调度程序进行重新调度它们

进程唤醒过程:

1.把被阻塞的进程从等待该事件的阻塞队列中移出

2.将其PCB中的现行状态改为就绪,再将该PCB插入到就绪队列中 被唤醒的进程进入就绪状态(Ready)

被阻塞进程必须由其它进程或者操作系统唤醒,否则将一直处于阻塞状态,从而再无机会继续运行

挂起与激活

概念

1.使正在执行的进程暂停执行变为静止状态;

2. 若此时用户进程正处于就绪状态而未执行, 则该进程暂不接受调度,则将进程挂起变为静止状态以便用户研究其执行情况或对程序进行修改

此时,我们把这种静止状态称为挂起状态

挂起的原因

(1) 终端用户的请求 发现可疑问题,希望进程静止下来

(2) 父进程请求 父进程希望挂起子进程,以便协调各子进程间的活动

(3) 负荷调节的需要 负荷较重,挂起不重要的进程

(4) 操作系统的需要 OS检查资源使用情况,或进行记账

挂起过程

首先检查被挂起进程的状态, 若处于活动就绪状态, 便将其改为静止就绪 对于活动阻塞状态的进程,则将之改为静止阻塞 若被挂起的进程正在执行,则转向调度程序重新调度 把该进程的PCB复制到某指定的内存区域,方便用户或父进程考查该进程的运行情况

进程激活

由父进程或用户进程请求激活

激活原语先将进程从外存调入内存 检查该进程的现行状态,若是静止就绪,便将之改为活动就绪 若为静止阻塞,便将之改为活动阻塞

状态转换

挂起称为静止状态,非挂起称为活动状态

(1) 创建→活动就绪:在当前系统的性能和内存的容量均允许的情况下, 完成对进程创建的必要操作后,相应的系统进程将进程的状态转换为活动就绪状态

(2) 创建→静止就绪:考虑到系统当前资源状况和性能要求, 并不分配给新建进程所需资源, 主要是主存资源,相应的系统进程将进程状态转为静止就绪状态,对换到外存, 不再参与调度, 此时进程创建工作尚未完成

(3) 活动就绪→静止就绪 ​ 未被挂起的就绪状态(Readya)–(Suspend原语)–>静止就绪状态(Readys),Readys状态不会被调度

​ (4) 活动阻塞→静止阻塞 ​ 未被挂起的阻塞状态(Blockeda)–(Suspend原语)–>静止阻塞状态(Blockeds),Blockeds状态不会被调度

​ (5) 静止就绪→活动就绪 ​ 静止就绪状态(Readys)–(Active原语)–>活动就绪状态(Readya),Readya状态可以被调度

​ (6) 静止阻塞→活动阻塞 ​ 静止阻塞状态(Blockeds)–(Active原语)–>活动阻塞状态(Blockeda),Blockeda状态可以被调度

进程调度

调度的概念

调度的基本概念 在多道程序系统中,根据一定的算法(公平、高效)将处理机重新分配给就绪队列中的进程去执行,以实现进程并发执行的过程

调度的前提是,进程的数量往往远大于处理机个数,造成进程争用处理机的现象,所以需要将处理机资源在不同的进程间调度 进程调度的主要问题就是采用某种算法合理有效地把处理机分配给进程,其调度算法应尽可能提高资源的利用率,减少处理机的空闲时间

调度的层次

1)高级调度/作业调度 (High-Level Scheduling) 按一定原则从外存处于后备状态的作业中挑选一个(或多个),给它们分配资源(内存、I/O设备等)并建立进程,以使它们获得竞争处理机的权利 把后备作业调入内存运行 只调入一次,调出一次 通俗的说,就是把程序从硬盘加载到内存中运行的过程

2)中级调度/内存调度 (Intermediate-Level Scheduling),提高内存利用率和系统吞吐量 将暂时不能运行的进程挂起并调至外存(比如硬盘上的虚拟内存)等待,条件合适时再调入内存就绪 在内、外存对换区进行进程对换

3)低级调度/进程调度 (Low-Level Scheduling) 是一种最基本的调度,频率非常高(几十毫秒一次,相当于一个时间片完成) 从就绪队列中选取进程分配给处理机

三级调度的关系

1)作业调度为进程活动做准备,进程调度使进程正常活动起来,中级调度将不能运行的进程挂起。中级处于作业和进程调度之间

2)作业调度次数少,中级略多,进程调度最高

3)进程调度是最基本的

进程调度方式

剥夺调度方式/抢占式

立即暂停正在执行的进程,将处理机分配给另一个更重要或优先级更高的进程 ​ 更高效 ​ 原则 ​ 优先权 ​ 短进程优先 ​ 时间片原则

非剥夺调度方式/非抢占式(或协作式)

若有进程请求执行,等待当前正在执行进程完成或因某种原因阻塞,才把处理机分配给请求进程 ​ 优点是实现简单,系统开销小(切换频次低了) ​ 缺点是适用批处理系统,不适用大多分时和实时系统

衡量进程调度性能指标

  1. CPU利用率 越高,说明该资源使用率越高

  2. 系统吞吐量:单位时间内CPU完成作业量 长作业耗时,短作业则能提高吞吐量 调度算法和方式不同,对OS吞吐量产生较大影响

  3. 周转时间:作业从提交到完成经历的时间 包括等待、就绪队列的排队,处理机上的运行、输入输出花费时间的总和

  4. 等待时间:进程等待时间总和 调度算法不影响作业执行或输入输出时间,只影响作业在就绪队列中等待时间 所以,衡量调度算法的优劣,考察等待时间即可

  5. 响应时间:用户提交请求到系统首次响应花费的时间 交互是系统中衡量调度算法的重要准则 应尽量降低响应时间,控制在用户可接受范围内 调度程序一方面要满足特定系统用户的要求(实时和交互进程要求快速响应),另一方面要考虑系统整体效率(减少整个系统进程平均周转时间)和调度算法本身的开销

进程切换(上下文切换)

处理机从一个正在运行的进程上切换到另一个进程去执行

切换过程

0.检查是否允许上下文切换,有可能某进程处于原语操作中,不允许切换

1.保存当前进程的上下文,包括程序计数器和寄存器

2.更新PCB信息

3.把此进程的PCB移入队列,比如就绪队列,或因某种事件的阻塞队列

4.选择另一个(就绪状态)进程执行,并更新其PCB

5.更新内存管理的数据结构

6.恢复所选进程的上下文,将CPU执行权交给所选进程

过程

(1)记录系统中所有进程的现场信息。

(2)确定分配处理机的原则。

(3)分配处理机给进程。

(4)从进程收回处理机