实验一 进程调度算法设计与实现之动态优先数加时间片轮转法实现进程调度
1.内容:设计一个简单的进程调度算法,模拟OS中的进程调度过程;
2.要求:
① 进程数不少于5个;
② 进程调度算法如下三种:
动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3(必做);
多级队列轮转(可选);
高响应比优先(可选);
短进程优先(可选);
③ 用C语言、C++或Java编程;
④ 程序运行时显示进程调度过程。
3.步骤:
① 设计PCB及其数据结构:
进程标识数:ID
进程优先数:PRIORITY(优先数越大,优先级越高)
进程已占用时间片:CPUTIME,每得到一次调度,值加1;
进程还需占用时间片:ALLTIME,每得到一次调度,该值减1,一旦运行完毕,ALLTIME为0)
进程队列指针:NEXT,用来将PCB排成队列
进程状态:STATE(一般为就绪,可以不用)
② 设计进程就绪队列及数据结构;
③ 设计进程调度算法,并画出程序流程图;
④ 设计输入数据和输出格式;
结构格式:当前正运行的进程:0
当前就绪队列:2,1,3,4
⑤ 编程上机,验证结果。
4.提示:进程调度信息可以初始化时静态生成,也可以程序运行过程动态到达;
假设调度前,系统中有5个进程,其初始状态如下:
ID 0 1 2 3 4
PRIORITY 9 38 30 29 0 可否考虑用数组或链表去实现
CPUTIME 0 0 0 0 0
ALLTIME 3 2 6 3 4
STATE ready ready ready ready ready
① 以时间片为单位调度运行;
② 每次调度ALLTIME不为0,且PRIORITY最大的进程运行一个时间片;
③ 上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复②,③
④ 直到所有进程的ALLTIME均变为0。
5.书写实验报告
① 实验题目;
② 实验要求;
③ 程序中所用数据结构及说明;
④ 调度算法思想描述;
⑤ 算法流程图;
○6 程序清单;
○7 测试数据及实验结果分析: 输出调度序列,计算不同算法下进程平均周转时间并比较。
以上为报告要求。
*
本文为博主原创文章,未经博主允许不得转载。
版权为陈博超所有,第一次于2021年11月30日发表于BLOG上
本BLOG上原创文章未经本人许可,不得用于商业用途。转载请经允许后注明出处,否则保留追究法律责任的权利。
*
动态优先数加时间片轮转法实现进程调度:
以下部分为实现代码:
温馨提示:代码所用部分特性为C++11新特性,在例如vs2010这类不支持C++11的老版本上无法使用,请在已经支持C++11新特性的vs版本上使用
头文件PCB.h中代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class pcb
{
public:
int ID; //进程标识数
int PRIORITY; //进程优先数
int CPUTIME; //进程已占用时间片
int ALLTIME; //进程还需时间片
public:
int setPRIORITY(int i) //设置优先级数函数
{
return PRIORITY -= i;
}
int setCPUTIME(int i) //设置已占用时间片数函数
{
return CPUTIME += i;
}
int setALLTIME(int i) //设置还需时间片数函数
{
return ALLTIME -= i;
}
};
源文件 进程调度动态优先和时间轮片.cpp中代码:
#include "PCB.h"
bool compare(pcb a, pcb b) //自定义比较函数,目的是帮助sort函数排序
{
return a.PRIORITY > b.PRIORITY;
}
int main()
{
double time = 0;
double current_time = 0;
vector<pcb> a = { //进程调度信息初始化静态生成数组容器
{0, 9, 0, 3,},{1, 38, 0, 2,},{2, 30, 0, 6,},{3, 29, 0, 3,},{4, 0, 0, 4,},
};
while (a.size() > 0)
{
sort(a.begin(), a.end(), compare); //调用排序函数
if (a[0].ALLTIME != 0)
{
current_time++;
cout << endl;
cout << "正在运行的进程:";
cout << a[0].ID << endl;
a[0].setPRIORITY(3); //优先级减3
a[0].setCPUTIME(1); //进程已占用时间片加1
a[0].setALLTIME(1); //进程还需时间片减1
cout << "当前就绪队列ID:";
for (int i = 1; i < a.size(); i++) //输出就绪队列
{
cout << a[i].ID << " ";
}
if (a[0].ALLTIME == 0) //判断是否运行完成,若完成则出容器
{
time += current_time;
a.erase(a.begin());
}
cout << endl;
}
}
cout << "平均周转时间:" << time / a.capacity() << endl;
return 0;
}
运行截图如下:
码字不易,穷酸学生,各位老板打赏个1分钱支持一下,谢谢大家。
前人栽树,后人乘凉。如果有学弟学妹看到了也希望能点赞支持一下,学长搞这些真心不容易