• 操作系统笔记二:进程与调度(1)


    进程

    定义

    程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程,例如,所谓创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上是撤销进程实体中的PCB。

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

    从不同的角度,进程可以有不同的定义,比较传统典型的定义有:

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

    进入进程实体的概念后,可把进程定义为:

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

    组成

    进程(进程实体)由程序段、数据段、PCB三部分组成。

    PCB

    操作系统通过PCB来管理进程,因此PCB中包含操作系统对其进行管理所需的各种信息。

    1. 进程描述信息:
      • 进程标识符(PID):当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的ID,用于区分不同的进程(类似于身份证号)
      • 用户标识符(UID)
    2. 进程控制和管理信息:进程当前状态、优先级
    3. 资源分配清单:程序段指针、数据段指针、键盘、鼠标
    4. 处理机相关信息:
      • 各种寄存器值:当进程切换时需要把进程当前的运行情况记录下来保存在PCB中,如程序计数器的值表示了当前程序执行到哪一句。

    程序段

    程序代码即存在在此

    数据段

    程序运行时使用、产生的运算数据。如全局变量、局部变量、宏定义的常量就存放在数据段内。

    组织

    在一个系统中,通常由数十、数百乃至数千个PCB。为了能对他们加以有效的管理,应该用适当的方式把PCB组织起来。

    组织方式

    1. 链接方式:按照进行状态将PCB分为多个队列,操作系统持有指向各个队列的指针。

      • 执行指针:指向当前处于运行态(执行态)的进程;单CPU计算机中,同一时刻只会有一个进程处于运行状态。
      • 就绪队列指针:指向当前处于就绪状态的进程;通常会把优先级高的进程放在队头。
      • 阻塞队列指针:指向当前处于阻塞态的进程,很多操作系统还会根据阻塞原因不同,再氛围多个阻塞队列。

    2. 索引方式:根据进程状态不同,建立几张索引表,操作系统持有指向各个索引表的指针。

    特征

    • 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的。(动态性是进程最基本的特征)
    • 并发性:内存中有多个进程实体,各进程可并发执行。
    • 独立性:进程是独立运行、独立获得资源、独立接受调度的最基本单位。(进程是资源分配、接受调度的基本单位)
    • 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供"进程同步机制"来解决异步问题。(异步性会导致并发程序执行结果的不确定性)
    • 结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成。

    进程的状态与转换

    进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时又需要等待CPU服务,可见,进程的状态是会有各种变化。为了方便对各个进程的管理,操作系统需要将进程合理地划分为几种状态。

    状态

    三种基本状态

    • 运行态(Running):占有CPU,并在CPU上运行

      注意:单核处理机环境下,每一时刻最多只有一个进程处于运行态。(双核环境下可以同时有两个进程处于运行态)

    • 就绪态(Ready):已经具备运行条件,但由于没有空闲CPU,而暂时不能运行

      进程已经拥有了除处理机之外所有需要的资源,一旦获得处理机,即可立即进入运行态开始运行。即:万事具备,只欠CPU

    • 阻塞态(Waiting/Blocked,又称:等待态):因等待某一时间而暂时不能运行

      如:等待操作系统分配打印机、等待读磁盘操作的结果。CPU是计算机最昂贵的部件,为了提高CPU的利用率,需要先将其他进程需要的资源分配到位,才能得到CPU的服务。

    其他两种状态

    • 创建态(New,又称:新建态):进程正在被创建,操作系统为进程分配资源、初始化PCB
    • 终止态(Terminated,又称:结束态):进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB。

    状态的转换

    进程控制

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

    反正进程控制就是要实现进程状态转换。

    原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。

    这种不可被中断的操作即原子操作

    原语采用"关中断指令"和"开中断指令"实现。

    显然,关/开中断指令的权限非常大,必然是只允许在核心态下执行的特权指令。(原语运行在核心态)

    进程控制相关原语

    进程控制会导致进程状态的转换。无论哪个原语,要做的无非三类事情:

    1. 更新PCB的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
      • 所有的进行控制原语一定都会修改进程状态标志
      • 剥夺当前运行进程的CPU使用权必然需保存其运行环境
      • 某进程开始运行前必然要恢复其运行环境
    2. 将PCB插入合适的队列
    3. 分配/回收资源

    进程的创建

    • 创建原语:申请空白PCB、为新进程分配所需要资源、初始化PCB、将PCB插入就绪队列
    • 引起进程创建的事件:
      • 用户登陆:分时系统,用户登陆成功,系统会建立为其建立一个新的进程
      • 作品调度:多道批处理系统中,有新的作业放入内存时,会为其建立新的进程
      • 提供服务:用户向操作系统提出其某些请求时,会新建一个进程处理该请求
      • 应用请求:由用户进程主动请求创建一个子进程

    进程的撤销

    • 撤销原语:从PCB集合中找到终止的PCB;若进程正在运行,立即剥夺CPU,将CPU分配给其他进程;终止其所有子进程;将该进程拥有的所有资源归还给父进程或操作系统;删除PCB
    • 引起进程终止的事件:正常结束、异常结束、外界干预

    进程的阻塞和唤醒

    1. 进程的阻塞
      • 阻塞原语:找到要阻塞的进程对应的PCB;保护进程运行现场,将PCB状态信息设置为"阻塞态",暂停停止进程运行;将PCB插入相应事件的等待队列
      • 引起该阻塞的事件:需要等待系统分配某种资源,需要等待相互合作的其他进程完成工作
    2. 进程的唤醒
      • 唤醒原语:在事件等待队列中找到PCB;将PCB从等待队列移除,设置进程为就绪态;将PCB插入就绪队列,等待被调度
      • 引起进程唤醒的事件:等待的事件发生

    进程的切换

    • 切换原语:将运行环境信息存入PCB;将PCB移入相应队列;选择另一个进程执行,并更新其PCB;将PCB恢复新进程所需的运行环境
    • 引起进程切换的事件:当前进程时间片到;有更高优先级的进程到达;当前进程主要阻塞;当前进程终止

    线程

    传统的进程是程序执行流的最小基本单位。
    引入线程后,线程是一个基本的CPU执行单位,成为程序执行流的最小单位。进程内的各线程之间也可以 并发,从而进一步提升了系统的并发性。进程只作为除CPU之外的系统资源的分配单位。

    变化

    1. 资源分配:

    1. 传统进程机制中,进程只是资源分配,调度的基本单位
    2. 引入线程后,进程是资源分配的基本单位,线程是调度的基本单位

    2. 并发性

    1. 传统进程机制中,只能进程间并发
    2. 引入线程后,各线程间也能并发,提升了并发度

    3. 系统开销

    1. 传统及进程间并发,需要切换进程的运行环境系统开销很大
    2. 线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小
    3. 引入线程后,并发所带来的系统开销减少

    属性

    1. 线程是处理机调度的基本单位
    2. 多CPU计算机中,各个线程可占用 不同的CPU
    3. 每个线程都有一个线程ID,线程控制块(TCB)
    4. 线程也有就绪,阻塞,运行三种基本状态
    5. 线程几乎不拥有系统资源
    6. 同一进程的不同线程间共享进程的资源
    7. 由于共享内存地址资源,同一进程中的线程通信甚至无需系统干预
    8. 同一进程中的线程切换,不会引起进程切换
    9. 不同进程的线程切换,会引起进程切换
    10. 切换同进程内的线程,系统开销很小
    11. 切换进程,系统开销较大

    实现方式

    用户级线程(User-Level Thread,ULT)
    image-20201201161648081
    用户级线程由应用程序通过线程库实现。
    所有线程管理工作都有应用程序负责(包括线程切换)
    用户级线程中,线程切换可以在用户态即可完成,无需操作系统干预。
    在用户看来,是有多个 线程。但是在 操作系统内核看来,并意识不到线程的存在。(用户级线程对用户不透明,对操作系统透明)
    可以这样理解,“用户级线程”就是“从用户角度能看到的线程

    内核级线程(Kernel-Level Thread,KLT,又称“内核支持的线程)

    内核级线程的管理由操作系统内核完成。线程调度,切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
    可以这样理解,“内核级线程”就是“从操作系统内核视角看能看到的线程

    在同时支持用户级线程和内核级线程的系统,可采用二者结合的方式:将n个用户级线程映射到m个内核级线程上(n>=m)
    image-20201201161709652
    重点重点重点:操作系统只“看得见”内核级线程 ,因此只有内核级线程才是处理机分配的单位。

    多线程模型

    多对一模型:多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
    image-20201201161728766
    优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
    缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行

    一对一模型:一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
    image-20201201161748978
    优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机并行执行。
    缺点:一个用户进程会占用多个内核级线程,线程切换有操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

    多对多模型:n用户及线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。
    image-20201201161919270
    克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

    处理机调度

    基本概念

    在多道程序系统中,进程的数量往往 是多于处理机的个数的,这样不可能同时并行地处理各个进程。处理机调度,就是从就绪对了按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。

    三个层次

    高级调度:
    高级调度(作业调度),按一定的原则从外存上处于后备队列的作业挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利
    高级调度是辅存(外存)与内存之间的调度。每次作业只调入一次,调出 一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指掉入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。
    中级调度:
    引入虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。
    这样做的目的是为了提高内存利用率和系统吞吐量
    暂时调到外存等待进程状态为挂起状态。值得注意的是,PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控,管理。被挂起的进程PCB会被放到的挂起队列中。
    中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。

    低级调度(进程调度),其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。

    进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。

    进程调度的频率很高,一般几十毫秒一次。

    挂起态与七状态模型(补充知识)

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

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

    五状态模型->七状态模型

    image-20201201162741960

    三次调度的联系、对比

    要做什么 调度发生在 发生频率 对进行状态的影响
    高级调度
    (作业调度)
    按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进行 外存->内存
    (面向作业)
    最低 无->创建态->就绪态
    中级调度
    (内存调度)
    按照某种规则,从挂起队列中选择合适的进行将其数据调回内存 外存->内存
    (面向进程)
    中等 挂起态->就绪态
    (阻塞挂起->阻塞态)
    低级调度
    (进程调度)
    按照某种规则,从就绪队列中选择一个进行为其分配处理器 内存->CPU 最高 就绪态->运行态

    进程调度的时机

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

    需要进行进程调度与切换的情况:

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

    不能进行进程调度与切换的情况:

    1. 处理中断的过程中。中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。
    2. 进程在操作系统内核程序临界区中。
    3. 原子操作过程中(原语)。原子操作不可中断,要一气呵成(如之前讲过的修改PCB中进程状态标志,并把PCB放到相应队列)

    进程在操作系统内核程序临界区不能进行调度与切换。

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

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

    内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)

    image-20201202204249506

    • 如果还没退出临界区(还没解锁)就进行进程调度,但是进程调度相关的程序也需要访问就绪队列,但此时就绪队列被锁住了,因此又无法顺利进行进程调度。
    • 内核程序临界区访问的临界资源如果不尽快释放的话,极有可能影响到操作系统内核的其他管理工作。因此在访问内核程序临界区期间不能进行调度与切换。

    image-20201202204615131

    • 在打印机打印完成之前,进程一直处于临界区内,临界资源不会解锁。但打印机又是慢速设备,此时如果一直不允许进程调度的话就会导致CPU一直空闲。
    • 普通临界区访问的临界资源不会直接影响操作系统内核的管理工作。因此在访问普通临界区时可以进程调度与切换。

    进程调度的方式

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

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

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

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

    进程的切换与过程

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

    • 狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换
    • 进程切换是指一个进程让出处理机,由另一个进程占用处理器的过程。
    • 广义的进程调度包含选择一个进程和进程切换两个步骤。

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

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

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

    调度算法的评价指标

    CPU利用率

    由于早期的CPU造价极其昂贵,因此人们会希望让CPU尽可能多地工作。

    CPU利用率:指CPU"忙碌"的时间占总时间的比例

    [利用率=frac{忙碌的时间}{总时间} ]

    系统吞吐量

    对于计算机来说,希望能用尽可能少的时间处理完尽可能多的作业

    系统吞吐量:单位时间内完成作业的数量

    [系统吞吐量=frac{总共完成了多少道作业}{总共花了多少时间} ]

    周转时间

    对于计算机的用户来说,他很关心自己的作业从提交到完成花了多少时间。

    周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。

    它包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等待进程调度(低级调度)的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间。后三项在一个作业的整个处理过程中,可能发生多次。

    [(作业)周转时间=作业完成时间-作业提交时间 ]

    [平均周转时间=frac{各作业周转时间之和}{作业数} ]

    [带权周转时间=frac{作业周转时间}{作业实际运行的时间}=frac{作业完成时间-作业提交时间}{作业实际运行的时间} ]

    (带权周转时间必然(ge1),带权周转时间与周转时间都是越小越好)

    [平均带权周转时间=frac{各作业带权周转时间之和}{作业数} ]

    等待时间

    计算机用户希望自己的作业尽可能少的等待处理机

    等待时间,指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。

    对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。

    对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间

    一个作业总共需要被CPU服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法其实只会影响作业/进程的等待时间。当然,与前面指标类似,也有“平均等待时间”来评价整体性能。

    响应时间

    对于计算机用户来说,会希望自己的提交的请求(比如通过键盘输入了一个调试命令)尽早地开始被系统服务、回应。

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

    调度算法

    前三种算法一般适合用于早期的批处理系统

    先来先服务(FCFS)

    • 算法思想:主要从“公平”的角度考虑(类似于我们生活中排队买东西)
    • 算法规则:按照作业/进程到达的先后顺序进行服务
    • 用于作业/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的时哪个进程先到达就绪队列。
    • 是否可抢占:非抢占式的算法
    • 优缺点:
      • 优点:公平、算法实现简单
      • 缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即,FCFS算法对长作业有利,对短作业不利
    • 是否会导致饥饿:不会

    短作业优先(SJF,Shortest Job First)

    • 算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周周转时间
    • 算法规则:最短的作业/进程优先得到服务(所谓“最短”,式指要求服务时间最短)
    • 用于作业/进程调度:即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF,Short Process First)算法”
    • 是否可抢占:SJF和SPF是非抢占式的算法。但是也有抢占式的版本--最短剩余时间优先算法(SRTN,Shorted Remaining Time Next)
    • 优缺点:
      • 优点:"最短的"平均等待时间、平均周转时间
      • 缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。
    • 是否会导致饥饿:会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”。

    最短剩余时间优先算法:每当有进程加入就绪队列改变时需要调度,如果新达到的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度

    注意几个小细节:

    1. 如果题目中未特别说明,所提到的“短作业/进程优先算法”默认非抢占式的。

    2. 所有进程同时可运行/都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少。

      抢占式的短作业/进程优先调度算法(最短剩余时间优先,SRNT算法)的平均等待时间、平均周转时间最少。

    3. 虽然严格来说,SJF的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(如FCFS),SJF依然可以获得较少的平均等待时间、平均周转时间

    高相应比优先(HRRN,Highest Response Ratio Next)

    • 算法思想:要综合考虑作业/进程的等待时间和要求服务的时间
    • 算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。(响应比=frac{等待时间+要求服务时间}{要求服务时间} ge1)
    • 用于作业/进程调度:即可用于作业调度,也可用于进程调度。
    • 是否可抢占:非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比。
    • 优缺点:
      • 综合考虑了等待时间和运行时间(要求服务时间)
      • 等待时间相同时,要求服务时间短的优先(SJF的优点)
      • 要求服务时间相同时,等待时间长的优先(FCFS的优点)
      • 对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题。
    • 是否会导致饥饿:不会

    后三种算法适合用于交互式系统

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

    • 算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以i得到响应
    • 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程末在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
    • 用于作业/进程调度:用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片)
    • 是否可抢占:若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知CPU时间片已到。
    • 优缺点:
      • 优点:公平;响应快,适用于分时操作系统;
      • 缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。
    • 是否会导致饥饿:不会
    • 补充
      • 如果时间片太多,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化成先来先服务调度算法,并且会增大进程响应时间。因此时间片太大
      • 另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小
      • 一般来说,设计时间破时要让切换进程的开销占比不超过1%。

    优先级调度算法

    • 算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序。

    • 算法规则:调度时选择优先级最高的作业/进程。

    • 用于作业/进程调度:即可用于作业调度,也可用于进程调度。甚至,还会用于在之后会学习的I/O调度中。

    • 是否可抢占:抢占式、非抢占式都有。非抢占式只需在进程主动放弃处理机时进程调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。

    • 优缺点:

      • 优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。
      • 缺点:若源源不断地有高优先级进程到来,则可能导致饥饿。
    • 是否会导致饥饿:会

    • 补充

      • 就绪队列未必只有一个,可以按照不同优先级来组织。另外,也可以把优先级高的进程排在更靠近队头的位置。

      • 根据优先级是否可以动态改变,可将优先级分为静态优先级动态优先级两种。

        静态优先级:创建进程时确定,之后一直不变。

        动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。

      • 通常:系统进程优先级高于用户进程;前台进程优先级高于后台进程;操作系统更偏好I/O型进程(或称I/O繁忙型进程)

        注:与I/O型进程相对的时计算型进程(或称CPU繁忙型进程)

      • 可以从追求公平、提高资源利用率等角度考虑

        如果某进程在就绪队列中等待了很长时间,则可以适当提升其优先级;

        如果某进程占用处理机运行了很长时间,则可适当降低其优先级;

        如果发现一个进程频繁地进行I/O操作,则可适当提升其优先级。

    多级反馈队列调度算法

    • 算法思想:对其他调度算法的折中权衡
    • 算法规则:
      1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
      2. 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。
      3. 只有第k级队列为空时,才会为k+1级队头的进程分配时间片
    • 用于作业/进程调度:用于进程调度
    • 是否可抢占:抢占式的算法。在k级队列的进程运行过程中,若更上级的队列(1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾。
    • 优缺点:
      • 对各类型进程相对公平(FCFS的优点)
      • 每个新到达的进程都可以很快就得到响应(RR的优点)
      • 短进程只用较少的时间就可完成(SPF的优先)
      • 不必实现估计进程的运行时间(避免用户作假)
      • 可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级)
    • 是否会导致饥饿:会
  • 相关阅读:
    【转】忘记密码功能的安全实现(邮件方式)
    windows7下安装gem包---bcrypt-ruby
    Ruby中的%表示法
    ruby中特殊的全局变量
    rails中一个窗体多个模型——fields_for
    【转】深刻理解render 和 redirect_to
    UML核心元素--分析类
    UML核心元素--包
    UML核心元素--边界
    UML核心元素--用例
  • 原文地址:https://www.cnblogs.com/Ligo-Z/p/14139973.html
Copyright © 2020-2023  润新知