操作系统之处理机调度的几种算法

it2026-09-23  14

#include <iostream> using namespace std; typedef struct work { int num;//进程序号 float grade;//优先级 float JB;//动态优先级调整 float uptime;//提交时间 float costtime;//耗费时间长度 float starttime;//开始时间 float endtime;//结束时间 float time;//周转时间 float averagetime;//带权周转时间 }PCB; void FCFS(PCB *WORK,int worknum);//先来先服务算法 void SJF(PCB *WORK,int worknum);//短作业优先算法 void JT(PCB *WORK,int worknum);//静态优先级算法 void HRRN(PCB *WORK,int worknum);//高响应比算法 void shuru(PCB *WORK,int worknum);//输入数据 void shuchu(PCB *WORK,int worknum);//输出数假 void JS(PCB *WORK,int worknum);//求周转时间及带权周转时间 int main() { int worknum; printf("=========================================================================\n"); printf("1.输入数据 2.先入先出算法 3.短作业优先算法\n"); printf("4.静态优先级 5.高响应比 6.周转时间及带权周转时间 -1.退出\n"); printf("=========================================================================\n"); printf("请输入作业的数目以完成初始化:"); cin>>worknum; printf("初始化成功\n"); PCB *WORK=new PCB[worknum]; int i; printf("请输入操作数:"); cin>>i; while(1) { switch(i) { case 1: shuru(WORK,worknum); printf("请输入操作数:"); cin>>i; break; case 2: FCFS(WORK,worknum); shuchu(WORK,worknum); printf("请输入操作数:"); cin>>i; break; case 3: SJF(WORK,worknum); shuchu(WORK,worknum); printf("请输入操作数:"); cin>>i; break; case 4: JT(WORK,worknum); shuchu(WORK,worknum); printf("请输入操作数:"); cin>>i; break; case 5: HRRN(WORK,worknum); shuchu(WORK,worknum); printf("请输入操作数:"); cin>>i; break; case 6: JS(WORK,worknum); printf("请输入操作数:"); cin>>i; break; default: if(i=-1) return 0; else { printf("输入数字非法,请重新输入操作数:"); cin>>i; } break; } } } void shuru(PCB *WORK,int worknum) { printf("请依次输入需要被调度的作业(输入格式:作业序号 作业优先级 作业提交时间(用数字表示) 执行时间):\n"); for (int n=0;n<worknum;n++) { cin>>WORK[n].num>>WORK[n].grade>>WORK[n].uptime>>WORK[n].costtime; WORK[n].JB=WORK[n].costtime/WORK[n].costtime; //初始动态优先级 } printf("作业序号 作业优先级 作业提交时间 执行时间:\n"); for(int i=0;i<worknum;i++) printf("%-9d%-11f%-13f%f\n",WORK[i].num,WORK[i].grade,WORK[i].uptime,WORK[i].costtime); } void shuchu(PCB *WORK,int worknum) { WORK[0].starttime=WORK[0].uptime; WORK[0].endtime=WORK[0].costtime+WORK[0].uptime;; for(int i=1;i<worknum;i++) { if(WORK[i-1].endtime<WORK[i].uptime) WORK[i].starttime=WORK[i].uptime; else WORK[i].starttime=WORK[i-1].endtime; WORK[i].endtime=WORK[i].starttime+WORK[i].costtime; } printf("作业序号 作业优先级 作业提交时间 执行时间 开始时间 结束时间:\n"); for(int i=0;i<worknum;i++) printf("%-9d%-11f%-13f%-9f%-9f%f\n",WORK[i].num,WORK[i].grade,WORK[i].uptime,WORK[i].costtime,WORK[i].starttime,WORK[i].endtime); } void FCFS(PCB *WORK,int worknum) { for(int i=0;i<worknum-1;i++) for(int j=0;j<worknum-1;j++) if(WORK[j].uptime>WORK[j+1].uptime) { PCB temp; temp=WORK[j+1]; WORK[j+1]=WORK[j]; WORK[j]=temp; } } void SJF(PCB *WORK,int worknum) { float MinUptime=0; for(int i=0;i<worknum-1;i++) { for(int j=0;j<worknum-1;j++) { if(WORK[j].uptime>WORK[j+1].uptime) { PCB temp; temp=WORK[j+1]; WORK[j+1]=WORK[j]; WORK[j]=temp; } } } MinUptime=WORK[0].uptime+WORK[0].costtime; for(int i=1;i<worknum-1;i++) //寻找第二短的作业且提交时间小于第一个作业时间,否则按FCFS进行 { if(i!=1) MinUptime+=WORK[i-1].costtime; for(int j=i+1;j<worknum;j++) { if(WORK[i].uptime<MinUptime&&WORK[j].uptime<MinUptime) { if(WORK[i].costtime>WORK[j].costtime) { PCB temp; temp=WORK[j]; WORK[j]=WORK[i]; WORK[i]=temp; } } } } } void JT(PCB *WORK,int worknum) { float MinUptime=0; for(int i=0;i<worknum-1;i++) { for(int j=0;j<worknum-1;j++) { if(WORK[j].uptime>WORK[j+1].uptime) { PCB temp; temp=WORK[j+1]; WORK[j+1]=WORK[j]; WORK[j]=temp; } } } MinUptime=WORK[0].uptime+WORK[0].costtime; for(int i=1;i<worknum-1;i++) //寻找第二优先级高的作业且提交时间小于第一个作业时间,否则按FCFS进行 { if(i!=1) MinUptime+=WORK[i-1].costtime; for(int j=i+1;j<worknum;j++) { if(WORK[i].uptime<MinUptime&&WORK[j].uptime<MinUptime) { if(WORK[i].grade<WORK[j].grade) { PCB temp; temp=WORK[j]; WORK[j]=WORK[i]; WORK[i]=temp; } } } } } void HRRN(PCB *WORK,int worknum) { float MinUptime=0; for(int i=0;i<worknum-1;i++) //排序 { for(int j=0;j<worknum-1;j++) { if(WORK[j].uptime>WORK[j+1].uptime) { PCB temp; temp=WORK[j+1]; WORK[j+1]=WORK[j]; WORK[j]=temp; } } } MinUptime=WORK[0].uptime+WORK[0].costtime; for(int i=1;i<worknum-1;i++) //寻找第二优先级提交时间小于第一个作业时间,否则按FCFS进行 { if(i!=1) MinUptime+=WORK[i-1].costtime; for(int h=i;h<worknum;h++) { if(WORK[h].uptime<=MinUptime) WORK[h].JB=(WORK[h].costtime+MinUptime-WORK[h].uptime)/WORK[h].costtime; } for(int j=i+1;j<worknum;j++) { if(WORK[i].uptime<MinUptime&&WORK[j].uptime<MinUptime) { if(WORK[i].JB<WORK[j].JB) { PCB temp; temp=WORK[j]; WORK[j]=WORK[i]; WORK[i]=temp; } } } } } void JS(PCB *WORK,int worknum) { int i=0; float T=0,W=0,a,b; while(i<worknum)//计算周转时间,带权周转时间 { WORK[i].time=WORK[i].endtime-WORK[i].uptime; WORK[i].averagetime=WORK[i].time/WORK[i].costtime; T=T+WORK[i].time; W=W+WORK[i].averagetime; i++; } a=T/worknum; b=W/worknum; printf("平均周转时间:%f\n平均带权周转时间:%f\n",a,b); }
最新回复(0)