操作系统进程调度的代码实现

本文详细介绍了一种使用C语言实现的进程调度算法,包括先来先服务、短作业优先、高响应比和时间片轮转等算法。通过具体代码展示了如何在不同调度策略下进行进程管理,适用于学习和理解操作系统中进程调度的基本原理。

进程调度实验代码——C语言实现
本人理解较为浅显可能有些地方走了弯路
简单实现了几个调度算法
不多说代码如下

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct {
	char name;
	int beginTime;
	int finshTime;
	int arriveTime;
	int serveTime;
	int rountime;
	double priority;
	double value;
	int start_flag=0;
	int run_flag=0;
	bool inMemory=false;//是否写入内存 
	bool Isfinish=false;//是否完成 
}PCBfc;
typedef struct queue{
	int data[5];
	int front;
	int rear;
}queue;
queue* create(){
	queue *q;
	q=(queue *)malloc(sizeof(queue));	
	q->front=0;
	q->rear=0;
	return q;
} 
void enter(queue *q,int x){
	q->data[q->rear]=x;
	q->rear=(q->rear+1)%5;
}
int out(queue *q){
	int x=q->data[q->front];
	q->front=(q->front+1)%5;
	return x;
}
int get(queue *q){
	int x=q->data[q->front];
}
void firstComefirstServe(PCBfc *temp,int number); 
void shortComefirstServe(PCBfc *temp,int number);
void highRespfirstServe(PCBfc *temp,int number); 
void timeRountServe(PCBfc *temp,int number);
void printSc(PCBfc *temp,int number);
//int charge(PCBfc *temp,int number);
int main()
{
	PCBfc pcb[200];
	int choice;
	char dopoint;
	while(1)
	{
	cout<<"\t如果要开始演示程序请输入'y'否则输入'n'"<<endl;
	cin>>dopoint;
	if(dopoint=='n')
	break; 
	cout<<"\t输入进程数据"<<endl; 
	for(int i=0;i<5;i++)
	{
		cin>>pcb[i].name;
		cin>>pcb[i].arriveTime;
		cin>>pcb[i].serveTime;
	}
	cout<<"\t1.初始化"<<endl;
	cout<<"\t2.先来先服务算法"<<endl;
	cout<<"\t3.短作业优先算法"<<endl;
	cout<<"\t4.高响应比算法"<<endl;
	cout<<"\t5.时间片轮转算法"<<endl; 
	cout<<"\t请输入算法号"<<endl;
	cin>>choice;
	switch (choice)
	{
		case 2: firstComefirstServe(pcb,5);
				printSc(pcb,5);
				break;
		case 3: shortComefirstServe(pcb,5);
		        printSc(pcb,5);break;
		case 4: highRespfirstServe(pcb,5);
				printSc(pcb,5);break;
		case 5: timeRountServe(pcb,5);
				printSc(pcb,5);break;
		default:break;
	 }

	}
}
void firstComefirstServe(PCBfc *temp,int number)
{	
	double vt=0.0;//带权周转 
	double rt=0.0;//周转时间 
	temp[0].finshTime=temp[0].arriveTime+temp[0].serveTime; //初始化第一个进程 
	temp[0].rountime=temp[0].finshTime-temp[0].arriveTime;
	temp[0].value=temp[0].rountime/temp[0].serveTime;
	rt+=temp[0].rountime;
	vt+=temp[0].value;
	for(int i=1;i<number;i++)
	{
		if(temp[i].arriveTime<temp[i-1].finshTime) //比较到达时间和上一个进程完成的时间 
		temp[i].finshTime=temp[i-1].finshTime+temp[i].serveTime;
		else
		temp[i].finshTime=temp[i].arriveTime+temp[i].serveTime;
			
		temp[i].rountime=temp[i].finshTime-temp[i].arriveTime;
		temp[i].value=1.0*temp[i].rountime/temp[i].serveTime;
		rt+=temp[i].rountime;
		vt+=temp[i].value;
	}
	int begin=0;
	int last=0;
	while(begin<=temp[number-1].finshTime)
	{
		for(int i=0;i<number;i++)
		{
			if(begin==temp[i].arriveTime)
				printf("%2d      进程%c到达内存\n\n",begin,temp[i].name);
			if(last>=temp[i].arriveTime&&begin==temp[i-1].finshTime)
			{
				printf("%2d      进程%c开始执行\n\n",last,temp[i].name);	
				last=temp[i].finshTime;
			}
			if(begin==temp[i].finshTime)
				printf("%2d      进程%c结束!\n\n",begin,temp[i].name);
		}	
		begin++;
	}
	printf("\t平均周转时间: %.2lf\t平均带权周转时间:%.2lf\n",rt/number,vt/number); 
}
void shortComefirstServe(PCBfc *temp,int number)
{
	double rt=0.0;
	double vt=0.0;
	int time=0;//接受上一个进程完成时间 
	int count=0;
	int time1=0;//接受最后一个进程完成的时间 
	int sortSc[number]={0};//存入进程运行的顺序 
	int sc=1;//从第二个开始  

	temp[0].finshTime=temp[0].arriveTime+temp[0].serveTime; 
	temp[0].rountime=temp[0].finshTime-temp[0].arriveTime;
	temp[0].value=temp[0].rountime/temp[0].serveTime;
	time=temp[0].finshTime;
	rt+=temp[0].rountime;
	vt+=temp[0].value;
	for(int i=1;i<number;i++)
	{	//将此时进入内存的标志为true 
		for(int j=i;j<number;j++)
		{
			if(temp[j].arriveTime<=time&&temp[j].inMemory==false)
			{
				temp[j].inMemory=true;
			}
		}
				int Pass;//临时变量 
				int min=99;
				for(int k=1;k<number;k++)
				{
				//在没写入内存并且服务时间最小且没有完成的进程里面比较出最小的服务时间进程 
					if(temp[k].inMemory==true&&temp[k].serveTime<min&&temp[k].Isfinish==false)
					{
						min=temp[k].serveTime;	
						Pass=k;
					}
				}
				temp[Pass].finshTime=time+temp[Pass].serveTime;
				time=temp[Pass].finshTime;
				temp[Pass].Isfinish=true;
				temp[Pass].rountime=temp[Pass].finshTime-temp[Pass].arriveTime;
				temp[Pass].value=1.0*temp[Pass].rountime/temp[Pass].serveTime;
				sortSc[sc++]=Pass;
				rt+=temp[Pass].rountime;
				vt+=temp[Pass].value;
				time1=time;
	}	
	int begin=0;//当前时间 
	int last=0;//上一个完成的时间 
	while(begin<=time1)
	{
		for(int i=0;i<sc;i++)
		{
			if(begin==temp[sortSc[i]].arriveTime)
				printf("%2d      进程%c到达内存\n\n",begin,temp[sortSc[i]].name);
			if(begin==temp[0].arriveTime&&i==0) //第一个进程 
			{
				printf("%2d      进程%c开始执行\n\n",begin,temp[0].name);
				last=temp[0].finshTime;
			}
			if(begin==last&&i!=0&&last>=temp[sortSc[i]].arriveTime&&begin==temp[sortSc[i-1]].finshTime)
	    	{
				printf("%2d      进程%c开始执行\n\n",last,temp[sortSc[i]].name);	
		  		last=temp[sortSc[i]].finshTime;
	    	}
			if(begin==temp[sortSc[i]].finshTime)
				printf("%2d      进程%c结束!\n\n",begin,temp[sortSc[i]].name);
		}	
		begin++;
	}
		printf("\t平均周转时间: %.2lf\t平均带权周转时间:%.2lf\n",rt/number,vt/number); 
}
void highRespfirstServe(PCBfc *temp,int number)
{
	int time=0;
	int time1=0;
	double rt=0;
	double vt=0.0;
	int sortSc[number]={0};
	int sc=1;
	temp[0].finshTime=temp[0].arriveTime+temp[0].serveTime; 
	temp[0].rountime=temp[0].finshTime-temp[0].arriveTime;
	temp[0].value=temp[0].rountime/temp[0].serveTime;
	time=temp[0].finshTime;
	rt+=temp[0].rountime;
	vt+=temp[0].value;
	for(int i=1;i<number;i++)
	{
		for(int j=i;j<number;j++)
		{
			if(temp[j].arriveTime<=time&&temp[j].inMemory==false)
			{
				temp[j].inMemory=true;
			}
		}
				int Pass;
				double pr=0.0;
				for(int k=1;k<number;k++)
				{
					temp[k].priority=1.0*(time-temp[k].arriveTime+temp[k].serveTime)/temp[k].serveTime; 
					if(temp[k].inMemory==true&&temp[k].priority>pr&&temp[k].Isfinish==false)
					{
						pr=temp[k].priority;	
						Pass=k;
					}
				}
				temp[Pass].finshTime=time+temp[Pass].serveTime;
				time=temp[Pass].finshTime;
				temp[Pass].Isfinish=true;
				temp[Pass].rountime=temp[Pass].finshTime-temp[Pass].arriveTime;
				temp[Pass].value=1.0*temp[Pass].rountime/temp[Pass].serveTime;
				sortSc[sc++]=Pass;
				rt+=temp[Pass].rountime;
				vt+=temp[Pass].value;
				time1=time;
	}	
	int begin=0;
	int last=0;
	while(begin<=time1)
	{
		for(int i=0;i<sc;i++)
		{
			if(begin==temp[sortSc[i]].arriveTime)
				printf("%2d      进程%c到达内存\n\n",begin,temp[sortSc[i]].name);
			if(begin==temp[0].arriveTime&&i==0)
			{
				printf("%2d      进程%c开始执行\n\n",begin,temp[0].name);
				last=temp[0].finshTime;
			}
			if(begin==last&&i!=0&&last>=temp[sortSc[i]].arriveTime&&begin==temp[sortSc[i-1]].finshTime)
	    	{
				printf("%2d      进程%c开始执行\n\n",last,temp[sortSc[i]].name);	
		  		last=temp[sortSc[i]].finshTime;
	    	}
			if(begin==temp[sortSc[i]].finshTime)
				printf("%2d      进程%c结束!\n\n",begin,temp[sortSc[i]].name);
		}	
		begin++;
	}
	printf("\t平均周转时间: %.2lf\t平均带权周转时间:%.2lf\n",rt/number,vt/number); 
}
void timeRountServe(PCBfc *temp,int number)
{
  	int t;
  	double vt=0.0;
  	double rt=0.0;
 	int finish[number],run[number];
 	int i=0,j=0,time=0,flag=0;
 	queue *que;
	que=create();
 	printf("请输入时间片长度: ");  
	scanf("%d",&t);
 	for(i=0;i<number;i++)
	{
		run[i]=0;
	}	
 	enter(que,0);//第一个进程进入就绪队列 
 	while(flag<number)//
 	{
 		if(que->front!=que->rear )
 		{
 		i=out(que);
		if(run[i]+t>=temp[i].serveTime)
		{ 
		  	time=time+(temp[i].serveTime-run[i]);
		  	finish[i]=time;
		  	flag++;
		}
	  	else
		{
		 	 run[i]=run[i]+t;//已经运行时间加上时间片长度 
		  	for(j=0;j<number;j++)
			if(temp[j].arriveTime>time&&t+time>=temp[j].arriveTime)//在temp[j]运行期间到达 
			{
			  enter(que,j);
			}
		  	time=time+t;
		  	enter(que,i);
		}
			printf("当前就绪队列为:");
			j=que->front;
		while(j!=que->rear)
		{
			printf("%c ",temp[que->data[j]].name);
			j=(j+1)%number; 
		}
		 printf("\n");
	 }
	else time=time+t;
 	}
	for(int i=0;i<number;i++)
	{
		temp[i].finshTime=finish[i];
		temp[i].rountime=temp[i].finshTime-temp[i].arriveTime;
		temp[i].value=1.0*temp[i].rountime/temp[i].serveTime;
		rt+=temp[i].rountime;
		vt+=temp[i].value;
	}
		printf("\t平均周转时间: %.2lf\t平均带权周转时间:%.2lf\n",rt/number,vt/number); 
}
void printSc(PCBfc *temp,int number)
{
	cout<<"\t进程名    到达时间    服务时间    完成时间    周转时间   带权周转"<<endl; 
	for(int i=0;i<number;i++)
	{
		printf("\t  %c\t  %d\t      %d\t          %d\t        %d\t  %.2lf\n",temp[i].name,temp[i].arriveTime,temp[i].serveTime,temp[i].finshTime,temp[i].rountime,temp[i].value);
	}
}
/*
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2
*/

这里简单的实现了先来先服务,短作业优先,高响应比,时间片轮转这
几个算法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值