优先级调度算法(C++实现)
算法思想:
优先级调度算法:
(1)假设系统中有5个进程,每个进程有一个进程控制块(PCB)来标识。进程控制块内容包括:进程名,链接指针,进程的优先级,估计运行时间,进程状态。 进程的优先数由用户自己指定或程序任意设定,且优先数越低,优先级越高,调度时,总是选择优先级最高的进程运行。
(2)为了调度方便,设计一个指针指向5个进程排成的就绪队列的第一个进程,另外再设一个当前运行进程指针,指向当前正在运行的进程。
(3)处理机调度时总是选择队列中优先级最高的进程运行。为了采用动态优先级调度,进程每运行一次,其优先级就减1。由于本实验是模拟试验,所以对被选中进程并不实际启动运行,而只是执行:优先数加1和估计运行时间减1。用这两个操作来模拟进程的一次运行。
(4)进程运行一次后,若剩余的运行时间不为0,且其优先级低于就绪队列的优先级,则选择一个高优先级进程抢占CPU;若剩余时间为0,则把它的状态改为完成态(C),并撤出就绪队列。
(5)若就绪队列非空,则重复上述的(3)和(4),直到所有进程为完成态。
(6)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名、运行一次后进程的变化、就绪队列中各进程排队情况等。
代码:
#include<iostream>
#include<string>
#include<queue>
using namespace std;
typedef struct pcb {string pName;//进程名int priorityNumber;//优先数float serviceTime;//服务时间float estimatedRunningtime;//估计运行时间char state;//状态bool operator<(const struct pcb &a)const {return priorityNumber > a.priorityNumber || priorityNumber == a.priorityNumber&&estimatedRunningtime > a.estimatedRunningtime;}
}PCB;void createProcess(priority_queue<PCB> &p, int n) {//创建n个进程,带头结点cout << endl << endl << "创建进程" << endl;PCB r;//工作结点for (int i = 0; i<n; i++) {cout << "请输入第" << i + 1 << "个进程的名字、优先数、服务时间(例如:A 12 8 ):";cin >> r.pName;cin >> r.priorityNumber;cin >> r.serviceTime;r.estimatedRunningtime = r.serviceTime;r.state = 'R';p.push(r);}cout << endl;
}void printProcess(priority_queue<PCB> p) {PCB s;cout << "进程名\t优先数 服务时间 已运行时间 还剩运行时间" << endl;while (p.size() != 0) {s = p.top();cout << s.pName << "\t" << s.priorityNumber << "\t " << s.serviceTime << "\t ";cout << s.serviceTime - s.estimatedRunningtime << "\t " << s.estimatedRunningtime << endl;p.pop();}cout << endl;
}void runProcess(priority_queue<PCB> &p) {//运行进程PCB s;while(p.size()!=0){s = p.top();p.pop();cout << "正在运行的进程" << endl;cout << "进程名\t优先数 服务时间 已运行时间 还剩运行时间" << endl;//输出当前进程cout << s.pName << "\t" << s.priorityNumber << "\t " << s.serviceTime << "\t ";cout << s.serviceTime - s.estimatedRunningtime << "\t " << s.estimatedRunningtime << endl;s.priorityNumber++;//优先数加1s.estimatedRunningtime--;//估计运行时间减1if (s.estimatedRunningtime == 0) {s.state = 'C';}elsep.push(s);cout << "进程" << s.pName << "执行一次之后就绪队列中的进程" << endl;printProcess(p);}cout << endl;
}int main() {priority_queue<PCB> p;int n;cout << "请输入进程的个数:";cin >> n;createProcess(p, n);runProcess(p);getchar();getchar();return 0;
}
实验结果:
优先级调度算法(C++实现)相关推荐
- 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)
文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...
- 优先级调度算法动态优先级_与优先级调度有关的问题及其解决方案
优先级调度算法动态优先级 We are already familiar with what Priority Scheduling is. It is one of the most used pr ...
- CPU调度算法——FCFS算法/SJF算法/优先级调度算法/RR算法
文章目录 一.先来先服务(FCFS)调度算法 二.最短作业优先(SJF)算法 1. 非抢占式SJF 2. 抢占式SJF 三.优先级调度算法 1. 非抢占式优先级调度算法 2. 抢占式优先级调度算法 四 ...
- 进程调度 优先级c语言,按优先级调度算法实现进程调度的程序
一.实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态.当就绪进程个数大于处理机数时,就必须依照某种策略来决定哪些进程优先占用处理机.本实验模拟在单处理机情况下的进程调度,帮助学生 ...
- 优先级结合时间片轮转算法c语言,先来先服务/段作业优先/时间片轮转/优先级调度算法详解...
先来先服务调度算法 先来先服务(First Come First Served,FCFS),是一种简单的调度算法,它既适用于作业调度,也适用于进程调度.先来先服务算法是按照作业或进程到达的先后次序来进 ...
- 优先级调度算法实现_《操作系统原理》实验一:进程调度
操作系统原理实验-进程调度实验报告 一.目的与要求 (1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验选用XX语言编写了一个进程调度模拟程序,使用优先级或时间的轮转法实现进 ...
- FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结
先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...
- 操作系统进程调度---优先级调度算法(抢占模式)
引言 最近学习了操作系统内诸多进程调度算法,动手实现了抢占式优先级调度算法 知识点 该算法又称为优先权调度算法,他既可以用于作业调度,又可用于进程调度.该算法中的优先级用于描述作业运行的紧迫程度. 两 ...
- C#进程调度的模拟实现:模拟先来先服务调度算法、短作业优先调度算法和优先级调度算法(考虑非抢占式和抢占式),进行算法评价,输出调度结果和算法评价指标。
没什么水平,希望能帮到你 环境:visual studio 2019 附带工程资源:C#进程调度的模拟实现附带资源-C#文档类资源-CSDN下载 先来先服务的调度算法:是一种非抢占式的算法,先来先服务 ...
最新文章
- WebRTC框架中的硬件加速
- linux su、su -和sudo的区别
- 使用正则移除尖括号中的指定子字符串
- 设置控件全局显示样式appearance proxy
- ant接口自动化 junit_ant 学习(3)--结合junit形成自动化测试小框架
- [蓝桥杯2015决赛]分机号-枚举(水题)
- excel python插件_如何利用Excel与Python制作PPT
- Containerd 的前世今生和级入门教程
- h710阵列卡支持最大硬盘_戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
- 语音识别项目报告.pdf
- vue v-model指令
- 简单Java类和数据库操作及javafx的结合小项目(二)
- mysql创建定时任务 脚本_linux中定时执行mysql脚本
- 3层vni vxlan_VXLAN技术介绍:三层的网络来搭建虚拟的二层网络
- Unity 编辑器启动弹窗
- android 删除图片后通知系统图库删除图片
- tableau ODBC驱动下载方法和链接(连接mysql的驱动)
- RecyclerView Adapter 优雅封装搞定所有列表
- 网络工程师考试复习心得(附详细电子笔记)
- Ubuntu安装nvidia显卡驱动和CUDA CUDNN autoinstall