进程和线程:概念&处理机调度

进程和线程:概念&处理机调度

一、进程的概念和特征

1.1 进程的概念

在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为引入了进程的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性共享性。(最基本的两个特征)

✨✨

为了让参与并发执行的每个程序都能独立运行,必须为之配备一个专门的数据结构,称为进程控制块(Process Control Block, PCB)系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。

程序段相关数据PCB三部分构成了进程实体。所谓的创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上是撤销进程的PCB。进程映像是静态的,进程则是动态的

注意:PCB是进程存在的唯一标志!

进程的定义:

  • 进程是程序的一次执行
  • 进程是一个程序及其数据在处理机上顺序执行所发生的活动
  • 进程是具有独立动能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位

1.2 进程的特征

进程是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求。

  1. 动态性。进程是程序的一次执行,它有创建、活动、暂停、终止等过程,具有一定的生命周期。动态性是进程最基本的特征
  2. 并发性。进多个进程实体同存于内存中,能在一段时间内同时运行。引入进程的目的就是使进程能和其他程序并发执行。并发性是进程的重要特征,也是操作系统的重要特征。
  3. 独立性。指程序实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡是未建立PCB的程序都不能最为一个独立的单位参与进行。
  4. 异步性。由于进程的相互制约,使得进程按各自独立的,不可预知的速度向前推进。

1.3 进程的状态与转化

image-20230323134212224

进程在生命周期内,由于系统中的进程之间的相互制约及运行环境的变化,使得进程状态也在不断地发生变化。通常进程的状态有以下5种状态,前3种是进程的基本状态。

  1. 运行态。进程正在处理机上运行。在单片处理机中,每个时刻只有一个进程处于运行态。(多核CPU情况下,可能有多个进程处于运行态
  2. 就绪态。进程获得除了处理机外的一切所需资源,一旦得到处理机,便立即运行。系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
  3. 阻塞态(等待态)。进程正在等某一事件而暂停运行,如等待某资源为可用或等待输入/输出完成。即使处理机空闲。该进程也不能运行。系统通常将处于阻塞态的进程也排成一个队列,甚至根据阻塞原因的不同,设置多个阻塞队列
  4. 创建态。进程正在被创建,尚未转到就绪态。如果进程所需的资源尚不能得到满足,如内存不足,则创建工作尚未完成,进程此时所需的状态称为创建态。
  5. 终止态。进程正从系统消失,可能是进程正从结束或其他原因退出运行。进程需要结束运行时,系统首先将该进程置为终止态,然后进一步处理资源释放和回收等工作。

就绪态和等待态的区别:

就绪态是指进程仅缺少处理器,只要获得处理机资源就立即运行;而等待态是指进程需要其他资源(除处理机)或等待某一事件。

3种基本状态之间的转换如下:

  • 就绪态->运行态:处于就绪态的进程被调度后,获得处理机资源(分派处理机时间片),于是进程由就绪态转化为运行态。
  • 运行态->就绪态:处于运行态的进程在时间片用完后,不得不让出处理机,从而进程由运行状态转换为就绪态。在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程执行。
  • 运行态->阻塞态:进程请求某一资源的使用和分配或等待某一事件(如I/O请求)的发生时,它就从运行态转化为阻塞态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式
  • 阻塞态->就绪态:进程等待的事件到来,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞态转化为就绪态

image-20230323110644784

一个进程从运行态变成阻塞态是主动的行为,而从阻塞态变为就绪态是被动的行为。

注意:不能由阻塞态直接转换为运行态,也不能由就绪态转换为阻塞态

image-20230323131631528

1.4 进程的组织方式

1.4.1 链接方式

image-20230323133827155

image-20230323133837663

1.4.2 索引方式

image-20230323133909752

1.5 进程的组成

进程是一个独立的运行状态,也是操作系统进行资源分配和调度的基本单位。它由进程控制块(PCB)程序段数据段

1.5.1 进程控制块(PCB)

PCB 是进程实体的一部分,是进程存在的唯一标志。

image-20230323140115364

各个部分的说明如下:

  1. 进程描述信息

    • 进程标识符:标志各个进程,每个进程都有唯一一个标志号
    • 用户标识符:进程归属的用户,用户标识符主要为共享和保护
  2. 进程控制和管理信息

    • 当前进程状态:描述进程的状态信息,作为处理机分配调度的依据
    • 进程优先级:描述进程枪战处理机的优先级,优先级高的可以先获得处理机
  3. 资源分配清单

    用于说明有关内存地址空间或虚拟地址空间的状态,所打开文件的列表和所使用的输入、输出设备信息

  4. 处理机相关信息

    也称处理机上下文,主要指处理机中各寄存器的值。当进程处于执行状态时,处理机的许多信息都存在寄存器中。当进程被切换时,处理机状态都必须保存在相应的PCB中,以便在进程重新执行时,能从断点继续执行

1.5.2 程序段

程序段就是能被进程调度程序调度到的CPU执行的程序代码。注意:程序可被多个进程共享,即多个进程可以运行一个程序

1.5.3 数据段

一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果

1.6 进程的控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

因为进程的管理,例如将进程从阻塞态到就绪态等都需要多条指令才能完成一次进程管理的全部操作。而若在进程管理操作的过程中出现中断,系统就很容易出现错误甚至奔溃。因此需要借助原语实现对进程的管理。

原语的执行具有原子性,即执行过程中只能一气呵成,期间不允许被中断。可以用“关中断指令”和“开中断指令”这两个特权指令实现原子性。

CPU执行了关中断指令,就不再例行检查中断信号,知道开中断指令之后才会恢复检查中断。

image-20230323151645248

1.6.1 进程的创建

进程的创建过程如下(创建原语):

  1. 申请空白PCB。若PCB申请失败,则创建失败。
  2. 为新进程分配所需资源。如果资源不足,则并不是创建失败,而是处于创建态,等待资源。
  3. 初始化PCB。初始化PCB中的标志信息、进程优先级等
  4. 将PCB插入就绪队列

引起创建的事件

  • 用户登录。分时系统中用户登录成功,系统会为其建立一个新的进程。
  • 作业调度。多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
  • 提供服务。用户向操作系统提出某些请求,会创建一个进程处理该请求
  • 应用请求。由用户进主动请求创建一个子进程
1.6.2 进程的终止

终止进程的过程如下(终止原语就绪态/阻塞态/运行态->终止态):

  1. 根据终止进程的标识符,检索出该进程的PCB,从中读出该进程的状态
  2. 若进程正处于运行状态,立即剥夺CPU,将CPU分配给其他进程
  3. 终止其所有子进程
  4. 将该进程拥有的所有资源归还给父进程或操作系统
  5. 删除PCB

引起进程终止的事件

  • 正常结束。进程自己请求终止(exit系统调用)
  • 异常结束。整数除以0。非法使用特权指令,然后被操作系统强行杀掉
  • 外界干预。用户管理器强制杀掉进程
1.6.3 进程的阻塞和唤醒

进程的阻塞

当正在执行的进程,由于某些事件未发生,如系统资源失败、等待某种操作的完成、新数据尚未到达或无新任务可做等,进程便通过阻塞原语(Block),使自己由运行态变为阻塞态。。由此可见,阻塞是进程吱声的一种主动行为,进程阻塞的原语执行如下(运行态->阻塞态):

  1. 找到阻塞的进程对应的PCB
  2. 保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行
  3. 将PCB插入相应事件的等待队列

引起进程阻塞的事件有

  1. 需要等待系统分配某种资源
  2. 需要等待相互合作的其他进程完成工作

进程的唤醒

当被阻塞的进程所等待的事件完成时,如它所等待的I/O操作已完成或其他所期待的数据到达,由有关进程调用唤醒原语(Wakeup),将等待该事件的进程唤醒。唤醒原语如下:

  1. 在事件等待队列中找到PCB
  2. 将PCB从等待队列移除,设置进程为就绪态
  3. 将PCB插入就绪队列,等待被调度

引起进程唤醒的事件有

  • 等待的事件发生(因何事阻塞,就由何事唤醒)

Block原语和Wakeup原语是一对作用刚好相反的原语,必须成对使用。否则当只调用了Block原语而不使用Wakeup原语的时候,阻塞进程将不能被唤醒而永远处于阻塞状态。

1.6.4 进程的切换

进程切换原语(运行态->就绪态就绪态->运行态):

  1. 将运行环境信息(Context)存入PCB
  2. PCB移入相应队列
  3. 选择另一个进程执行,并更新其PCB
  4. 根据PCB恢复新进程所需的运行环境

引起进程切换的事件

  1. 当前进程时间片到
  2. 有更高优先级的进程到达
  3. 当前进程主动阻塞
  4. 当前进程终止

1.7 进程通信

image-20230323220540917

进程间的通信(Inter-Process Communication, IPC)是指两个进程之间产生数据交互。

共享存储

共享存储分为两种:低级方式的共享是基于数据结构的共享;高级方式的的共享则是基于存储区的共享。在对共享空间进行读/写操作时,需要使用同步互斥工具(如P操作、V操作)

基于存储区的共享:

操作系统在内存中划分出一块共享存储区,数据的形式、存放位置都由通信进程控制,而不是操作系统。这种共享方式速度很快,是一种高级通信方式。(通过同步)

image-20230323212051970

基于数据结构的共享:

比如共享空间里只能放一个长度为10 的数组。这种共享方式速度慢、限制多,是一种低级的通信方式。

image-20230323212420425

消息传递

在消息传递系统中,进程间的数据交换以格式化的消息(Message)为单位。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。

直接通信方式

发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。

image-20230323213745289

间接通信方式

发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种实体一般称为信箱。

image-20230323214005272

直接通信和间接通信的方式,最大的区别就是接收方是否要维护一个消息队列。间接通信以信箱的方式实现将消息暂存在信箱中,而直接通信则将收到的消息暂存在消息队列中。

管道通信

image-20230323214911815

  1. 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道
  2. 各进程需要互斥地访问管道(由操作系统实现)
  3. 管道写满时,写进程将阻塞,知道读进程将管道中的数据取走,即可唤醒写进程
  4. 管道读空时,读进程将阻塞,知道写进程往管道中写入数据,即可唤醒读进程
  5. 管道中的数据一旦被读出,就彻底小时。因此,当多个进程读同一个管道时,可能会错乱。对此长阿金的两种解决方案:
    • 一个管道允许多个写进程,一个读进程
    • 允许有多个写进程、多个读进程,但系统会让各个读进程轮流从管道中读数据

1.8 线程和多线程模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jD0GQGan-1680006302656)(https://raw.githubusercontent.com/yuyuyu258963/pic-go-picStore/main/%E5%BC%95%E5%85%A5%E7%BA%BF%E7%A8%8B%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%8F%98%E5%8C%96.png)]

引入线程的目的是更好地使用多道程序并发执行,提高资源利用率和系统吞吐量;引入线程的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能

进程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分配的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可以和同一个进程的其他线程共享进程所拥有的全部资源。线程也有就绪、阻塞、执行三种基本状态。

引入进程后,进程的内涵发生了改变,进程只作为除了CPU外的系统资源分配单元,而线程则作为处理机的分配单元。由于一个进程内部有多个线程,若线程的切换发生在同一个进程内部,则只需要很少的时空开销。

因为进程的资源被线程所共享,要是仅切换线程的话,计算机中的很多资源(各种寄存器:IR、PC、各种通用寄存器)都不需要重新切换保存。大大节省了进程切换时的上下文信息的保存所耗费的时间。

进程和线程的比较
  1. 调度。进程的每次调度都需要进行上下文的切换,开销较大。同一进程中的线程的切换不会引起进程切换。但从拎一个进程中的线程切换到另一进程中的线程时,会引起进程切换。
  2. 并发性。不仅进程可以并发,而且一个进程中的多个线程之间亦可并发,甚至不用进程中的线程也能并发执行。
  3. 拥有资源。进程时系统中拥有资源的基本单位,而线程不拥有系统资源,但线程可以访问隶属于进程的系统资源。属于同一进程的所有线程都具有相同的地址空间。
  4. 独立性。每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程的访问。某一进程中的线程对其他进程不可见。
  5. 系统开销。进程切换时设计进程上下文的切换,而线程切换时只需保存和设置少量寄存器内容,开销很小。
  6. 支持多处理机系统。对于单线程进程,不管有多少处理机,进程只能运行在一个处理机上。对于多线程进程,可以将进程中的多个线程分配到多个处理机上。
进程的属性
  • 每个线程都有一个唯一的标识符和一个进程控制块,线程控制块记录了进程执行的寄存器和栈等现场状态
  • 不同线程可以执行相同的程序,即同一个服务程序被不同的用户调用,操作系统把它们创建成不同的线程
  • 同一进程中的各个线程共享该进程所拥有的资源
  • 线程是处理机独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,各个线程可交替地占用CPU;在多CPU的计算机中,各个线程可同时占用不同的CPU
  • 一个线程被创建后,便开始了它的生命周期,直到终止
线程的实现方式

线程的实现可以分为两类:用户级进程(User-Level Thread,ULT)和内核级线程(Kernel-Level Thread,KLT)。内核级线程又称内核支持的线程。

ULT

image-20230324221446169

在用户级线程中,有关线程管理的所有工作都由应用程序在用户空间中完成,内核意识不到线程的存在。应用程序通过使用线程库设计成多线程程序。

用户级线程的特点

  1. 用户级线程由应用程序通过线程库实现所有的线程管理工作都应由应用程序负责(包括线程线程切换)
  2. 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预
  3. 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。”用户级线程“就是”从用户视角看到能看到的线程“

优点

  • 用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理开销小,效率高

  • 线程的实现与操作系统平台无关

缺点

当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可再多核处理机上并行(区别于并发,再同一时刻运行)运行。

例如下面这段代码就可以模拟进程实现最简答的线程调度:

int main(){
    int i = 0;
    while (true) {
        if(i==0){printf("处理视频聊天");}
        if(i==1){printf("处理文字聊天");}
        if(i==2){printf("处理文件传输");}
    	i = (i + 1)%3;
    }
}
// QQ进程

历史背景:早期的操作系统(如:Unix)只支持进程,不支持线程,当时的“线程”是由线程库实现的

KLT

内核级线程(KLT)。在操作系统中,无论是系统进程还是用户进程,都是在操作系统内核的支持下运行的,与内核紧密相关。

image-20230325110614755

内核级进程的特点:

  1. 内核级线程管理工作都由操作系统内核负责完成
  2. 线程调度、切换工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成
  3. 操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块)。通过TCB对线程进行管理,“内核级线程”就是“操作系统内核视角看到线程”。

优点:

  • 能发挥多处理机的优势,内核能同时调度同一个进程中的多个线程并行执行
  • 进程中的一个线程被阻塞,内核可以调度该进程中的其他线程占用处理机,也可以运行其他进程中的线程
  • 内核支持具有很小的数据结构和堆栈,线程切换比较快、开销小

缺点:

一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大

组合方式

在组合实现方式中,内核支持多个内核级线程的建立、调度和管理,同时允许用户程序建立、调度和管理用户级线程。

多线程模型

由于用户级线程和内核级线程连接方式的不同,形成了以下三种不同的多线程模型。

  • 多对多模型

    将n个用户级线程映射到m个内核级线程上,要求n>=m

    • 特点:既克服了一对一模型并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点
  • 多对一模型

    多个用户级线程映射到一个内核级线程。

    • 优点:线程管理实在用户空间进行的,因而效率比较高
    • 缺点:若一个运行中的线程发生阻塞,则整个线程都会被阻塞
  • 一对一模型

    将每个用户级线程映射到一个内核进程。

    • 优点:当一个线程被阻塞后,允许调度另一个程序运行
    • 缺点::每创建一个用户线程,相应地就需要创建一个内核线程,开销较大
线程的组织与控制

线程的三个基础状态和进程的基础状态转化一样

image-20230325133707355

image-20230325133038842

线程的组织就是将多个线程记录到的同一个线程表中。组织方式可以按照一个进程一个线程表、按照运行状态对应一个线程表等。

image-20230325133528260

二、处理机的调度

调度的概念

处理机的调度是多道程序操作系统的基础,是操作系统设计的核心问题

调度的层次、层次

高级调度(作业调度)

按照一定的原则从外村上处于后备队列的作业中挑选一个(或多个),给他们分配内存、输入/输出设备等必要资源,并建立相应的进程,以使它们获得竞争处理机的权力。间而言之作业的调度就是内存和辅存之间的调度。每个作业只调入一次、调出一次。作业调入时会创立PCB,调出时会撤销PCB。

作业:可以理解为一个具体的任务。比如用户向系统提交一个作业 = 用户让操作系统启动一个程序

中级调度(内存调度)

引入中级调度的目的是提高内存利用率和系统吞吐量。内存不够时,将某些进程的数据调出外村。等待内存空闲或进程运行时再重新调入内存。暂时调到外村等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列

按照某种策略决定将哪个处于挂起状态的进程重新调入内存。一个进程可能被多次调出、调入内存,因此中级调度发生的概率比高级调度更高

低级调度(进程调度)

低级调度(处理机调度/处理机调度)——按照某种策略从就绪队列中选取一个进程,将处理机分配给它

进程调度是操作系统中最基本的一种调度,在一般操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。

七状态模型

暂时调到外村等待的进程状态为挂起态(suspend)

挂起状态又可以进一步细分为就绪挂起、阻塞挂起两种状态

image-20230325141409382

三层调度的联系对比

image-20230325141105859

调度的时间、切换、与过程、方式

进程调度(低级调度)就是按照某种算法从就绪队列中选择一个进程为其分配处理机

进程调度的时机

调度程序是操作系统的内核程序。请求调度的事件发生后,才能进行调度程序,调度了新的就绪进程后,才会进程进程的切换。但是在某些时刻发生了引起进程调度的因素,不能马上进行调度和切换。不能调度和切换的情况有以下三种:

  1. 处理中断的过程中。中断处理处理复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。

  2. 进程在操作系统内核程序临界区中

    ❌进程处于临界区时不能进行处理机调度

    临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。

    临界区:访问临界资源的那段代码

    内核临界区:一般是用来访问某种内核数据结构的,比如进程的就绪队列

    image-20230325152342149

  3. 原子操作过程中(原语)。原子操作不可中断,要一气呵成

应该进行进程调度和转化的情况如下:

  1. 发生运行的进程主动放弃处理机
    • 进程正常终止
    • 运行过程中发生异常而终止
    • 进程主动请求阻塞(如等待I/O)
  2. 当前运行的进程被动放弃处理机
    • 分给进程的时间片用完
    • 有更紧急的事情需要处理(如 I/O中断)
    • 有更高优先级的进程进入就绪队列
进程的调度方式

非剥夺调度方式(非抢占式),即只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理结果,知道该进程终止或主动要求进入阻塞态

特点:

实现简单,系统开销小但是无法及时处理紧急任务,适合早期的批处理系统


剥夺式调度(抢占式)。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的程序,将处理机分配给更重要紧迫的那个程序

特点:

可以优先处理更紧急的进程,也可以实现让个进程按时间片轮流执行的功能(通过时钟中断)。适合分时操作系统、实时操作系统。

进程切换的与过程

狭义的进程调度进程切换的区别:

狭义的进程调度指的是从就绪队列中选一个要运行的程序;

进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程

广义的进程调度包含了选择一个进程和切换两个步骤

进程的切换过程主要完成了:

  • 1. 对原来运行程序各种数据的保存
  • 2. 对新的进程各种数据的恢复(如程序计数器PC、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)

✨注意:进程的切换是有代价的,因此如果过于频繁地进行进程调度、切换必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少

调度器/调度程序

用于分派CPU的组件称为调度程序。

image-20230325154927118

image-20230325155158319

调度器通常由三个部分组成:

  1. 排队器。将系统中的就绪进程按照一定的策略排成一个或多个队列
  2. 分派器。依据嗲排毒程序所选的进程,将其从就绪队列中取出,将CPU分配给新进程
  3. 上下文切换器。在对处理机进行切换时,会发生两队上下文的切换操作:
    • 当前进程的上下文保存到其PCB中,再装入分派程序的上下文,以便分派程序运行
    • 移除分派程序的上下文,将新选进程的CPU线程信息装入处理机的各个相应的寄存器

为减少上下文切换时间,通常采用两组寄存器,其中一组供内核使用,一组供用户使用。这样,上下文切换时,只需改变指针,让其指向当前寄存器组。

闲逛进程

没有其他就绪进程时,运行闲逛进程(idle)

闲逛进程的特征:

  • 优先级最低
  • 可以是0地址指令,抢占一个完整的指令周期(指令周期末尾例行检查中断)
  • 能耗低
  • 不需要CPU之外的资源,它不会被阻塞

调度算法的评价指标

image-20230325160818387

CPU利用率

CPU利用率。CPU是计算机系统中最重要和最昂贵的资源之一,所以应尽可能使CPU保持“忙”状态,使这一资源的利用率最高。CPU利用率的计算方法如下:
C P U 利用率 = C P U 有效工作时间 C P U 有效工作时间 + C P U 空闲时间 CPU利用率 = \frac{CPU有效工作时间}{CPU有效工作时间+CPU空闲时间} CPU利用率=CPU有效工作时间+CPU空闲时间CPU有效工作时间
image-20230325161115889

系统吞吐量

表示单位时间内CPU完成作业的数量。长作业需要消耗较长的处理机时间,因此会降低系统的吞吐量。对于短作业,需要消耗的处理机时间较短,因此能提高系统的吞吐量。 系统吞吐量 = 单位时间完成作业的数量 系统吞吐量 = 单位时间完成作业的数量 系统吞吐量=单位时间完成作业的数量
系统吞吐量 = 总共完成了多少道作业 总共花了多少时间 系统吞吐量 = \frac{总共完成了多少道作业}{总共花了多少时间} 系统吞吐量=总共花了多少时间总共完成了多少道作业
image-20230325161654126

周转时间

周转时间是指从作业提交到作业完成所经历的时间,使作业等待、在就绪队列中排队、在处理机上运行及输入/输出操作所花费时间的总和。$周转时间 = 作业完成时间 - 作业提交时间 或者 或者 或者周转时间 = 等待时间 + 运行时间 + I/O操作的时间$。

平均周转时间就是所有作业周转时间的平均值。

带权周转时间是指作业周转时间与作业实际运行时间的比值:
带权周转时间 = 作业周转时间 作业实际运行时间 带权周转时间 = \frac{作业周转时间}{作业实际运行时间} 带权周转时间=作业实际运行时间作业周转时间
带权周转时间必然>= 1,带权周转时间与周转时间都是越小越好。

等待时间

指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。一般也以“平均等待时间”来评价整体性能。

image-20230325162712759

  • 进程来说,等待时间就是指进程建立后等待被服务时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间
  • 作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间

响应时间

指从用户提交请求到系统首次产生响应所用的时间。

对用户公平的调度算法

先来先服务(FCFS)

算法每次从后备队列中选择最先进入该队列的一个或几个作业,将它们调入内存分配必要的资源,创建的进程并放入就绪队列。(只考虑了等待时间

FCFS调度算法属于不可剥夺算法,可以理解成先到的永远都会被放在最前面所以其实调用不了。

算法的特点:

算法简单,效率低;对长作业比较有利,但对短作业不利;有利于CPU频繁忙型作业,而不利于I/O频繁忙型作业。不会导致饥饿。

image-20230328102045861

短作业优先(SJF)

算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周转时间。(在所有进程都几乎同时到达)

最短的作业优先得到服务(最短是指是要求服务时间最短)。既可用于作业调度,也可以用于进程调度。用于进程调度时称为SPF算法。(只考虑了执行时间

SJFSPF是非抢占式的算法。但是也有抢占式的版本——最短剩余时间优先算法SRTN

最短剩余时间优先算法SRTN:每当有进程加入就绪队列或改变时就需要需求调研,如果新到达的进程剩余时间比当前运行进程的剩余时间更短,则由新的进程抢占处理机。

优点:

”最短的平均等待时间、平均周转时间“

缺点:

  • 不公平。对短作业有利,对长作业不利。
  • 作业的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先

会导致饥饿。如果圆圆不断地有短作业进来,可能使长作业长时间得不到服务。如果一直得不到服务,则称为”饿死“

image-20230328103859409

image-20230328104614457

做题小tips:

  1. 题目中未特别说明,所提到的“短作业/进程优先算法”默认时非抢占式的
  2. 书上说的“SJF调度算法的平均等待时间、周转时间最小”。前面的例子表明最短剩余时间优先算法得到的平均等待时间、平均周转时间还要更少。应该要加上一个限定条件:在所有进程几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少
  3. SJF的平均等到时间、周转时间并不一定最少,但相比其他算法SJF可以获得较少的平均等待时间、平均周转时间
高响应比优先(HRRF)

综合考虑做的等待时间和要求服务时间。在每次调度时先计算各个作业的相应比,选择响应比最高的作业为其服务。不会导致饥饿
响应比 = 等待时间 + 要求服务时间 要求服务时间 响应比 = \frac{等待时间 + 要求服务时间}{要求服务时间} 响应比=要求服务时间等待时间+要求服务时间

通过这个式子可以理解为什么要选响应比最高的,响应比高说明对于这个任务来说等待时间已经很长了。短任务和长任务对比时,要到达相同的响应比短作业的等待时间更短。同长短的任务,先到达的任务响应比更高,更先被执行。

非抢占式算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比。

image-20230328114018656

上面三种算法对比

image-20230328114134361

对用户设置等级的调度算法

时间片轮转(RR,Round-Robin)

算法思想:公平、论住哪地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。按照各进程达到就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内完成则剥夺处理机,将进程重新放到就绪队列队尾重新排队。若进程未能在时间片内运行完,将被抢占剥夺处理机使用权,时间片轮转调度算法属于抢占式算法。由时钟装置发出时钟中断来通知CPU时间片已到

用于进程调度(只有作业放入了内存建立了相应的进程后,才能被分配处理机的时间片)。

时间片的大小对系统性能的影响很大。若时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度算法就退化为先来先服务。时间片太小会导致处理机将在进程间过于频繁地切换,使得处理机的开销增大。

时间片的长短通常由:系统响应时间、就绪队列中的进程数目和系统的处理能力决定。

image-20230328115901567

image-20230328115939963

image-20230328115954894

image-20230328120035111

优先级调度算法

优先级调度算法既可用于作业调度也可以用于进程调度。算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它。该算法既可以抢占也可以不抢占。

按创建的后优先级是否变化,可以将优先级分为:

  • 静态优先级。优先级是在创建进程时确定
  • 动态优先级。在进程运行过程中,根据进程的情况变化动态调整优先级

优先级设置可以参考的规则:

  • 系统进程 > 用户进程
  • 交互式进程 > 非交互式进程(或前台进程 > 后台进程)
  • I/O型进程 > 计算型进程。I/O进程是指那些会频繁使用I/O设备的进程

优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度

缺点:若源源不断地有高优先级进程到来,则可能导致饥饿

image-20230328121523586

image-20230328121542170

多级反馈队列调度算法

算法规则:

  1. 设置多级就绪队列,各级队列按优先级从低到高,时间片从小到大
  2. 新进程到达时间先进入第1级队列,按FCFS原则派对等待被分配时间片,若时间片用完还没有完成任务,则进程进入下一级队列队尾。如果已经在最下级队列了,则重新放回该队列队尾
  3. 只有k级队列为空,才会为k+1级队头的进程分配时间片

抢占式算法。在K级队列的进程运行中,若上一级的队列中进入了一个新的进程,则会由于新进程处于优先级更高的队列中,所以新进程会抢占处理机,原来运行的进程放回k级队列队尾

优缺点:

  • 对各类进程相对公平(FCFS的优点)
  • 每个新到达的进程都可以很快得到响应(RR的优点)
  • 短进程只用较少的时间就可以完成(SPF的优点)
  • 不比实现估计进程的运行时间(避免用户作假)
  • 可以灵活地调整对各类进程的偏好程序,比如CPU密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高的优先级)

可能会导致饥俄(要是一直有新的任务进入就绪队列中,导致优先级低的队列中的任务很久不被运行)

image-20230328124638403

上面三种算法对比

image-20230328124601252

image-20230328162925097

多级队列调度算法

image-20230328185049519

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值