1.1 进程基本概念
程序顺序执行
- 程序执行方式必须是顺序的
- 一个应用程序可分成若干程序段
特征:
- 顺序性。处理机在执行程序时,严格按照程序所规定的顺序执行,即每一操作都必须在下一操作开始之前完成。
- 封闭性。程序一旦开始运行就独占系统资源,只有本程序才能改变资源的状态,执行结果不受外界条件的影响。
- 可再现性。只要初始条件和运行环境相同,多次执行同一程序,都会得到相同的结果。
程序并发执行
提高计算机系统的资源利用率,现代计算机普遍采用并发操作。程序的并发执行可以大大提高系统的吞吐量
- 不同程序之间
- 同一程序内部
特征:
- 间断性。为了完成同一项任务而相互合作的多个程序并发执行时,由于互相协调、相互制约会导致“暂停—执行—暂停”的间断性运行规律。
- 失去封闭性。程序在并发执行时,多个程序需要共享系统中的多种资源。所以,这些资源的状态是由多个程序改变的,从而使程序的运行失去了封闭性。
- 不可再现性。程序在并发执行时,由于失去了封闭性,从而导致其失去可再现性。
进程
进程的定义:
- 进程是程序在处理机上的一次执行过程
- 可并发执行且具有独立功能的程序在一个数据集合上的运行过程,它是操作系统进行资源分配和调度的基本单位
进程的特征:
- 动态性 :进程的实质是程序的一次执行过程,是个动态的概念,有一定的生命周期,要经历创建、执行、撤销过程
- 结构性:由进程控制块、程序段和数据段组成
- 并发性 :在一个系统内可以同时存在多个进程,它们通过交替使用处理器,从而实现并发执行
- 异步性:进程之间在交替使用计算机资源时没有强制的顺序,按各自独立的、不可预知的速度向前推进
- 独立性:进程在系统中是一个可独立运行的、具有独立功能的基本单位,也是系统分配资源和进行调度的独立单位
进程与程序的比较
- 二者的区别
- 进程是动态的,程序是静态的
- 程序是指令集合,是静态概念。 进程是程序在处理机上的一次执行的过程,是动态的概念。
- 进程是暂时的,程序是永久的
- 进程与程序的组成不同
- 进程可创建其他进程,而程序并不能形成新的程序
- 进程是一个独立的运行单位,能与其它进程并发(并行)执行。而程序则不可以并发执行。
- 二者的联系
- 通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
进程的状态和转换
三大基本状态:
- 就绪状态(Ready)
- 进程已获取到除CPU之外的所有必要资源,只要再得到CPU,就可以马上投入运行
- 运行状态(Running)
- 处于就绪状态的进程得到CPU控制权后,就可以使用处理器进行数据运算和处理
- 阻塞状态(Wait)
- 当一个进程正在等待某个事件的发生(如等待I/O的完成)而暂停执行,这时,即使分配有CPU时间,它也无法执行,则称该进程处于阻塞状态,又称等待状态。
进程在执行过程中的状态会不断变化
引入挂起状态
在引入挂起状态的操作系统中,又增加了静止就绪和静止阻塞两个新的进程状态
引起进程挂起的原因:
- 调节系统负荷的需要
- 用户请求
- 父进程请求
- 系统需要
进程控制块(Process Control Block)
操作系统为了管理进程而设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程。
- 内容
- 进程标识符:标识符、名、用户标识符、进程组
- 进程调度信息:当前状态、优先级、外存地址、阻塞原因、运行统计信息等
- 处理器现场保护结构:通用寄存器、指令记数器、程序状态字、栈指针等
- 进程控制信息:代码执行入口地址、进程同步和通信机制、资源清单,链接指针等
- 作用
- PCB能够使多道程序环境下一个不能独立运行的程序,能够独立执行,并且可以和其他进程并发执行
- PCB是进程存在的唯一标志
- PCB常驻内存,存放在为OS专门开辟的PCB区域
1.2 进程控制
进程控制是进程管理中的最基本功能。一般由操作系统内核来完成。
通常将与硬件密切相关的模块放在紧挨硬件的软件层中,并使它们常驻内存,以提高操作系统的运行效率,通常将这部分称为操作系统内核。
大多数操作系统内核都包含支撑功能和资源管理功能
- 支撑功能
- 中断处理
- 时钟处理
- 原语操作
- 进程控制原语主要有:创建原语、撤销原语、挂起原语、激活原语、阻塞原语以及唤醒原语。
- 资源管理功能
- 进程管理
- 存储器管理
- 设备管理
原语:一旦执行,不可停止
进程控制内容:
- 进程的创建与撤销
- 进程的阻塞与唤醒
- 进程的挂起与激活
进程的创建与撤销
创建进程
不论是系统还是用户,创建进程的操作必须调用创建原语来实现。
创建原语的主要功能:
- 新进程申请获得惟一的数字标示符,并从PCB集合中获取一个空白PCB
- 为新进程的程序和数据以及用户栈分配必要的内存空间
- 对PCB进程初始化
- 将新进程插入就绪队列中,等待被调度执行
过程:
进程撤销
终止进程的原因:
- 正常结束
- 程序运行期间,出现非法操作而被迫终止
- 外界干预
系统将调用进程终止原语来终止进程。
过程:
进程的阻塞与唤醒
进程阻塞
导致进程阻塞的原因:
- 提出系统服务请求(如I/O操作),但因为某种原因而未得到操作系统的立即响应
- 需要从其它合作进程获得的数据尚未到达等
该进程只能调用阻塞原语把自己阻塞,等待相应的事件出现后才被唤醒。
进程的阻塞是进程自身的一种主动行为
过程:
进程唤醒
进程唤醒原因:
- 当阻塞进程所等待的事件出现时
- 所需的数据已到达
- 等待的I/O操作已经完成
则由另外的与阻塞进程相关的进程(如用完并释放该I/O设备的进程)调用唤醒原语,将等待该事件的进程唤醒。
阻塞进程不能唤醒自己
过程:
进程的挂起与激活
进程挂起
过程:
进程激活
过程:
1.3进程的组织
线性方式
PCB组织方式
- 链接方式
- 索引方式
1.4线程
比进程更小的能独立运行的基本单位—线程。
目的是提高系统内程序并发执行的程度,从而进一步提高系统的吞吐量。
多进程并发执行的不足:
- 多进程并发执行时,系统需付出较大的时空开销
- 进程间通信效率低,必须利用内核调用实现
在引入线程的系统中
- 线程是处理器调度和运行的基本单位,进程是资源分配的基本单位
- 线程表示进程的一个控制点,可以执行一系列的指令。通常,和应用程序的一个函数相对应
线程是进程中的一个实体,是被系统独立分配和调度的基本单位,线程基本上不拥有资源
线程是由线程ID、程序计数器、寄存器集合和堆栈组成
线程优点:
- 响应程度高:如果对一个交互式应用程序采用多线程,即使它部分阻塞或执行较冗长的操作,那么,该程序仍然能继续工作,从而提高对用户的响应程度
- 资源共享:线程默认共享自身所属进程的内存和资源
- 经济:创建进程所需要的内存和资源的分配比较昂贵,而由于线程允许共享自身所属进程的资源,所以,创建线程和上下文切换会更经济
- 多处理器体系结构的利用:多线程的优点之一是能充分使用多处理器体系结构,以便每个线程能够并行运行在不同的处理器上
线程和进程的相似点:
- 线程具有一定的生命期
- 状态:运行、阻塞、就绪
- 进程可创建线程,一个线程可创建另一个子线程
线程和进程不同点:
- 地址空间资源
- 调度切换
- 通信关系
1.5处理器调度
处理器调度的过程就是为待处理的作业或进程分配处理器的过程。
处理器调度的具体过程是由调度程序来完成的。
通常,一个较为完善的操作系统会提供三级调度。
按调度的层次:
- 高级调度(作业调度、长程调度、宏观调度或接纳调度)
- 中级调度(中程调度)
- 低级调度(进程调度、短程调度)
三级调度示意图:
高级调度
(作业调度、长程调度、宏观调度或接纳调度)
用于把外存上处于后备队列中的那些作业调入内存,并为他们创建进程、分配必要的资源,然后,再将新创建的进程排在就绪队列上,准备执行
高级调度的时间尺度通常是分钟、小时或天
作业调度需要考虑两个问题:
- 每次接纳多少个作业进入内存:多道程序度决定
- 每次选择哪些作业进入内存:作业调度算法决定
中级调度
(中程调度)(存储器管理中的对换功能)
中级调度主要涉及进程在内存和外存之间的交换
引入中级调度的主要目的是为了提高内存的利用率和系统吞吐量。
在内存资源紧张时,由中级调度决定,将那些暂时不能运行的进程调至外存上等待,当这些进程具备运行条件,并且内存又稍有空闲时,由中级调度决定,将外存上的那些具备运行条件的就绪进程重新调入内存,等待进程调度
低级调度
(进程调度、短程调度)
它决定就绪队列中的哪个进程获得处理机,然后由分派程序(Dispatcher)执行把处理机分派给该进程的操作
处理机分配方式:
- 非抢占方式
一旦将处理机分配给某进程后,便让其一直执行,直至该进程完成或发生某件事而被阻塞时,才把处理机分配给其他进程。 - 抢占方式
- 优先权原则
- 短作业(进程)优先原则
- 时间片原则
调度性能的评价
调度算法应达到的目标
- 系统处理能力高
- 资源利用充分
- 算法对所有的作业公平合理
确定调度算法时应考虑的因素
- 设计目标
- 资源使用的均衡性
- 平衡系统和用户的要求
选择调度算法的准则
执行频率:
低级调度 > 中级调度 > 高级调度
准则:
- 处理器利用率要高
- 周转时间要短
- 周转时间 = 完成时间 - 提交时间
- 带权周转时间 = 周转时间 / 运行时间
- 响应时间要快
- 响应时间是指从用户提交一个请求开始,到系统首次产生响应为止的时间间隔。
- 保证截止时间
- 截止时间是指作业必须开始执行的最迟时间,或必须完成的最迟时间。
- 系统吞吐量要高
- 吞吐量是指在单位时间内系统所完成的作业数,它与所处理的作业长度关系密切。
周转时间
- 作业在外存后备队列上等待作业调度的时间
- 进程在就绪队列上等待进程调度的时间
- 进程在CPU上的执行的时间
- 进程等待I/O操作完成的时间
- 作业周转时间T与系统为它提供服务的时间Ts之比,即W = T/Ts,称为带权周转时间
- 平均带权周转时间则可表示为:
响应时间
- 从键盘输入的请求信息传送到处理机的时间
- 处理机对请求信息进行处理的时间
- 将所形成的响应回送到终端显示器的时间
作业调度
作业调度是按照某种调度算法从后备作业队列中选择作业装入内存运行,并在作业运行结束后作善后处理。
四种状态:
- 提交状态
- 用户作业由输入设备向系统外存输入时作业所处的状态
- 后备状态
- 系统为磁盘上的作业建立作业控制块,并将其插入到后备作业队列中等待调度运行,该状态为后备状态
- 运行状态
- 当一个作业分配了必要的资源并建立了相应的进程后,其处于运行状态
- 完成状态
- 当作业正常运行结束或因发生错误而终止运行
进程调度
引起进程调度的典型事件如下 :
- 正在执行的进程正确完成, 或由于某种错误而终止运行(陷阱或中断)
- 执行中的进程提出I/O请求, 等待I/O完成
- 在分时系统中,分给进程的时间片用完
- 按照优先级调度时,有更高优先级进程变为就绪状态(抢占方式)
- 在进程通信中,执行中的进程执行了某种原语操作,如wait操作、阻塞原语或唤醒原语时, 都可能引起进程调度。
进程调度的方式:
- 非抢占方式
一旦将CPU分配给某进程后,便让其一直执行,直至该进程完成或发生某件事而被阻塞时,才把CPU分配给其他进程。 - 抢占方式
遵循原则:
- 时间片原则
- 优先级原则
- 短进程优先原则
非抢占调度与抢占式调度对比:
- 非抢占调度方式的优点是简单、系统开销小,通常用在批处理系统中。
- 抢占式调度方式的优点是能够及时响应各进程的请求,多用在分时系统和实时系统中。
1.6调度算法
用于作业、进程调度的调度算法:
先来先服务(FCFS)
FCFS算法是非抢占式的
- 作业调度中:从后备队列中选择一个或多个位于队列头部的作业,把它们调入内存,分配所需资源、创建进程,然后放入就绪队列中。
- 进程调度中:从就绪队列中选择一个最先进入队列的进程,为它分配处理器,使之开始运行。
特征:
- 平均周转时间长
- 利于长作业(进程)
- 调度可预测性强
- 实时响应差
案例:
短作业(进程)优先(SJF/SPF)
将每个进程与其估计运行时间进行关联,下一次选择所需处理时间最短的进程,它们可以分别用于作业调度和进程调度。
特征:
- SJF调度算法是被证明了的最佳调度算法
- 平均周转时间最短
- 平均等待时间减少
- 系统吞吐量大
缺点:
- 长作业(进程)有可能被饿死
- 缺少剥夺机制,不适用于分时系统或交互式事务处理环境
- 无法准确知道作业(进程)的确切执行时间,致使该算法不一定能真正做到短作业优先调度
两种实现方式:
- 非抢占式
- 案例:
- 抢占式
- 最短剩余时间优先调度算法
- 案例
优先级调度
调度程序每次都优先选择就绪队列中优先级最高的进程投入运行。如果存在优先级相同的进程,则按FCFS的原则进行调度。
两种策略:
- 抢占式
- 非抢占式
- 系统把处理器分配给最高优先级进程后,在其运行期间若出现更高优先级的进程,则调度程序就立即停止当前进程的执行,重新将处理器分配给新到的具有更高优先级的进程。
特点:
- 利于优先级高的进程
- 对于分时系统和部分实时系统的及时响应具有较好保障
进程优先级:
- 静态优先级:在系统创建时确定的,一经确定之后在整个进程运行期间不再改变
- 问题:低优先级进程饥饿
- 动态优先级:在进程运行前先确定一个优先级,进程运行过程中根据进程等待时间的长短、执行时间的多少、输入输出信息量的大小等,通过计算得到新的优先级
通常使用某一范围的一个整数来表示进程优先级。
- 小优先数=高优先权
主要用于进程调度的调度算法:
时间片轮转法(RR)
算法思想:
- 系统中所有的就绪进程按照FCFS原则排成一个队列,每次调度时将CPU分派给队首进程,让其执行一个时间片。在一个时间片结束时,发生时钟中断。调度程序暂停当前进程的执行,将其送到就绪队列的末尾,并通过CPU现场切换执行当前的队首进程
特点
- 就绪队列中的所有进程都有机会获得处理器运行
- 可提高进程并发性和资源利用率
- 缩短响应时间
时间片长度的选择会直接影响系统开销和响应时间
- 时间片越大 ---> 退化为先来先服务
- 时间片越小 ---> 系统用于进程切换所花费的开销越大
- 一般选择:时间片略大于一次交互所需要的时间
- 响应时间、进程数目和时间片之间的关系如下:
T(响应时间)=N(进程数目)*q(时间片)
案例:时间片长度q=1
时间片长度q=4
多级队列调度算法
算法思想:
- 根据进程的性质或类型,将就绪队列划分为若干子队列,每个进程固定属于一个就绪队列,每个就绪队列采用一种调度算法。
实例:
设某有5个队列的系统中具有下列五个层次的进程:(1)系统进程;(2)交互式进程;(3)交互式编辑进程;(4)批处理进程;(5)学生进程。各队列的优先级自上而下递减。仅当系统进程、交互式进程和交互式编辑进程3个队列都为空时,批处理队列中的进程才可以运行。当批处理进程正在运行时,若有一个交互式编辑进程进入就绪队列时,该批处理进程会被抢占。
多级反馈队列调度
(多队列轮转法)是一种目前公认较好的进程调度算法。
算法思想(以抢占式为例):
- 设置多个就绪队列且为它们分别赋予不同的优先级。如下图所示,设队列1的优先级最高,其它逐级降低。每队列分配不同的时间片,规定优先级越低则时间片越长
- 新进程就绪后,先插入队列1的末尾,按FCFS算法调度。若一个时间片未能执行完,则降低插入到队列2的末尾;依此类推,降到最后一个队列后就按“时间片轮转”算法调度直到完成
- 若进程由于等待事件而放弃CPU后, 进入等待队列, 一旦等待的事件发生, 则回到原来的就绪队列
- 只有当较高优先级的队列为空时,才调度较低优先级队列中的进程执行。如果进程执行时有新进程进入较高优先级的队列,则需要重新调度,抢先执行新进程,并把被抢占的进程插入原队列的末尾。
特点:
- 是时间片轮转调度算法和优先级调度算法的综合和发展
- 通过动态调整进程优先级和时间片大小,可以兼顾多方面的系统目标
优点
- 短进程优先出现在优先级高的队列中,可提高系统吞吐量、缩短平均周转时间
- 对I/O密集型进程可放在最高优先级队列,保证及时的I/O交互,提高I/O设备利用率、缩短响应时间
- 不必事先估计进程的执行时间,可以在运行过程中进行动态调节。
实例:
主要用于作业调度的调度算法
高响应比优先调度算法
算法思想:
- 先计算后备作业队列中每个作业的响应比,然后挑选响应比最高的作业投入运行。
优点:
- 在等待时间相同时,要求服务的时间(运行时间)越短优先级会越高,对短作业有利。在要求服务时间相同时,等待的时间越长优先级就会越高,这时与先来先服务比较类似。在高响应比优先调度算法中,长作业的优先级会随着等待时间加长而升高,因此长作业也会得到机会执行,不会出现长进程被饿死的情况。
缺点
- 每次重新调度之前需要估计期待的服务时间,因而会增加计算量和系统开销
实例: