操作系统课程设计:模拟进程调度

news/2025/1/21 10:26:58/文章来源:https://www.cnblogs.com/wanzhao1024/p/18683107

2024年末《操作系统》课程设计大作业 模拟进程调度

对 N 个进程应用模拟五种不同的进程调度算法,包括先来先服务(FCFS)、短进程优先(SJF)、时间片轮转(RR)、高响应比优先(HRRN)、动态优先级调度(PR)。

每个进程通过进程控制块(PCB)来标识,PCB 的结构包含以下字段:(a) 进程标识数 ID;(b) 进程到达时间ARRIVETIME;(c) 进程优先级 PRIORITY;(d) 进程运行总时间 ALLTIME;(e) 进程已运行时间 CPUTIME;(f) 进程等待时间 Wait_Time;(g) 进程响应比 Res_Ratio;(h) 进程状态STATE。在动态优先级调度算法中,优先数的调整规则为:进程在就绪队列中每等待一个时间片,优先数增加 1;每运行一个时间片,优先数减少 3。为了观察进程的调度过程,程序需要显示每个时间片内各进程的状态,包括正在运行的进程、在就绪队列中的进程以及在阻塞队列中的进程,以反映进程的就绪态、执行态和阻塞态。

源代码github链接:
https://github.com/yaqli-1024/process-scheduling-algorithm

一、数据结构设计

1、进程控制块(PCB)结构体

PCB 结构体是这段代码的核心数据结构,用于存储进程的相关信息:

(1)ProcessId:进程的唯一标识符。

(2)ARRIVETIME:进程到达系统的时间。

(3)PRIORITY:进程的优先级,数值越大表示优先级越高。

(4)ALLTIME:进程需要的总 CPU 时间。

(5)CPUTIME:进程已经占用的 CPU 时间。

(6)Wait_Time:进程在就绪队列中等待的时间。

(7)Res_Ratio:进程的响应比,用于高响应比优先调度算法。

(8)STATE:进程的当前状态(就绪态、运行态、阻塞态)。

PCB 结构体还包含两个构造函数:一个默认构造函数将所有成员变量初始化为 0,另一个带参数的构造函数允许初始化特定的成员变量。

2、排序函数

提供了多个排序函数,用于不同的进程调度算法:

(1)SortPCB_ARRIVETIME:按进程到达时间排序,用于先来先服务(FCFS)算法。

(2)SortPCB_ALLTIME:按进程所需 CPU 时间排序,用于短进程优先(SJF)算法。

(3)SortPCB_PRIORITY:按进程优先级排序,用于动态优先级调度(PR)算法,如果优先级相同,则按到达时间排序。

(4)SortPCB_Res_Ratio:按进程响应比排序,用于高响应比优先(HRRN)算法。

3、链表节点(Node)结构体

Node 结构体用于构建链表,每个节点包含一个 PCB 数据和一个指向下一个节点的指针pNext。它有两个构造函数:一个默认构造函数和一个带参数的构造函数。

4、链表(NodeList)类

NodeList 类用于管理进程控制块的链表,包含以下功能:

(1)构造函数:初始化链表。

(2)拷贝构造函数:复制链表。

(3)析构函数:销毁链表,释放内存。

(4)isEmpty:检查链表是否为空。

(5)getLength:获取链表长度。

(6)get_X_PCB:获取链表中特定位置的 PCB。

(7)get_X_Node:获取链表中特定位置的 Node。

(8)Print:打印链表中的所有 PCB 数据。

(9)InsertData:在链表中插入数据,可选择是否重新排序。

(10)Delete_X_PCB:删除链表中特定位置的 PCB。

(11)SortList:根据设置的比较函数对链表进行排序。

(12)ComparePCB:设置用于排序的比较函数。

(13)getHeadNode:获取链表的头节点。

二、算法设计

使用自然语言对算法进行描述

1、先来先服务算法(FCFS)

(1)算法首先检查传入的进程链表是否为空。如果不为空,按照进程的到达时间对链表进行排序。

(2)在 realize 方法中,初始化当前时间为 0。

(3)在一个循环中处理队列中的每个进程。首先执行队列中的第一个进程。

(4)对于每个进程,如果它的到达时间大于当前时间,算法会等待直到该进程到达。

(5)一旦进程到达,将其状态设置为执行态。

(6)从就绪队列中删除该进程。

(7)执行该进程直到完成,并更新当前时间。

(8)在每个时间片内输出当前执行的进程和就绪队列的状态。

(9)完成进程执行后,输出已完成的进程信息。

(10)挑选出当前就绪队列中第一个进程并执行,跳转至第 4 步。

(11)如果链表为空,则输出提示信息并结束。

2、短进程优先算法(SJF)

(1)首先检查传入的进程链表是否为空。如果不为空,按照进程的到达时间(ARRIVETIME)对链表进行排序。

(2)在 realize 方法中,初始化当前时间为 0。创建一个空的就绪队列 ready_List,用于存储在当前时间内到达但尚未执行的进程。从进程链表中提取第一个进程 p,并按照到达时间进行调度。

(3)进入主循环:在一个循环中,处理链表中的每个进程,直到主链表和就绪队列均为空。

(4)如果当前时间 now 小于第一个进程的到达时间 p.ARRIVETIME:系统进入空闲状态,输出“当前无进程执行”的状态,同时打印当前时间片内的就绪队列状态(可能为空)。将当前时间now 更新为第一个进程的到达时间 p.ARRIVETIME。

(5)执行当前进程:将当前进程 p 的状态设置为“执行态”(STATE = 1),并开始运行该进程。在执行时间段内,记录每个时间片的状态。

(6)更新就绪队列:遍历主链表,将到达时间在 [ARRIVETIME, ARRIVETIME + ALLTIME]范围内的新进程加入就绪队列。确保只将不在就绪队列中的进程加入,避免重复。将这些进程按照执行时间进行排序。

(7)当前进程完成后,从主链表中删除已完成的进程 p,并输出完成信息。将当前时间 now更新为 now + p.ALLTIME。

(8)如果就绪队列非空,选择执行时间最短的进程作为下一个调度对象。当主链表和就绪队列均为空时,调度循环结束,算法执行完毕。

3、时间片轮转调度算法(RR)

(1)初始化:创建 RR 类实例时,算法首先检查传入的进程链表是否为空。如果不为空,根据进程到达时间(ARRIVETIME)对链表进行排序,并调用 SortList 函数完成初始化。

(2)创建一个空的就绪队列 ready_List,用于存储当前时间之前到达且尚未完成的进程。就绪队列中的进程按照到达时间排序。

(3)进入主循环:主循环依次处理所有未完成的进程,直到主链表和就绪队列均为空。

(4)遍历主链表,将到达时间小于或等于当前时间 now 的进程加入就绪队列,并从主链表中删除这些进程。将被添加的进程状态设置为“就绪态”(STATE = 0)。

(5)处理空闲时间:如果就绪队列为空,检查主链表中是否还有未到达的进程。如果存在未到达的进程,则跳到下一个进程的到达时间,并记录期间的系统空闲状态。

(6)从就绪队列中取出第一个进程,设置其状态为“执行态”(STATE = 1)。执行当前进程一个时间片(长度为 1)。记录当前时间片的状态,增加当前时间 now 并更新进程的已执行时间 CPUTIME。

(7)检查进程是否完成:如果当前进程的已执行时间 CPUTIME 小于总需执行时间ALLTIME,则将其状态设置为“就绪态”(STATE = 0),并将其重新加入到就绪队列末尾。如果当前进程已完成,则输出该进程的完成信息,不再将其放回就绪队列。

(8)继续处理下一时间片。如果就绪队列不为空,则从中取出下一个进程,重复步骤 6 和7。如果就绪队列为空,但主链表中仍有未到达的进程,则跳到下一个到达的进程时间,重复步骤 4 和 5。

(9)当主链表和就绪队列均为空时,调度循环结束,算法执行完毕。

4、高响应比优先算法(HRRN)

(1)初始化:构造一个进程列表(list),其中的进程按照到达时间 (ARRIVETIME) 进行排序。设置一个空的就绪队列(ready_List),以便在调度时存放待执行的进程。就绪队列的排序依据为进程的响应比 (Res_Ratio),高响应比优先。

(2)检查进程列表是否为空。若非空,获取进程列表中第一个到达的进程,将其状态设置为“执行态”(STATE=1),并记录当前时间为 now。

(3)检查是否有进程在当前执行进程的执行时间范围内到达(即 ARRIVETIME 在 [now, now + ALLTIME] 内)。将符合条件且未在就绪队列中的进程加入到就绪队列。如果当前时间未达到下一个进程的到达时间,系统会等待。此时,输出每个空闲时间片的状态。

(4)执行当前进程,更新当前时间 now 和进程的完成状态。输出每个执行时间片的状态。

(5)执行完成的进程将从队列中移除。对就绪队列中的每个进程,计算其等待时间(Wait_Time) 和响应比 (Res_Ratio)。响应比计算公式为:响应比 = (等待时间 + 要求服务时间) / 要求服务时间。按照响应比对就绪队列进行排序。

(6)从就绪队列中选取响应比最高的进程进行执行,设置为“执行态”(STATE=1)。如果就绪队列为空,则从 list 中提取下一个到达的进程进行调度。

(7)当 list 和 ready_List 均为空时,算法结束。

5、动态优先级调度算法(PR)

(1)初始化:所有进程根据到达时间(ARRIVETIME)排序,并存储在一个主队列中,称为 list。同时,定义一个初始为空的就绪队列 ready_List,按照优先级进行排序,用于存放已到达但尚未执行的进程。每个进程的初始优先级被设为 50,时间片大小固定为 1。

(2)从 ready_List 中取出优先级最高的进程进行执行(根据当前优先级排序,优先级越高值越大)。当前进程的状态设置为“执行态”(STATE=1),并执行一个时间片或直到其完成所需的剩余时间(取两者的最小值)。

(3)更新优先级:当前执行的进程优先级每执行一个时间片减少 3。所有其他就绪队列中的进程优先级每经过一个时间片增加 1。

(4)如果当前执行进程的 CPU 时间达到总执行时间(ALLTIME),则标记为完成,并从调度中移除。否则,将其重新加入就绪队列末尾,状态标记为“就绪态”(STATE=0)。

(5)每次时间片结束后,重新根据优先级对就绪队列进行排序,确保优先级最高的进程在下次时间片优先执行。

(6)在就绪队列中挑选出优先级最高的进程执行,重复 2——6 步。

(7)当主队列 list 和就绪队列 ready_List 均为空时,说明所有进程均已完成执行,算法结束。

6、系统测试代码(main)

通过输入数字来选择一种进程调度算法,运行并查看结果。

三、运行结果展示

1、先来先服务算法(FCFS)

2、短进程优先算法(SJF)

3、时间片轮转调度算法(RR)

4、高响应比优先算法(HRRN)

5、动态优先级调度算法(PR)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872690.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VAE模型简析和精要(原理和代码)

1. 前言 这篇博客主要用于记录VAE的原理部分。 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 图均引用自4部分的博客!!!!!!! 2. 正文 这篇博客集各博客之长,比较简洁易懂:因为有的博客交代…

有效提高BT下载速度:Tracker 正确的使用知识

前言BT下载对 DHT 和 Tracker 是非常依赖,然而网上有不少的 Tracker 列表项目,每次更新都要全部添加一遍,显然很麻烦。那么就需要一个每次可以一键更新的列表页面,每天自动获取热门 Tracker 列表项目,去重复后制作成一个 Tracker 列表合集。这样你不需要去一个个添加 Trac…

通过sqlserver添加修改系统管理员账号.120510

一,思路: 在其他服务器B,通过sa账号远程登录需增加/修改系统管理员账号的服务器A,用sqlserver的xp_cmdshell功能,模拟cmd通过net user命令进行添加或者修改系统管理员账号。 特别提示:此解决方案只适用于服务器没有加域且忘记管理员密码的用户使用,请不要作为非法用途!…

MySQL架构总览_查询执行流程_SQL解析顺序

目录MySQL 架构总览查询执行流程连接处理结果SQL 解析顺序准备工作FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT总结参考书籍 MySQL 架构总览 架构最好看图,再配上必要的说明文字。 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解。从上图中我们可以看到,整个架构…

BAT批处理文件语法.061024

bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件。 从更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由专用解释器以行为单位解释执行,这种文本形式更通用的称谓…

AD中域用户密码策略不生效的解决方案.100301

每到一个月,AD就会提示修改密码,改就改吧,但是还提示一些乱七八糟的规则。 我把这些规则都禁用或是设为没有定义了,但还是报“不能和之前的0个密码相同”, 最后, 解决方案: 在域控制器服务器中: 运行以下指令: gpupdate /force好了。.zstitle { width: 280px; text-al…

金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析

金融资产波动率建模在现代金融工程中具有重要地位,其应用涵盖风险管理、衍生品定价和投资组合优化等核心领域。本文着重探讨三种主流波动率建模方法:广义自回归条件异方差模型(GARCH)、Glosten-Jagannathan-Runkle-GARCH模型(GJR-GARCH)以及异质自回归模型(HAR)。本文将系统阐…

「youlai-boot」入门篇:从0到1搭建 Java、Spring Boot、Spring Security 企业级权限管理系统

本文介绍了如何使用 Java 和 Spring Boot 3,从零开始构建开源的 youlai-boot 企业级权限管理系统,涵盖 MySQL、Redis 整合及 Spring Security,适合前端开发者和后端初学者。🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-u…

SQL Server 2005部署备份任务.120308

环境:SQL Server 2005 任务: 1,每日凌晨1点给本地sql server做本地完整备份,且只保留7天的本地备份; 2,每日凌晨5点将本地的备份打包上传到存储服务器。 思路: 1,sql server2005不支持SQL Server2000的sqlmaint命令,所以,需要通过数据库维护计划进行备份,而不能一步…

[每日 B] Kevin and Geometry

前言 想着能做的题也不多, 直接当每日一练的形式写就好了 心态放平, 冷静利用时间 思路 转化题意 考虑一个等腰梯形的性质朴素的想法是, 枚举 \(b\) , 枚举 \(c < b\) , 然后计算是否有对应的 \(a\) 满足 \(\exists a, \exists a + 2c\) , 特判 \(c = 0\) 这样直接爆炸, 考虑…

【译】调查并确定 Windows 运行速度变慢问题

我最近注意到,我的 Windows 7 家用笔记本电脑运行速度比平时要慢。系统似乎在磁盘 I/O 上花了很多时间。当我查看任务管理器时,我发现笔记本电脑的缓存磁盘数据量大约只有平时的 五分之一,但问题的原因并不明显。 我的工作之一是性能专家——要调查各种日常或深层次的性能问…

SQLServer2005恢复Master库.110509

master库对于SQLServer来说,是很重要的系统数据库,保存着所有Sqlserver的用户信息、数据库信息等,当数据库崩溃时,master数据库的恢复成功与否起着重要的作用。这就跟Oracle的System表空间一样,非常的重要。 备份数据前期准备: (1)在备用机准备好和生产机器一样的sql20…