一、实验内容与要求
二、实验流程图
三、实验分析
优先权调度算法
首先,时间片轮转法需要实时根据优先权大小对进程排序,优先级大的进程先运行,所以采用优先队列的数据结构是最合适的。
PCB中还需要存放进程的名称、进程的所需时间、进程的优先权、进程的状态,可以采用结构体,同时还可以自定义进程的排序方式。
初始化时,进程的所需时间范围规定为1-20;又因为每个时间片结束,进程所需时间-1,优先权-3,为使优先级不小于0,规定优先级为60-80;进程的初始状态都为ready。
采用优先级调度算法时,每次先将队首进程状态置为running,然后输出各进程的状态。若此时队首的进程状态都为finish,则代表全部的进程都已经完成,即退出;否则时间片到后,进程所需时间-1,优先权-3,再继续判断进程是否已经完成,若完成,则将进程的优先权置为最小的0后入队,保证在优先队列中,该进程总是在队尾的。
时间片轮转算法
轮转法要注意理解轮转时间片的概念,轮转时间片规定了该进程每次最多可运行的时间片数。
在轮转法中,若已占用的时间片<轮转时间片,那么该进程一直在队首占用CPU运行,采用普通的队列,每次队首出列后,只能在队尾弹入,所以我采用了双端队列的数据结构,这样在占用时间片<轮转时间片的情况下,进程可以直接弹入队首,减少了时间复杂度和空间复杂度。
另外,在轮转法中,进程完成后无法像优先队列那样一直在队尾,所以我另外开了一个队列,存放已完成的进程情况。
四、实验代码
#include <bits/stdc++.h>
using namespace std;
//*************************优先级调度算法****************************//
struct PCB_PSA {
int id; //进程名称
int need_time; //进程所需时间
int priority; //进程的优先级
string state; //进程的状态
//优先队列排序,优先级大的进程先执行
bool operator<(const PCB_PSA &a) const {
return a.priority >= priority;
}
};
int cnt = 1; //记录时间
int n; //进程个数
char c; //选择调度算法
priority_queue<PCB_PSA> pcb_PSA;
//进程初始化
void init_PSA() {
for (int i = 1; i <= n; i++) {
PCB_PSA t;
t.id = i;
t.need_time = rand() % 20 + 1; //进程所需时间为1~20
t.priority = rand() % 20 + 60; //进程优先权为60~80,因为每执行一个时间片优先权-3,优先权很快会变成负数,采用这个范围的话优先权最小为0
t.state = "ready"; //进程状态初始化为ready
pcb_PSA.push(t);
}
}
//输出当前进程运行情况
void print_PSA() {
priority_queue<PCB_PSA> temp = pcb_PSA;
PCB_PSA t;
cout << endl << "当前时刻:" << cnt++ << endl;
while (!temp.empty()) {
t = temp.top();
temp.pop();
cout << "进程名称:" << t.id << "\t状态:" << t.state << "\t所需时间:" << t.need_time << "\t优先级:" << t.priority << endl;
}
}
//优先级调度
void PSA() {
PCB_PSA t;
while (1) {
//将队首进程状态改为running,然后输出进程执行情况
t = pcb_PSA.top();
pcb_PSA.pop();
if (t.state != "finish")t.state = "running";
pcb_PSA.push(t);
print_PSA();
t = pcb_PSA.top();
pcb_PSA.pop();
//若队首进程的状态为finish,则进程全部完成,退出。
if (t.state == "finish")break;
//时间片到,进程所需时间-1,优先权-3
t.need_time -= 1;
t.priority -= 3;
//若进程所需时间为0,则将优先权置为最小0;否则状态变为ready。
if (t.need_time == 0) {
t.state = "finish";
t.priority = 0;
} else {
t.state = "ready";
}
pcb_PSA.push(t);
}
}
//********************************************************************//
//***************************时间片轮转调度算法***************************//
struct PCB_RR {
int id; //进程名称
int need_time; //进程所需时间
int round_time; //进程轮转时间片
int hold_time; //进程占已用时间
string state; //进程状态
};
//pcb_finish存放已经完成的进程
deque<PCB_RR> pcb_RR, pcb_finish;
//进程初始化
void init_RR() {
for (int i = 1; i <= n; i++) {
PCB_RR t;
t.id = i;
t.need_time = rand() % 20 + 1; //进程所需时间范围为1~20
t.round_time = rand() % 20 + 1; //进程轮转时间片为1~20
t.hold_time = 0; //进程占用时间初始化为0
t.state = "ready"; //进程状态初始化为ready
pcb_RR.push_back(t);
}
}
//输出当前进程运行情况+已完成的进程情况
void print_RR() {
cout << endl << "当前时刻:" << cnt++ << endl;
deque<PCB_RR> temp = pcb_RR;
PCB_RR t;
while (!temp.empty()) {
t = temp.front();
temp.pop_front();
cout << "进程名称:" << t.id << "\t状态:" << t.state << "\t所需时间:" << t.need_time << "\t轮转时间片:" << t.round_time << endl;
}
temp = pcb_finish;
while (!temp.empty()) {
t = temp.front();
temp.pop_front();
cout << "进程名称:" << t.id << "\t状态:" << t.state << "\t所需时间:" << t.need_time << "\t轮转时间片:" << t.round_time << endl;
}
}
//轮转时间片
void RR() {
PCB_RR t;
while (!pcb_RR.empty()) {
//将队首进程状态改为running,然后输出当前进程执行情况
t = pcb_RR.front();
pcb_RR.pop_front();
t.state = "running";
pcb_RR.push_front(t);
print_RR();
t = pcb_RR.front();
pcb_RR.pop_front();
//时间片到,进程所需时间-1,进程占用时间+1
t.need_time -= 1;
t.hold_time += 1;
//若进程所需时间为0,则进程执行完成,入pcb_finish队列
//若占用时间=轮转时间片,进程占用时间置0,入队尾
//否则进程入队首
if (t.need_time == 0) {
t.state = "finish";
pcb_finish.push_back(t);
} else if (t.hold_time == t.round_time) {
t.state = "ready";
t.hold_time = 0;
pcb_RR.push_back(t);
} else {
pcb_RR.push_front(t);
}
}
print_RR();
}
//*********************************************************************//
int main() {
srand(time(NULL));
cout << "请输入进程数(4~8个):";
cin >> n;
cout << "请选择调度方法(y:优先权法;n:轮转法):";
cin >> c;
if (c == 'y') {
init_PSA();
PSA();
} else if (c == 'n') {
init_RR();
RR();
}
return 0;
}
文章浏览阅读119次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼/***Getaparametervalue**@paramkeyString*@paramdefString*@returnString*/publicStringgetParameter(Stringkey,Stringdef){returnisStandalone?System.getProperty(ke..._java http隧道
文章浏览阅读913次。IP主机名备注192.168.117.14keepalived-master主节点192.168.117.15keepalived-slaver备节点192.168.117.100VIP1.主备节点均安装keepalived# yum install -y keepalived httpd2.主备节点均修改keepalived日志存放路径..._keepalived sendmail
文章浏览阅读469次。--==========================================--SPFILE错误导致数据库无法启动(ORA-01565)--========================================== SPFILE错误导致数据库无法启动 SQL> startup ORA-01078: failurein proce_ora01565 ora27046
文章浏览阅读6.1k次,点赞2次,收藏54次。功能测试基础知识总结_功能测试
文章浏览阅读3.2k次,点赞3次,收藏2次。pg 中文首字母排序_pg中文排序
文章浏览阅读3.1w次,点赞23次,收藏109次。本文主要讲解CONVERT函数_mysql convert
文章浏览阅读8.6k次,点赞2次,收藏2次。HTML5 的视频播放事件想必大家已经期待很久了吧,在HTML4.1、4.0之前我们如果在网页上播放视频无外乎两种方法: 第一种:安装FLASH插件或者微软发布的插件 第二种:在本地安装播放器,在线播放组件之类的 因为并不是所有的浏览器都安装了FLASH插件,就算安装也不一定所有的都能安装成功。像苹果系统就是默认禁用FLASH的,安卓虽然一开始的时候支持FLASH,但是在安卓4.0以后也开始不_微信开发者工具视频快进
文章浏览阅读5.4k次,点赞3次,收藏4次。在使用redis的过程常见错误总结1.JedisConnectionException Connection Reset参考这边文章:Connection reset原因分析和解决方案https://blog.csdn.net/cwclw/article/details/527971311.1问题描述Exception in thread "main" redis.clients...._jedisconnectionexception: java.net.socketexception: connection reset
文章浏览阅读8.3k次,点赞8次,收藏42次。目录1.Lua垃圾回收算法原理简述2.Lua垃圾回收中的三种颜色3.Lua垃圾回收详细过程4.步骤源码详解4.1新建对象阶段4.2触发条件4.3 GC函数状态机4.4标记阶段4.5清除阶段5.总结参考资料lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前..._lua5.3 gc
文章浏览阅读511次。最近家中的潮人,老妈闲着没事干,开始学玩电脑,引起他的各种好奇心。如看看新闻,上上微信或做做其他的事情。但意料之中的是电脑上会莫名出现各种问题?不翼而飞的图标?照片又不见了?文件被删了,卡机或者黑屏,无声音了,等等问题。常常让她束手无策,求助于我,可惜在电话中说不清,往往只能苦等我回家后才能解决,那种开心乐趣一下子消失了。想想,这样也不是办法啊, 于是,我潜心寻找了两款优秀的远程控制软件。两款软件...
文章浏览阅读1.8k次。二.初始化工作空间三.设置下载地址四.下载功能包此处可能会报错,请看:rosdep update遇到ERROR: error loading sources list: The read operation timed out问题_DD᭄ꦿng的博客-程序员宅基地接下来一次安装所有功能包,注意对应ROS版本 五.编译功能包isolated:单独编译各个功能包,每个功能包之间不产生依赖。编译过程时间比较长,可能需要几分钟时间。此处可能会报错:缺少absl依赖包_ros18.04 安装ca
文章浏览阅读4.1k次,点赞3次,收藏7次。Haobor2.2.1配置(trivy扫描器、镜像签名)docker-compose下载https://github.com/docker/compose/releases安装cp docker-compose /usr/local/binchmod +x /usr/local/bin/docker-composeharbor下载https://github.com/goharbor/harbor/releases解压tar xf xxx.tgx配置harbor根下建立:mkd_init error: db error: failed to download vulnerability db: database download