首页 > 编程知识 正文

操作系统实验1处理机调度与死锁代码,处理机调度模拟实验

时间:2023-05-04 02:21:46 阅读:238167 作者:1006

:本文记录 WHUT-计算机学院-操作系统 课程 实验1:处理机调度

>>点击查看武汉理工大学计算机专业课程资料汇总

纸上得来终觉浅,觉知此事需躬行!

1、实验内容:

实验预备:掌握处理机调度的相关内容,对进程调度算法有深入的理解

实验内容:模拟实现进程调度功能

具体要求:

任选一种计算机高级语言编程实现选择1~2种进程调度算法,例如:先来先服务、短进程优先、最高响应比优先、时间片轮转、优先级法等能够输入进程的基本信息,如进程名、到达时间和预估运行时间等根据选择的调度算法显示进程调度顺序显示完成调度后每个进程的开始时间、完成时间、周转时间、带权周转时间计算平均周转时间和平均带权周转时间

2、运行结果: 2.1 测试用例:

2.2 运行截图:

 3、程序源码:

本次实验难度不大,代码建议参考使用,不建议完全Ctrl+C and Ctrl+V!!!

另:代码有不严谨之处,你能发现吗?

#include <iostream>#include <iomanip>using namespace std;//其中i为作业个数,j为作业列数;int n = 4;//作业数//平均周转时间double T=0;//带权周转时间double W = 0;/*定义作业保存数组,第1—n列分别为:作业号、提交时间、估计运行时间、优先数(0行、0列不用)作业号提交时间估计运行时间优先数110.02.02210.21.04310.40.51410.50.33*/double work[5][5] = {0,0,0,0,0,0,1,10.0,2.0,2,0,2,10.2,1.0,4,0,3,10.4,0.5,1,0,4,10.5,0.3,3};//先来先服务算法使用数组//1:作业号 2:提交时间 3:运行时间 4:开始时间 5:终止时间 6:周转时间 7:带权周转时间 8:执行顺序double FCFS[5][9];//短进程优先法数据保存数组;//1:作业号 2:提交时间 3:运行时间 4:开始时间 5:终止时间 6:周转时间 7:带权周转时间 8:执行顺序//double SJF[5][9];//与FCFS共用一套数组//优先级算法使用数组//1:作业号 2:提交时间 3:运行时间 4:优先级 5:开始时间 6:终止时间 7:周转时间 8:带权周转时间 9:执行顺序double YXJ[5][10];//HRN算法使用数组void change(double &a,double &b) {double temp = a;a = b;b = temp;}//初始化,按照提交时间(第 2 列)顺序,进行排序操作int InitFCFS() {//排序for (int i = 1; i <= n; i++) {for (int j = 1; j <= n - i; j++) {if (work[j][2] > work[j + 1][2]) {change(work[j][1], work[j + 1][1]);//作业号交换change(work[j][2], work[j + 1][2]);//提交时间交换change(work[j][3], work[j + 1][3]);//运行时间交换change(work[j][4], work[j + 1][4]);//优先数交换}}}//赋值for (int i = 1; i <= n; i++) {FCFS[i][1] = work[i][1];//更新 作业号FCFS[i][2] = work[i][2];//更新 提交时间FCFS[i][3] = work[i][3];//更新 运行时间 其中优先数在FCFS中用不到}return 1;}//初始化,按照运行时间(第 3 列)顺序,其中最早加入的作业始终置于第一位int InitSJF() {//寻找提交时间最早的一个,并放在第一位double early = 100000;int flag = 0;for (int i = 1; i <= n; i++) {if (early > work[i][2]) {early = work[i][2];flag = i;}}//更新Work表中数据,如果首项不为最早提交的则需要交换,否则不用交换if (flag != 1) {change(work[1][1], work[flag][1]);//作业号交换change(work[1][2], work[flag][2]);//提交时间交换change(work[1][3], work[flag][3]);//运行时间交换change(work[1][4], work[flag][4]);//优先数交换}//排序,其中第一位不需要考虑了,直接从第二位2开始for (int i = 2; i <= n; i++) {for (int j = 2; j <= n - i+1; j++) {if (work[j][3] > work[j + 1][3]) {change(work[j][1], work[j + 1][1]);//作业号交换change(work[j][2], work[j + 1][2]);//提交时间交换change(work[j][3], work[j + 1][3]);//运行时间交换change(work[j][4], work[j + 1][4]);//优先数交换}}}//赋值for (int i = 1; i <= n; i++) {FCFS[i][1] = work[i][1];//更新 作业号FCFS[i][2] = work[i][2];//更新 提交时间FCFS[i][3] = work[i][3];//更新 运行时间 其中优先数在FCFS中用不到}return 1;}//只要对FCFS或者SJF的前三列基本排序完成,那么后边操作相同,合并算法void FCFS_SJF() {//置零T = 0;W = 0;for (int i = 1; i <= n; i++) {//如果是第一个任务if (i == 1) {FCFS[i][4] = FCFS[i][2];//第一个任务:开始时间=提交时间}else {//如果当前任务提交时间比最后一个任务结束时间晚FCFS[i][4] = FCFS[i - 1][5];//第二个任务以后:开始时间=上一个任务的终止时间}FCFS[i][5] = FCFS[i][4] + FCFS[i][3];//终止时间=开始时间+运行时间FCFS[i][6] = FCFS[i][5] - FCFS[i][2];//周转时间=终止时间-提交时间FCFS[i][7] = FCFS[i][6] / FCFS[i][3];//带权周转时间=周转时间÷运行时间FCFS[i][8] = i;//初始化已经对程序执行顺序进行排序,则第i个程序的执行顺序即为i}//计算for (int i = 1; i <= n; i++) {T += FCFS[i][6];W += FCFS[i][7];}T /= n;W /= n;}int InitYXJ() {//寻找提交时间最早的一个,并放在第一位double early = 100000;int flag = 0;for (int i = 1; i <= n; i++) {if (early > work[i][2]) {early = work[i][2];flag = i;}}//更新Work表中数据,如果首项不为最早提交的则需要交换,否则不用交换if (flag != 1) {change(work[1][1], work[flag][1]);//作业号交换change(work[1][2], work[flag][2]);//提交时间交换change(work[1][3], work[flag][3]);//运行时间交换change(work[1][4], work[flag][4]);//优先数交换}//排序,其中第一位不需要考虑了,直接从第二位2开始for (int i = 2; i <= n; i++) {for (int j = 2; j <= n - i + 1; j++) {if (work[j][4] > work[j + 1][4]) {change(work[j][1], work[j + 1][1]);//作业号交换change(work[j][2], work[j + 1][2]);//提交时间交换change(work[j][3], work[j + 1][3]);//运行时间交换change(work[j][4], work[j + 1][4]);//优先数交换}}}//赋值for (int i = 1; i <= n; i++) {YXJ[i][1] = work[i][1];//更新 作业号YXJ[i][2] = work[i][2];//更新 提交时间YXJ[i][3] = work[i][3];//更新 运行时间YXJ[i][4] = work[i][4];//更新 优先级}return 1;}void theFCFS() {InitFCFS();//初始化FCFS数组前三列FCFS_SJF();}void theSJF() {InitSJF();//初始化SJF数组前三列FCFS_SJF();};int InitHRN() {return 1;}void theYXJ() {//置零InitYXJ();T = 0;W = 0;for (int i = 1; i <= n; i++) {//如果是第一个任务if (i == 1) {YXJ[i][5] = YXJ[i][2];//第一个任务:开始时间=提交时间}else {YXJ[i][5] = YXJ[i - 1][6];//第二个任务以后:开始时间=上一个任务的终止时间}YXJ[i][6] = YXJ[i][5] + YXJ[i][3];//终止时间=开始时间+运行时间YXJ[i][7] = YXJ[i][6] - YXJ[i][2];//周转时间=终止时间-提交时间YXJ[i][8] = YXJ[i][7] / YXJ[i][3];//带权周转时间=周转时间÷运行时间YXJ[i][9] = i;//初始化已经对程序执行顺序进行排序,则第i个程序的执行顺序即为i}//计算for (int i = 1; i <= n; i++) {T += YXJ[i][7];W += YXJ[i][8];}T /= n;W /= n;}int main() {cout << "请按照以下格式输入作业信息表:" << endl;cout << "作业号 提交时间 运行时间 优先数" << endl;for (int i = 1; i <= n; i++) {cin >> work[i][1] >> work[i][2] >> work[i][3] >> work[i][4];}cout << "输入完毕!" << endl << endl;while (1) {cout << "1、先来先服务n2、最短作业优先n3、优先级法n0、退出" << endl;int choice;cout << "请选择使用的处理机算法:";cin >> choice;switch (choice) {case 1:cout << "使用先来先服务算法结果如下:" << endl;theFCFS();cout << "作业号tt提交时间t运行时间t开始时间t终止时间t周转时间t带权周转时间t执行顺序" << endl;for (int i = 1; i <= n; i++) {for (int j = 1; j <= 8; j++) {cout << FCFS[i][j] << "tt";}cout << endl;}cout << "平均周转时间:" << T << endl;cout << "带权周转时间:" << W << endl<<endl;break;case 2:theSJF();cout << "使用短作业优先算法结果如下:" << endl;cout << "作业号tt提交时间t运行时间t开始时间t终止时间t周转时间t带权周转时间t执行顺序" << endl;for (int i = 1; i <= n; i++) {for (int j = 1; j <= 8; j++) {cout << FCFS[i][j] << "tt";}cout << endl;}cout << "平均周转时间:" << T << endl;cout << "带权周转时间:" << W << endl<<endl;break;case 3:theYXJ();cout << "使用优先级算法结果如下:" << endl;cout << "作业号tt提交时间t运行时间t优先级tt开始时间t终止时间t周转时间t带权周转时间t执行顺序" << endl;for (int i = 1; i <= n; i++) {for (int j = 1; j <= 9; j++) {cout << YXJ[i][j] << "tt";}cout << endl;}cout << "平均周转时间:" << T << endl;cout << "带权周转时间:" << W << endl << endl;break;default:break;}if (choice==0) {cout << "已退出!" << endl;break;}}return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。