算法思想:

优先级调度算法:

(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++实现)相关推荐

  1. 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)

    文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...

  2. 优先级调度算法动态优先级_与优先级调度有关的问题及其解决方案

    优先级调度算法动态优先级 We are already familiar with what Priority Scheduling is. It is one of the most used pr ...

  3. CPU调度算法——FCFS算法/SJF算法/优先级调度算法/RR算法

    文章目录 一.先来先服务(FCFS)调度算法 二.最短作业优先(SJF)算法 1. 非抢占式SJF 2. 抢占式SJF 三.优先级调度算法 1. 非抢占式优先级调度算法 2. 抢占式优先级调度算法 四 ...

  4. 进程调度 优先级c语言,按优先级调度算法实现进程调度的程序

    一.实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态.当就绪进程个数大于处理机数时,就必须依照某种策略来决定哪些进程优先占用处理机.本实验模拟在单处理机情况下的进程调度,帮助学生 ...

  5. 优先级结合时间片轮转算法c语言,先来先服务/段作业优先/时间片轮转/优先级调度算法详解...

    先来先服务调度算法 先来先服务(First Come First Served,FCFS),是一种简单的调度算法,它既适用于作业调度,也适用于进程调度.先来先服务算法是按照作业或进程到达的先后次序来进 ...

  6. 优先级调度算法实现_《操作系统原理》实验一:进程调度

    操作系统原理实验-进程调度实验报告 一.目的与要求 (1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验选用XX语言编写了一个进程调度模拟程序,使用优先级或时间的轮转法实现进 ...

  7. FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结

    先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...

  8. 操作系统进程调度---优先级调度算法(抢占模式)

    引言 最近学习了操作系统内诸多进程调度算法,动手实现了抢占式优先级调度算法 知识点 该算法又称为优先权调度算法,他既可以用于作业调度,又可用于进程调度.该算法中的优先级用于描述作业运行的紧迫程度. 两 ...

  9. C#进程调度的模拟实现:模拟先来先服务调度算法、短作业优先调度算法和优先级调度算法(考虑非抢占式和抢占式),进行算法评价,输出调度结果和算法评价指标。

    没什么水平,希望能帮到你 环境:visual studio 2019 附带工程资源:C#进程调度的模拟实现附带资源-C#文档类资源-CSDN下载 先来先服务的调度算法:是一种非抢占式的算法,先来先服务 ...

最新文章

  1. WebRTC框架中的硬件加速
  2. linux su、su -和sudo的区别
  3. 使用正则移除尖括号中的指定子字符串
  4. 设置控件全局显示样式appearance proxy
  5. ant接口自动化 junit_ant 学习(3)--结合junit形成自动化测试小框架
  6. [蓝桥杯2015决赛]分机号-枚举(水题)
  7. excel python插件_如何利用Excel与Python制作PPT
  8. Containerd 的前世今生和级入门教程
  9. h710阵列卡支持最大硬盘_戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
  10. 语音识别项目报告.pdf
  11. vue v-model指令
  12. 简单Java类和数据库操作及javafx的结合小项目(二)
  13. mysql创建定时任务 脚本_linux中定时执行mysql脚本
  14. 3层vni vxlan_VXLAN技术介绍:三层的网络来搭建虚拟的二层网络
  15. Unity 编辑器启动弹窗
  16. android 删除图片后通知系统图库删除图片
  17. tableau ODBC驱动下载方法和链接(连接mysql的驱动)
  18. RecyclerView Adapter 优雅封装搞定所有列表
  19. 网络工程师考试复习心得(附详细电子笔记)
  20. Ubuntu安装nvidia显卡驱动和CUDA CUDNN autoinstall

热门文章

  1. 区块链BaaS云服务概念简述
  2. python—多进程之进程池
  3. Celery的简单使用
  4. ida pro 7.5 idapython学习
  5. 【攻防世界017】re4-unvm-me
  6. 题目3:文本文件单词的检索与计数(实现代码)
  7. web安全101之如何理解XXE?
  8. 网络即服务(NaaS)是什么???
  9. 植物大战僵尸食人花无cd逆向分析
  10. android studio 修改程序包名