时间片轮转RR进程调度算法

这篇文章详细描述了一个C++程序,用于模拟RR调度算法,计算进程的周转时间和带权周转时间,并输出平均值。适用于教学和理解进程调度原理。
摘要由CSDN通过智能技术生成

设计程序模拟进程的时间片轮转RR调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。

程序要求

1)进程个数n;每个进程的到达时间T1, … ,Tn和服务时间S1, … ,Sn;输入时间片大小q。

2)要求时间片轮转法RR调度进程运行,计算每个进程的周转时间和带权周转时间,并且计算所有进程的平均周转时间和带权平均周转时间;

3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;

4)输出:要求输出计算出来的每个进程的周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间。

完整代码

#include <iostream>
#include <queue>
#include <iomanip>
#include <fstream>
using namespace std;
 
//存放每个进程信息的结构体
typedef struct{
    char name;
    double ArrivalTime;//到达时间
    double ServiceTime;//服务时间
    double FinishTime;//完成时间
    double WholeTime;//周转时间
    double WeightWholeTime;//带权周转时间
}PRO;


static queue<PRO>PROqueue;  //用来模拟进程执行RR调度算法的队列
static double SumWT=0,SumWWT=0,AverageWT =0,AverageWWT=0;//平均周转时间、平均带权周转时间
static int q;  //时间片数
static int n;  //进程个数
static PRO PROarray[100];  //进程结构体
static PRO temp;  //进程结构

void Input(){
	cout<<"请输入进程个数: ";
    cin>>n;
    
	cout<<"请输入"<<n<<"个进程的进程名字(空格隔开):";
	for(int i=0;i<n;i++){
		cin>>PROarray[i].name;
	}
	
	cout<<"请输入"<<n<<"个进程的到达时间(空格隔开):";
	for(int j=0;j<n;j++){
		cin>>PROarray[j].ArrivalTime;
	}
	
	cout<<"请输入"<<n<<"个进程的服务时间(空格隔开):";
	for(int k=0;k<n;k++){
		cin>>PROarray[k].ServiceTime;
	}
	
	cout<<"请输入时间片q的大小:";
	cin>>q;
	cout<<endl; 
	
	//按照到达时间进行排序
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			if(PROarray[i].ArrivalTime>PROarray[j].ArrivalTime){//i比j后到   交换顺序 
				temp=PROarray[i];
				PROarray[i]=PROarray[j];
				PROarray[j]=temp;
			}
		}
	} 
} 

//执行RR调度算法
void RR(){
    char processName[100];   //存储每个时间片p对应的进程名称
   	PROqueue.push(PROarray[0]);   //第一个进程进队列
    int CurrentTime=0;//当前时间 
    int tempTime;   //控制CurrentTime的累加时间,当前进程的服务时间小于时间片q的时候,起到重要作用
    int i=1;  
    int a=0; 
    int processNumber = 0;   //执行RR算法后,进程的个数 
    int Time[100] ;
    //判断第一个进程的服务时间是否大于时间片,如果大于CurrentTime=q,如果小于CurrentTime=服务时间
    if (PROarray[0].ServiceTime>=q)
        CurrentTime = q;
    else
        CurrentTime = PROarray[0].ServiceTime;
  
    while(!PROqueue.empty()){
        for (int j=i;j<n;j++){   //使得满足进程的到达时间小于当前时间的进程都进入队列
            if (PROarray[j].name!=NULL && CurrentTime >= PROarray[j].ArrivalTime){
                PROqueue.push(PROarray[j]);
                i++;
            }
        }
        //队列首进程进行执行,进程每执行一次,就将其服务时间 -q
        if (PROqueue.front().ServiceTime>=q)
            tempTime = q;
        else
            tempTime = PROqueue.front().ServiceTime;
            	
        PROqueue.front().ServiceTime -= q;  
 
        //将队首进程的名称放入数组中
        processName[a]= PROqueue.front().name;
        a++;
        Time[processNumber] = tempTime;
        processNumber++;
 
 
        if (PROqueue.front().ServiceTime <= 0)  //把执行完的进程退出队列
            PROqueue.pop();   //如果进程的服务时间小于等于,即该进程已经服务完了,将其退栈
        else{
            //将队首移到队尾
            PROqueue.push(PROqueue.front());
            PROqueue.pop();
        }
         CurrentTime += tempTime;
    }
   //进程输出处理   每个时间段对应的执行的进程
 

	int time = Time[0];
	int count = 0;

  
  //计算完成时间
	for (int i=0;i<processNumber;i++)
	{
		count = 0;
		while(PROarray[count].name!=processName[i] &&count<n)
		{	
			count++ ;
		} 
		PROarray[count].FinishTime=time ;
		if (i<processNumber-1)
		{
			time += Time[i+1];
		}
	}
 	
	//周转时间、带权周转时间、平均周转时间、带权平均周转时间的计算
    for (int i=0;i<n;i++){
        PROarray[i].WholeTime = PROarray[i].FinishTime - PROarray[i].ArrivalTime;
        PROarray[i].WeightWholeTime = (double)PROarray[i].WholeTime/PROarray[i].ServiceTime;
    }
 
    for (int i=0;i<n;i++){
        SumWT += PROarray[i].WholeTime;
        SumWWT += PROarray[i].WeightWholeTime;
    }
    AverageWT = SumWT/n;
    AverageWWT = SumWWT/n;
	
	cout<<"各个时间点的执行情况如下:"<<endl;
	for(int i=0;i<processNumber;i++){//输出
        for(int j=0;j<Time[i];j++){
            cout<<setw(3)<<count-2<<"--"<<setw(3)<<count-1<<setw(6)<<"时刻  "<<"进程"<<processName[i]<<"开始执行";
        for(int k=0;k<n;k++){
            if(PROarray[k].ArrivalTime==count){
                cout<<"   进程"<<PROarray[k].name<<"到达";
            }
            else if(PROarray[k].FinishTime==count+1&&count!=0){
                cout<<"   进程"<<PROarray[k].name<<"完成";
        }
        }
        count+=1;
        cout<<endl;
	    }
	}
   
 
}

//显示各时间点的执行情况
void output(){
    int i;
    cout<<endl;
    cout<<"进程信息如下:"<<endl;
	cout<<"------------------------------------------------------------------------"<<endl;
	cout<<left<<setw(12)<<"进程名"<<setw(12)<<"到达时间"<<setw(12)<<"服务时间"<<setw(12)<<"完成时间"<<setw(12)<<"周转时间"<<setw(12)<<"带权周转时间"<<endl;
	cout<<"------------------------------------------------------------------------"<<endl;
	for(int i=0;i<n;i++){
		cout<<left<<setw(12)<<PROarray[i].name;
		cout<<setw(12)<<PROarray[i].ArrivalTime;
		cout<<setw(12)<<PROarray[i].ServiceTime;
		cout<<setw(12)<<PROarray[i].FinishTime;
		cout<<setw(12)<<PROarray[i].WholeTime;
		cout<<setw(12)<<PROarray[i].WeightWholeTime<<endl;
	}
	cout<<"------------------------------------------------------------------------"<<endl;
	
	cout<<"平均周转时间:"<<AverageWT<<endl;
	cout<<"平均带权周转时间:"<<AverageWWT<<endl;
	cout<<endl;
}


int main(){
    Input();
    RR();
    output();
    return 0;
}

实例运行结果截图:

 

5个进程

进程名字:A B C D E

进程的到达时间:0 1 2 3 4

进程的服务时间:6 2 5 9 8

时间片q的大小:2

171d781da4a04974b4f6fa27cd9b141b.png

3e6b09df8e4f4274b13a18461fa1b954.png

5个进程

进程名字:A B C D E

进程的到达时间:0 1 2 3 4

进程的服务时间:6 2 5 9 8

时间片q的大小:4

db4d5eca5eea4ccbaf5a7760e523086b.png

3ccb69b3c76c4348b24c56613b252168.png

 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Issme

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值