实验一 进程调度算法设计与实现之短进程优先
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版本上使用
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class pcb
{public:
string name; //进程名
double arr; //到达时间
double ser; //运行时间
};
bool compare(pcb a, pcb b) //自定义比较函数,目的是帮助sort函数找出第一个运行的进程
{
if (a.arr == b.arr)
return a.ser < b.ser;
return a.arr < b.arr;
}
int main()
{ vector<pcb> a = //进程调度信息初始化静态生成数组容器
{
{"P1", 0, 7}, {"P2", 2, 5}, {"P3", 4, 1}, {"P4", 5, 4}, {"P5", 6, 3},
};
sort(a.begin(), a.end(), compare); //运用sort函数找出应该第一个运行的进程
cout << "进程名 \t到达时间\t运行时间\t开始时间\t结束时间\t周转时间\t带权周转时间" << endl;
double sta = a[0].arr;
for (int i = 0; i < a.size(); i++)
{
double jiesu = sta + a[i].ser;
double zhouz = jiesu - a[i].arr;
double Dzhouz = zhouz / a[i].ser;
cout << endl;
cout << a[i].name << "\t" << a[i].arr << "\t\t" << a[i].ser << "\t\t";
cout << sta << "\t\t" << jiesu << "\t\t" << zhouz << "\t\t" << Dzhouz << endl;
if (i < a.size() - 2) //保证数组不越界
{
int max = i + 1;
for (int j = max + 1; j < a.size() && a[j].arr <= jiesu; j++) //找出就绪队列里应执行的下一个进程的数组下标
{
if (a[j].ser < a[max].ser)
max = j;
}
pcb temp = a[max]; //将该执行的下一个进程和就绪队列中的第一个进程交换
a[max] = a[i + 1];
a[i + 1] = temp;
}
if (i < a.size() - 1) //保证数组不越界
sta = jiesu > a[i + 1].arr ? jiesu : a[i + 1].arr;
}
}
运行截图如下:
码字不易,穷酸学生,各位老板打赏个1分钱支持一下,谢谢大家。
前人栽树,后人乘凉。如果有学弟学妹看到了也希望能点赞支持一下,学长搞这些真心不容易