(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
    评论
实现了如下四种调度算的模拟: (1)时间片轮转调度 (2)优先数调度 (3)最短进程优先 (4)最短剩余时间优先 模拟过程使用了JProgressBar作为进程状态条,更为直观地观察到每个进程的执行状态。 程序用户说明: 1、在上图标号1处输入要创建随机进程的个数,仅可输入正数,非正数会有相关提示。然后点击标号2处的“创建进程”按钮,随进创建的进程显示在程序界面的央窗口,如标号3所示。 2、创建好随机进程后,在标号4的选框选择将要模拟执行的调度算,然后点击标号5处的“开始模拟”,程序开始执行。标号3的列表会显示相应的调度变化。 3、模拟过程,可以继续添加新的进程,操作同上。 4、 一个算模拟执行完毕之后,可以点击标号6的“复位”按钮,可以重置列表的内容为程序模拟运行前的内容。复位成功后,可以继续选择其他调度算进行模拟。 5、标号7显示为程序模拟过程的时间,从1秒开始累计。 6、点击标号8的“清空”按钮,可以清空类别的进程,以便程序的下次执行。 题目要求: 题目四 处理器系统进程调度 一 、 课 程 设 计 目 的 1. 加深对进程概念的理解, 明确进程和程序的区别。 2. 深入了解系统如何组织进程、 创建进程。 3. 进一步 认识如何实现处理器调度。 二 、 课 程 设 计 内 容 编写程序完成处理器系统进程调度要求实现时间片轮转、 优先数、 最短进程优 先和最短剩余时间优先四种调度算。 实验具体包括: 首先确定进程控制块的内容, 进程控 制块的组成方式; 然后完成进程创建原语和进程调度原语; 最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“ 虚拟 PCB” 进行相应的调度模拟操作, 即每发生“ 调度” 时, 显示出当前运行进程的“ 进程标识符”、“ 优先数”、“ 剩余运行时间” 等, 而不需要对系 统真正的 PCB 等数据进行修改。
实验内容: 编写一个处理机下的进程调度程序,模拟操作系统对进程的调度。 要求: 能够创建指定数量的进程,每个进程由一个进程控制块表示。 实现先来先服务调度算:进程到达时间可由进程创建时间表示。 实现短作业优先调度算:可指定进程要求的运行时间。(说明:对不可剥夺的短作业优先算,当作业运行时间相等时,优先调度进程号小的进程执行;对可剥夺式的短作业优先算,即选最短剩余时间的进程进行运行,在剩余时间相同的情况下,选择到达时间早的进程进行运行) 实现时间片轮转调度算法:可指定生成时间片大小。(说明:新进程到来时插入到就绪队列的队尾,当进程P运行完一个时间片时,若同时有进程Q到达,则先在就绪队列队尾插入新到达的进程Q,之后再插入进程P) 实现动态优先级调度算:可指定进程的初始优先级(优先级与优先数成反比,优先级最高为0),优先级改变遵循下列原则:进程在就绪队列每停留一个时间片,优先级加1,进程每运行一个时间片,优先级减3。(说明:本算在优先级相同的情况下,选择到达时间早的进程进行运行) 测试用例格式如下: 输入:调度算    进程号/到达时间/运行时间/优先级/时间片 输出:调度顺序/进程号/开始运行时间/结束运行时间/优先级 其调度算选项为:1----先来先服务,2----短作业优先,3----最短剩余时间优先,4----时间片轮转,5----动态优先级
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值