操作系统处理机调度及常见的调度算法

2024-05-07 07:48

本文主要是介绍操作系统处理机调度及常见的调度算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

处理机调度的层次

  1. 高级调度:高级调度又称为作业调度或长程调度,其主要功能是根据某种算法,把外存上处于后备队列中的那些作业调入内存,也就是说,它的调度对象是作业;
  2. 中级调度:又称为中程调度,引入中程调度的目的是为了提高内存利用率和系统吞吐量,中级调度实际上就是存储器管理中的对换功能;
  3. 低级调度:低级调度通常也称为进程调度或短程调度,它所调度的对象是进程(或线程),进程调度是最基本的一种调度,在多道批处理,实时,分时三种类型的OS中,都必须配置这级调度;
进程的挂起,阻塞

阻塞:进程在运行过程中必须要获取资源,暂且不说CPU,进程运行肯定要和磁盘进行交互,继而发生IO操作,IO操作势必要引起等待,在资源未读取完成,进程必然要等待,那么在等待IO完成这部分就是阻塞状态。阻塞是一种被动的方式,由于资源获取不到而引起的等待;

睡眠:睡眠就是一种主动的方式,当一个进程获取资源比如获取最普通的锁而失败后,可以有两种处理方式:

  • 1)自己睡眠,触发调度;
  • 2)忙等待,使用完自己的时间;

所以从这里看,睡眠是一种主动的方式,而仅仅作为一种处理手段。当然睡眠不仅仅用于阻塞,更多的,我们可以在适当的时候设置让进程睡眠一定的时间,那么在这里,就可以发现,睡眠之前,我们已经预先规定了,你只能睡多长时间,这段时间过后,比必须返回来工作。

挂起:挂起也是一种主动的行为,具体而言,挂起是系统层面对进程做出的合理操作,本来想说调度,但是进程调度作为专业术语指CPU资源的分配。挂起的标志就是换出到外存,在外存的进程是肯定执行不了的,所以挂起的目的很明显,在内存资源不足时,需要把一些进程换出到外存,给着急运行的进程腾地方,挂起倾向于换出阻塞态的进程,也可以是就绪态的进程,只是这个转换几乎不会采用,因为在任意时刻,肯定可以找到在内存中阻塞态进程,但也不能缺少这种直接把就绪转换为挂起的能力;

其实相比之下,睡眠和其他两个结合的不太紧密,有资料说挂起释放内存,而阻塞不释放内存也有一定道理,下示一个状态转换:
这里写图片描述

  • 就绪态:进程在内存中并可以执行。
  • 阻塞态:进程在内存中并等待一个事件。
  • 阻塞/挂起态:进程在外存中并等待一个事件。
  • 就绪/挂起态:进程在外存中,但是只要被载入内存就可以执行。

阻塞和挂起之间相互转换如下:

阻塞->阻塞/挂起:如果没有就绪进程,则至少一个阻塞进程被换出,为另一个没有阻塞的进程让出空间,如果OS确定当前正在运行的进程或就绪进程为了维护基本的性能要求需要更多的内存空间,那么即使有可用的就绪态进程也可能出现这种转换;

阻塞/挂起->就绪/挂起:如果等待的事件发生了,则处于阻塞/挂起状态的进程可以转换到就绪/挂起状态。注意,这要求操作系统必须能够得到挂起进程的状态信息。

就绪/挂起->就绪:如果内存中没有就绪态进程,操作系统需要调入一个进程继续执行。此外,当处于就绪/挂起态的进程比处于就绪态的任何进程的优先级都要高时,也可以进行这种转换。这种情况的产生是由于操作系统设计者规定调入高优先级的进程比减少交换量更重要。

就绪→就绪/挂起:通常,操作系统更倾向于挂起阻塞态进程而不是就绪态进程,因为就绪态进程可以立即执行,而阻塞态进程占用了内存空间但不能执行。但如果释放内存以得到足够空间的唯一方法是挂起一个就绪态进程,那么这种转换也是必需的。并且,如果操作系统确信高优先级的阻塞态进程很快将会就绪,那么它可能选择挂起一个低优先级的就绪态进程,而不是一个高优先级的阻塞态进程。

调度队列模型

  1. 仅有进程调度的调度队列模型:
    这里写图片描述

  2. 具有高级和低级调度的调度队列模型
    这里写图片描述

  3. 同时具有三级调度的队列模型
    这里写图片描述

调度算法

先来先服务和短作业(进程)优先调度算法

(1)先来先服务调度算法(FCFS):

先来先服务调度算法是一种最简单的调度算法,该算法可用于作业调度,也可用于进程调度,当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它调入内存,为其分配资源,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为其分配处理机,使之投入运行,该进程一直运行到完或发生某事件而阻塞后才放弃处理机;
FCFS算法有利于长作业(进程),不利于短作业(进程);

(2) 短作业(进程)优先调度算法SJ(P)F:
是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度;

优点:SJ(P)F调度算法能够有效的降低作业(进程)的平均等待时间,提高系统吞吐量;
缺点:
1>该算法对长作业不利;
2>完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)长期不被调度;
3>由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度;

高优先权优先调度算法

高优先级调度的含义:
当算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行;
当算法用于进程调度时,将把处理机分配给就绪进程对列中优先级最高的进程;

优先权调度算法的类型:
(1)非抢占式优先级算法:

在这种调度方式下,系统一旦把处理机分配给就绪队列中优先级最高的进程后,该进程就能一直执行下去,直至完成;或因等待某事件的发生使该进程不得不放弃处理机时,系统才能将处理机分配给另一个优先级高的就绪进程。

使用场合:主要用于一般的批处理系统、分时系统,也常用于某些实时性要求不太高的实时系统。

(2)抢占式优先级调度算法:

在这种调度方式下,进程调度程序把处理机分配给当时优先级最高的就绪进程,使之执行。一旦出现了另一个优先级更高的就绪进程时,进程调度程序就停止正在执行的进程,将处理机分配给新出现的优先级最高的就绪进程。

使用场合:常用于实时要求比较严格的实时系统中,以及对实时性能要求高的分时系统。
优先级的类型:进程的优先级可采用静态优先级和动态优先级两种,优先级可由用户自定或由系统确定。

(1)静态优先权:静态优先级是在创建进程时确定进程的优先级,并且规定它在进程的整个运行期间保持不变。
①进程的类型。通常系统进程优先级高于一般用户进程的优先级;交互型的用户进程的优先级高于批处理作业所对应的进程的优先级。
②进程对资源的需求。例如,进程的估计执行时间及内存需求量少的进程,应赋于较高的优先级,这有利缩小作业的平均周转时间。
③根据用户的要求。用户可以根据自己作业的紧迫程度来指定一个合适的优先级。

优点:①简单易行 ②系统开销小
缺点:①不太灵活,很可能出现低优先级的作业(进程),长期得不到调度而等待的情况。
②静态优先级法仅适用于实时要求不太高的系统。

(2)动态优先级:动态优先级是在创建进程时赋予该进程一个初始优先级,然后其优先级随着进程的执行情况的变化而改变,以便获得更好的调度性能。

优缺点:
动态优先级优点是使相应的优先级调度算法比较灵活、科学,可防止有些进程一直得不到调度,也可防止有些进程长期垄断处理机。
动态优先级缺点是需要花费相当多执行程序时间,因而花费的系统开销比较大。

高响应比优先调度算法

在批处理系统中,短作业优先算法是一种比较好的算法,其主要不足是长作业的运行得不到保证,如果我们为每个作业引入前面所述的动态优先权,并使作业的优先级随着等待时间的增加而以速率a 提高,则长作业在等待一定时间后,必然得到机会分配处理机,该优先权的变化规律可描述为:

这里写图片描述

由于等待时间和服务时间之和就是系统对该作业的响应时间,故该优先权又相当于响应比RP,又可表示为:

这里写图片描述

由上式可以看出:

(1) 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而该算法有利于短作业。

(2) 当要求服务的时间相同时,作业的优先权决定于其等待时间,等待时间愈长,其优先权愈高,因而它实现的是先来先服务。

(3) 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升到很高,从而也可获得处理机。简言之,该算法既照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务。因此,该算法实现了一种较好的折衷。当然,在利用该算法时,每要进行调度之前,都须先做响应比的计算,这会增加系统开销

基于时间片的轮转调度算法

时间片轮转算法:
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,每个进程被分配一个时间段,称作为它的时间片,即该进程允许运行的时间。如果该时间片结束时进程正在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU进行切换,调度程序所要做的就是维护一张就绪进程表,当进程用完它的时间片后,它被移动到队列的末尾;

时间片轮转调度中唯一有趣的是时间片的长度,从一个进程切换到另一个进程需要一定时间的—>保存和装入寄存器值及内存映像,更新各种表格和队列等,加入进程切换(有时称为上下文切换),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费在了管理开销上。

原理:在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片,时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间。

这篇关于操作系统处理机调度及常见的调度算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966750

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为