(C语言实现)进程调度—时间片轮转调度算法

一、设计目的:    

   本设计模拟在单处理器情况下的时间片轮转进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。

二、设计内容

  设计程序模拟单处理机系统中时间片轮转进程调度算法,每个进程由一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、到达时间、需要运行时间、完成标志与否、进程状态、还需运行的时间等。

进程的需要运行时间和到达时间以及进程运行的时间片人为设定。

每个进程的状态可以是就绪W(Wait)、运行R(Run)或完成F(Finish)3种状态。

时间片轮转调度算法的思想:给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。

三、程序结构:

   首先,对所有的进程按到达时间升序排序,这个排序的稳定的,也就是说如果他们同时到达则先输入的排在前面;

接着,把当前时间time赋值为process[1].at;

后来,对就绪队列中的进程一一执行,直到所有进程运行完毕。

自己写的源程序:

#include<stdio.h>
#define N 50
struct PCB
{
	int pn;   //process name进程名字
	int at;   //arrival time到达时间
	int st;   //service time服务时间
	int ct;   //completion time完成时刻
	int sc;  //sign completion标志是否完成
	int st1;  //剩余服务时间  
}process[N];

int sjp(int n)
{
	int i,j,T;
	printf("\n请输入时间片:\n");
	scanf("%d",&T);
	for(i=1;i<=n;i++)      //收集进程信息 
	{
		process[i].sc=0;
		printf("\n%d:\n请依次输入进程的信息\n请输入pn:",i);
		scanf("%d",&process[i].pn);
		printf("请输入at:");
		scanf("%d",&process[i].at);
		printf("请输入st:");
		scanf("%d",&process[i].st);
		process[i].st1=process[i].st;
	}
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)   //按照各进程到达时间升序,对进程排序 注意:稳定的排序 
	{
		if(process[j].at<process[i].at)
		{
			process[0]=process[j];
			process[j]=process[i];
			process[i]=process[0];	
		}
	}
	//for(i=1;i<=n;i++)    //检查排序是否正确
	//printf("%d\t",process[i].pn);
	
	int time=process[1].at;      //当前时间的初值 
	int flag=1;
	int sum=0;					//记录完成的进程数 
	printf("\n第几次调度进程 运行的进程pn 开始运行时间 运行时间 剩余服务时间 结束时间\n");
	int z=1;   //记录第几次调度进程 
	
        while(sum<n)
        {
	flag=0;	     //标志就绪队列中是否还有进程 
	for(i=1;i<=n;i++)    //时间片轮转法执行各进程 
	{
		if(process[i].sc==1) continue;  //已完成的进程 
		else
		 {
		 	if(process[i].st1<=T&&time>=process[i].at)//未完成的进程但是还需服务的时间少于等于一个时间片 
		 	{
		 	flag=1;
		 	time=time+process[i].st1;
		 	process[i].sc=1;
		 	process[i].ct=time;
		 	printf("%8d%12d%15d%11d%11d%11d\n",z++,process[i].pn,time-process[i].st1,process[i].st1,0,time); 
		 	process[i].st1=0;
		 	}
		 	
		 	else if(process[i].st1>T&&time>=process[i].at)//未完成的进程但其还需服务时间至少大于一个时间片 
		 	{
		 		flag=1;
		 		time=time+T;
				process[i].st1-=T;
				printf("%8d%12d%15d%11d%11d%11d\n",z++,process[i].pn,time-T,T,process[i].st1,time);
			} 
			if(process[i].sc==1) sum++;     //一个进程执行完就+1 
		}
	}
	
	if(flag==0&&sum<n)   // 还有没执行的进程,且没进入就就绪队列 
	{
	for(i=1;i<=n;i++)
	if(process[i].sc==0) {time=process[i].at;break;}
	}
    }
}

int main()
{
	int n;
	printf("\t\t时间片轮转调度算法\n");
	printf("请输入总进程数:\n");
	scanf("%d",&n);
	sjp(n);
	return 0;
}

  • 35
    点赞
  • 280
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值