目录
1.先来先服务(FCFS,First Come First Serve)
2.最短作业优先(SJF, Shortest Job First)
3.1多道程序设计模型
3.1.1程序的顺利执行
把一个具有独立功能的程序独占CPU直到得到最终结果的过程叫做程序的顺序执行,具有如下特点:顺序性、封闭性、程序执行结果的确定性、程序执行结果的可再现性。
3.1.2多道程序系统中程序执行环境的变化
1.多道程序设计技术的引入
多道程序设计含义:允许多个程序同时进入内存并运行。
目的:提高整个系统的效率。
系统中各部分的工作并发执行,即对于单CPU,这些并发程序按时间片交替在处理机上执行;对于多CPU,这些并发程序在各自处理机上运行。
衡量指标:系统吞吐量。
带来的问题——资源竞争,要注意:对处理机资源、内存资源、设备资源的管理,包括程序在内存的定位问题。
2.多道程序设计环境的特点
独立性、随机性、资源共享性。
3.1.3程序的并发执行
含义:两个或两个以上程序在计算机系统中同时处于已开始执行且尚未结束的状态。
特性:
- 并发程序在执行期间具有相互制约关系。
- 程序与计算不再一一对应。
- 并发程序执行结果不可再现。
3.2进程模型
3.2.1进程的概念
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个基本单位,分为系统进程和用户进程。
1.进程与程序的联系和区别
程序:是静态的,是存放在磁盘里的可执行文件,是一系列的指令集合,是进程的组成部分之一。
进程(Process):是动态的,是程序的一次执行过程。
同一个程序多次执行会对应多个进程。
2.进程的特性
并发性
动态性:最基本特性,指进程动态产生、动态消亡,在进程生命周期内;其状态动态变化。
独立性:相对完整的资源分配单位。
交往性:与其他进程相互作用。
异步性:每个进程按照各自独立的、不可预知的速度向前推进。
3.2.2进程的状态及状态转换
1.三状态进程模型
1)三种状态
2)状态转换
- 就绪>>>运行: 被调度程序选中
- 运行>>>就绪: 时间片到了(超时), 或被更高优先级的进程剥夺了
- 运行>>>等待: 不具备运行条件,等待某一时间的发生
- 挂起>>>就绪: 等待的事件已发生, 具备了运行条件
- 在状态转换中, 不能挂起>>>运行, 也不能就绪>>>等待
2.五状态进程模型
1)增加两个状态——创建状态、退出状态
创建状态:进程正在被创建时,它的状态是创建态,在这个阶段操作系统会为进程分配资源、初始化化PCB。
退出状态:进程结束运行,回收除进程控制块之外的其他资源,并让其他进程 从进程控制块中收集相关信息。
2)状态转换
- NULL→创建态:创建一个新进程,以执行一个程序,创建进程的原因包括用户登录、操作系统创建以提供某项服务等。
- 创建态→就绪态:提交,当操作系统完成了进程创建的必要操作,并且当前系统的性能和虚拟内存的容量均允许。
- 就绪态→运行态:调度运行,从就绪进程表中选择一个进程运行。
- 运行态→运行态:释放,进程完成或失败而终止进程运行,进入结束状态。可分为正常退出和异常退出。
- 运行态→就绪态:超时,由于用完时间片或高优先级进程就绪。
- 运行态→阻塞态:等待事件,进程要求的时间未出现,可能原因:申请系统服务或资源、通信、I/O操作。
- 阻塞态→就绪态:事件出现,进程等待的事件出现,如:操作完成,申请成功。
3.七状态进程模型
1)增加两个状态——就绪挂起、阻塞挂起状态
引入虚拟存储管理技术后,进一步区分进程的地址空间状态,把就绪状态和阻塞状态细分为就绪挂起和阻塞挂起状态。好处:提高处理机效率;为运行进程提供足够的内存;有利于调试。
- 就绪状态:进程在内存且可立即进入运行状态。
- 就绪挂起状态:进程在外存,但只要进入内存,就可运行。
- 阻塞状态:进程在内存并等待某事件出现。
- 阻塞挂起状态:进程在外存并等待某事件出现。
2)状态转换
新引入状态:挂起、激活 。
挂起:把一个进程从内存转到外存,可能有以下情况:
- 阻塞→阻塞挂起:没有进程处于就绪状态或者就绪进程要求更多内存资源。
- 就绪→就绪挂起:高优先级阻塞进程和低优先级就绪进程,会挂起低优先级就绪进程。
- 运行→就绪挂起:高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态。
激活:把一个进程从外存转到内存,可能有以下情况:
- 就绪挂起→就绪:就绪挂起进程优先级高于就绪进程或没有就绪进程。
- 阻塞挂起→阻塞:进程释放内存,系统会把高优先级阻塞进程激活。
意义有变化:事件出现、进程提交。
- 事件出现:进程等待的事件出现,如操作完成,申请成功等,可能的情况有:
- 阻塞→就绪:针对内存进程的事件出现。
- 阻塞挂起→就绪挂起:针对外存进程的事件出现。
提交:完成一个新进程的创建过程,新进程进入就绪或就绪挂起状态。
3.2.3进程控制块
1.PCB的内容
分成调度信息和现场信息,调度信息。调度信息描述进程当前所处的状况,现场信息记录可能会被其他进程改变的寄存器。调度信息包括进程名、进程号、存储信息、优先级、当前状态、资源清单、“家族”关系、消息队列指针、进程队列指针和当前打开文件等;现场信息有:程序状态字、时钟、界地址寄存器。
2.进程的组成
PCB 是给操作系统用的,PCB是进程存在的唯一标志。
程序段、数据段是给进程自己用的。
可再入程序:指纯代码的程序,由指令组成,即在运行过程中不修改自身。
3.PCB组织
三种组织方式:线性方式、索引方式、链接方式。
4.进程的队列
分为:就绪队列(整个系统一个)、等待队列(每一个等待事件一个队列)、运行队列(单CPU系统整个系统一个)。
3.2.4进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,通过原语实现。
原语通常由若干条指令组成,实现特定操作。
原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不
可中断。
原语是操作系统核心组成部分,必须在管态执行,并且常驻内存。
1.进程控制原语
用于进程控制的原语有:创建进程、撤销进程、挂起进程、激活进程、阻塞进程、唤醒进程以及唤醒进程优先级等。
1)创建原语:系统创建一个进程时使用的原语
2)撤销原语
3)阻塞原语
4)唤醒原语:一个进程因等待事件发生处于等待态,出现等待事件。使用唤醒原语转换为就绪状态。
无论哪个进程控制原语,要做的无非三类事情:
1)更新PCB中的信息
- 所有的进程控制原语一定都会修改进程状态标志
- 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
- 某进程开始运行前必然要恢复期运行环境
2) 将PCB插入合适的队列
3) 分配/回收资源
2.UNIX类操作系统的进程控制操作
在UNIX类操作系统中,父进程通过fork()创建子进程。
fork()被调用行一次,返回两次。在父进程中,fork()返回子进程pid,在子进程中fork()返回0,若创建失败返回-1。
3.3线程模型
3.3.1线程的引入
进程是资源分配的基本单位,进程是调度的基本单位。
当切换进程时,需要保存/恢复进程运行环境,还需要切换内存地址空间(更新快表、更新缓存)开销很大。
引入线程后,线程是CPU调度的基本单位,进程依然是资源分配的基本单位。从属于同一进程的各个线程共享进程的资源。同一进程内的各个线程间并发,不需要切换进程运行环境和内存地址空间,并发带来的系统开销降低,系统并发性提升。
3.3.2线程的基本概念
1.线程的属性
- 从属同一进程的各个线程共享进程拥有的资源。
- 不同的线程可以执行相同的程序,即同一个服务程序被不同用户调用时操作系统为它们创建不同的线程。
- 进程是资源分配的基本单位,线程是调度的基本单位,多个线程可以并发的执行。
- 线程被创建后也有生命周期,经历如运行态、就绪态、阻塞态的状态变化。
- 线程几乎不拥有资源,只拥有极少量的资源(线程控制块TCB、寄存器信息、堆栈等),每个线程有唯一的标识符和一张线性描述表(记录线程执行的寄存器和栈等现场状态)。
2.引入线程的好处
- 创建一个新线程花费时间少。
- 两个线程的切换花费时间少。
- 从属于同一进程的各个线程共享进程的资源,通信更简便,信息传送速度更快。
- 线程能独立执行,处理器和外围设备可以并行工作。
3.线程与进程的比较
1)调度 2)并发性 3)拥有资源 4)系统开销
线程可以理解为轻量级进程。
3.3.3线程实现机制
1.用户级线程
1)用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)
2) 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
3) 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。“用户级线程”就是“从用户视角看能看到的线程”
4)优缺点
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
2.内核级线程
1. 内核级线程的管理工作由操作系统内核完成。
2. 线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才
能完成。
3. 操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。“内核级线程”就是“从操作系统内核视角看能看到的线程”
4. 优缺点
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到
核心态,因此线程管理的成本高,开销大。
3.混合实现方式
在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程上( n >= m)。
操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。
3.3.4Pthread线程包
IEEE 1003.1c定义了线程标准,Pthread是基于该标准实现的线程包,大部分UNIX系统都支持该标准。
常用函数调用:
3.4进程(线程调度)
处理机调度的三个层次:
高级调度(作业调度):按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,
给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权
利。高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。
中级调度(内存调度):就是要决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
低级调度(进程调度):其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理
机分配给它。进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。
3.4.1概述
1.进程(线程)调度的主要功能
记录系统中所有进程(线程)的执行情况;根据调度算法,从就绪队列选出一个进程(线程),分配CPU。
2.调度(线程)调度的时机
1)进程调度主要是看有没有CPU资源让出来,有CPU资源让出不一定发生调度,但没有一定不发生调度。
2)进程调度的方式:
- 剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
- 非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
3)进程调度发生的情况:
CPU可抢占时:
- 进程正常终止
- 进程主动请求阻塞(如等待I/O)
- 进程调用了唤醒原语操作激活了等待资源的进程
- 分给进程的时间片用完
CPU不可抢占时:
- 有更高优先级的进程进入就绪队列
3.4.2调度算法设计原则
1.进程行为
计算密集型、I/O密集型。
2.系统分类
根据不同环境设计不同的调度算法,通常分为三类:批处理、交互式、实时系统。例如,交互式采用抢占方式,而实时系统,抢占有时是不需要的。
3.调度算法设计目标
设计目标取决于环境,但又一些是适合所有系统的:公平+保持系统所有部分尽可能忙碌。
- 对于批处理系统,考虑吞吐量、周转时间、CPU利用率。
- 对于交互式系统,特别是分时系统和服务器,最重要的是最小响应时间。
- 对于实时系统,需要满足截止时间要求,对于涉及多媒体的实时系统,可预测性很重要。
各种指标的含义和计算:
CPU利用率:指CPU “忙碌”的时间占总时间的比例,利用率=忙碌的时间/总时间。
系统吞吐量:单位时间内完成作业的数量。
周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。它包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等待进程调度(低级调度)的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间。后三项在一个作业的整个处理过程中,可能发生多次。
3.4.3进程(线程)调度算法
1.先来先服务(FCFS,First Come First Serve)
- 算法思想:主要从“公平”的角度考虑
- 算法规则:按照作业/进程到达的先后顺序进行服务
- 作业调度/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列
- 是否可抢占:非抢占式的算法
- 优点:公平、算法实现简单。缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即,FCFS算法对长作业有利,对短作业不利(Eg :排队买奶茶…)
- 是否会导致饥饿:不会
2.最短作业优先(SJF, Shortest Job First)
- 算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周转时间
- 算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
- 用于作业/进程调度:即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF, Shortest Process First)算法”
- 是否可抢占:SJF和SPF是非抢占式的算法。但是也有抢占式的版本——最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)
- 优缺点:优点:“最短的”平均等待时间、平均周转时间。缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。
- 是否会导致饥饿:会。
3.最短剩余时间优先
最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)就是可抢占式的最短剩余时间优先算法。调度程序总是选择其剩余运行时间最短的进程运行,有关运行时间必须提前掌握。
4.最高响应比优先算法
- 算法思想:要综合考虑作业/进程的等待时间和要求服务的时间
- 算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。
- 用于作业/进程调度:即可用于作业调度,也可用于进程调度
- 是否可抢占:非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比。
- 优缺点:综合考虑了等待时间和运行时间(要求服务时间),等待时间相同时,要求服务时间短的优先(SJF 的优点),要求服务时间相同时,等待时间长的优先(FCFS 的优点)。对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题
- 是否会导致饥饿:不会。
响应比=(等待时间+要求服务时间)/要求服务时间
这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适合用于早期的批处理系统。
5.轮转法
- 算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
- 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
- 用于作业/进程调度:用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片)
- 是否可抢占:抢占式的算法,由时钟装置发出时钟中断来通知CPU时间片已到。
- 优缺点:优点:公平;响应快,适用于分时操作系统;缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。
- 是否会导致饥饿:不会
6.最高优先级算法
- 算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序。
- 算法规则:每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程。
- 用于作业/进程调度:既可用于作业调度,也可用于进程调度。甚至,还会用于在之后会学习的I/O调度中。
- 是否可抢占:抢占式、非抢占式都有。区别在于:非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。
- 优缺点:优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。缺点:若源源不断地有高优先级进程到来,则可能导致饥饿。
- 是否会导致饥饿:会。
7.多级反馈队列算法
- 算法思想:对其他调度算法的折中权衡。
- 算法规则:1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大 2. 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾 3. 只有第k 级队列为空时,才会为k+1 级队头的进程分配时间片。
- 用于作业/进程调度:用于进程调度
- 是否可抢占:抢占式的算法。在k 级队列的进程运行过程中,若更上级的队列(1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k 级队列队尾。
- 优缺点:对各类型进程相对公平(FCFS的优点);每个新到达的进程都可以很快就得到响应(RR的优点);短进程只用较少的时间就可完成(SPF的优点);不必实现估计进程的运行时间(避免用户作假);可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密
集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级)。 - 是否会导致饥饿:会。
比起早期的批处理操作系统来说,由于计算机造价大幅降低,因此之后出现的交互式操作系统(包括分时操作系统、实时操作系统等)更注重系统的响应时间、公平性、平衡性等指标。而这几种算法恰好也能较好地满足交互式系统的需求。因此这三种算法适合用于交互式系统。
8.最短进程优先
首先运行最短的作业来使响应时间最短,根据进程过去的行为推测,执行估计运行时间最短的程序。
9.实时系统中的调度算法
1)硬实时任务和软实时任务
2)实时任务按照响应方式进一步分类为分为周期性和非周期性事件,一个系统可能要响应多个周期性事件流。实时系统可调度的条件:
如果有m个周期事件,事件i以周期Pi发生,并需要Ci秒CPU时间处理一个事件,那么可以处理负载的条件是
3)实时系统的调度算法:
实时系统的调度算法可以是静态的或者动态的。前者在系统运作之前作出调度决策,后者在运行过程中进行调度决策。只有提前掌握所完成的工作、截止时间等静态调度才能工作,动态调度则没有这些限制。
速率单调调度算法(Rate Monotonic Scheduling, RMS),静态的;最早最终时限优先(Earliest Deadline First, EDF),动态的。
总结:
参考(侵删):
1.全国计算机等级考试四级教程-操作系统原理
2.王道计算机考研 操作系统