操作系统之时间片轮转算法

it2026-08-30  1

#include<stdio.h> #include <iostream> using namespace std; #define MAX 100 struct PCB { char name[10]; //进程名称 float uptime; //到达时间 float costtime; //运行时间 float starttime; //开始运行时间 float endtime; //运行结束时间 float time; //周转时间 float averagetime; //带权周转时间 int run_flag; //调度标志 int start_flag; //是否为第一次开始调度 }WORK[MAX]; int worknum; //进程个数 int key; //时间片长度 void shuru(); //输入数据 void shuchu(); //输出结果 void RR(); //时间轮转算法 int charge(); //判断是否所有的进程都被执行过 void RR() { float time=0; int i; int j=0; int k=0; struct PCB WORKS[MAX]; //备份 for(i=0; i<worknum; i++) WORKS[j++]=WORK[i]; //对进程的初始化信息备份 time=WORK[0].uptime; while(charge()) { for(i=0; i<worknum; i++) { if(i>0) { if(WORK[i].uptime>time&&WORK[i-1].run_flag==1)//前面运行完了 time=WORK[i].uptime;//用于进程不连续时跳过间隔 } if(WORK[i].run_flag==0&&WORK[i].uptime<=time) //该进程还未结束 { if(WORK[i].start_flag==0) //判断是否第一次执行,记录开始执行时间 { WORK[i].starttime=time; WORK[i].start_flag=1; } if(WORK[i].costtime/key>1)//多于一个时间片未执行 { WORK[i].costtime=WORK[i].costtime-key; time=time+key; } else if(WORK[i].costtime-key==0) { time=time+key; WORK[i].endtime=time; WORK[i].run_flag=1;//该进程运行结束 WORK[i].costtime=WORKS[i].costtime; } else //运行小于一个时间片长度 { time=time+WORK[i].costtime; WORK[i].endtime=time; WORK[i].run_flag=1; WORK[i].costtime=WORKS[i].costtime; } } } } } int charge()//判断是否全部进程都执行完毕 { int k; int super_flag=0; for(k=0; k<worknum; k++) { if(WORK[k].run_flag==0) { super_flag=1; return super_flag; break; } } return super_flag; } void shuru() //输入函数 { int i; printf("请输入进程数:"); cin>>worknum; printf("请输入时间片长度:"); cin>>key; for(i=0; i<worknum; i++) { printf("请依次输入%d个:进程名 到达时间 运行时间:",i+1); cin>>WORK[i].name>>WORK[i].uptime>>WORK[i].costtime; WORK[i].starttime=0; WORK[i].endtime=0; WORK[i].run_flag=0; //运行是否结束(初始化),0为未运行结束标志 WORK[i].start_flag=0; //是否首次被执行(初始化),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; } } void shuchu() //输出函数 { int i; float T1=0,T2=0; printf("进程名 到达时间 运行时间 开始时间 结束时间 周转时间 带权周转时间\n"); for(i=0; i<worknum; i++) { WORK[i].time=WORK[i].endtime-WORK[i].uptime;//周转时间 WORK[i].averagetime=WORK[i].time/WORK[i].costtime;//平均周转时间 T1+=WORK[i].time; T2+=WORK[i].averagetime; printf("%-7s%-9f%-9f%-9f%-9f%-9f%-9f%\n",WORK[i].name,WORK[i].uptime,WORK[i].costtime,WORK[i].starttime,WORK[i].endtime,WORK[i].time,WORK[i].averagetime); } printf("平均周转时间=%f,平均带权周转时间=%f\n",T1/worknum,T2/worknum); } void main() { shuru(); printf("时间片轮转算法:\n"); RR(); shuchu(); }
最新回复(0)