实验三 进程调度模拟程序

                                 实验三 进程调度模拟程序

                               13物联网   201306104148   李小娜

1. 目的和要求

实验目的

用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

实验要求

设计一个有 NN不小于5)个进程并发执行的进程调度模拟程序。

进程调度算法:时间片轮转法调度算法对N个进程进行调度。 

 

2. 实验内容

完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。

 

1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 

2) 每个进程的状态可以是就绪 rready)、运行RRunning)、或完成FFinished)三种状态之一。

3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。

5) 每进行一次调度,程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。   

6) 重复以上过程,直到所要进程都完成为止。

 

3.实验结果

4.源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100


typedef struct 
{
char  name[4];//进程名
int    priority;//优先级
int   starttime;//到达系统时间
int   needtime;//运行时间
int    cputime;//已用CPU时间
char   state;//进程状态
}pr;
 
pr a[MAX];
int n;//进程数
int t;//时间片大小
void input()
{
	int i;
	printf("请输入进程的名字,优先级,到达系统时间,运行时间:\n");
	for(i=0;i<n;i++)
	{
	scanf("%s",&a[i].name);
	scanf("%d",&a[i].priority);
	scanf("%d",&a[i].starttime);
	scanf("%d",&a[i].needtime);
	a[i].cputime=0;
	a[i].state='W';
	}
}


void Sort()
{
   int i,j; 
    pr temp;    
	 for(i=0;i<n-1;i++) //先按到达系统时间排序
	 {   
		 for(j=0;j<n-1-i;j++)
			 if(a[j].starttime>a[j+1].starttime)
			 {

				 temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;		
			 }
	 }
   
	 for(i=0;i<n-1;i++) //再按优先级排序,数字高则优先级高
	 {   
		 for(j=0;j<n-1-i;j++)
			 if(a[j].priority<a[j+1].priority)
			 {
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			 }
	 }
	 if (a[0].state!='F') 
	 {    
		 a[0].state='R';    
		 //将优先级最高的状态置为运行 
	 } 
}

void output()
{	
   int i;  
   Sort();//先排好序再打印输出
   printf("\t进程名  优先级   到达时间  运行时间  已用时间  进程状态  \n");
	for(i=0;i<n;i++)
	{
	printf("%8s%10d%10d%10d%10d%10c\n",a[i].name,a[i].priority,a[i].starttime,a[i].needtime,a[i].cputime,a[i].state);
	} 
	printf("\n\n");
}

void RR()
{
   //每次运行进程只针对排好序后的第一个进程即第0号元素
   //当第一个进程运行完一个时间片优先级减一后再对进程进行按到达系统时间
   //和优先级排序,所以实现了根据优先级的时间片轮转执行进程
	 do{
		if((a[0].needtime-a[0].cputime)>t)//若剩余时间大于时间片
		{
				a[0].cputime+=t;
		    	a[0].priority--;//优先级减一
		       a[0].state='W';//执行完一个时间片后变为等待状态}//已用时间加上时间片
		}
		else
		{
		a[0].cputime=a[0].needtime;//已用时间等于运行时间
		a[0].priority=-10000;//优先级为-10000,表示完成进程
		a[0].state='F';
		}
		output();//打印结果,函数内部含有排序算法
	} while(a[0].state!='F');
}


int main()
{
    printf("请输入进程数n:");
    scanf("%d",&n);
	printf("\n");
	printf("请输入时间片大小t:");
    scanf("%d",&t);
	printf("\n");
    input();
    output();//输入进程按排序后显示,函数内部含有排序算法
	RR();
}

 

 

5.总结

   实现功能中,先对输入的进程按到达系统时间和优先级排序,排好序后对第一个进程的状态设置为R表示运行。实质上,任意时刻都是只能运行排好序后的第一个进程。每次运行进程只针对排好序后的第一个进程即第0号元素,当第一个进程运行完一个时间片,优先级减一后再对进程进行按到达系统时间和优先级排序,所以执行完的进程的优先级置为-10000后自动排到了后面,因此也就实现了根据优先级的时间片轮转执行进程。

 

 

 

转载于:https://www.cnblogs.com/dmbs/p/5014639.html

[提示] (1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名 指针 要求运行时间 已运行时间 状态 其中,进程名----作为进程的标识,假设五个进程进程名分别是Q1,Q2,Q3,Q4,Q5。 指针----进程按顺序排成循环队列,用指针指出下一个进程进程控制块首地址,最后一个进程中的指针指出第一个进程进程控制块首地址。 要求运行时间----假设进程需要运行的单位时间数。 已运行时间----假设进程已经运行的单位时间数,初始值为“0”。 状态----有两种状态,“就绪”状态和“结束”状态,初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。 (2)每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。 (3)处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际启动运行,而是执行: 已运行时间-1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这里省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。 (4)进程运行一次后,应把该进程进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程进程控制块中的指针值送到前面一个进程的指针位置。 (5)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (6)在所设计的称序中应有显示或打印语句,能显示或打印每次被选中进程进程名以及运行一次后进称对列的变化。 (7)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程进程名以及进程控制块的动态变化过程。
1、设计一个程序实现基于优先数的时间片轮转调度算法调度处理器。 2、假定系统有5个进程,每个进程用一个进程控制块PCB开代表,进程控制块的结构 /*例如一组进程如下表: 进程名 A B C D E F G H J K L M 到达时间 0 1 2 3 6 8 12 12 12 18 25 25 服务时间 6 4 10 5 1 2 5 10 4 3 15 8 */ PCB:进程名 指针 到达时间 要求运行时间 已运行时间 优先数 进程状态 其中: 进程名:作为进程的标识。 指针:进程按顺序排成循环链表,用指针指出下一个进程进程控制块首地址,最后一个进程中的指针指出第一个进程进程控制块首地址。 要求运行时间:假设进程需要运行的单位时间数。 已运行时间:假设进程已经运行的单位时间数,初值为0。 状态:可假设有两种状态,就绪状态和结束状态。进程的初始状态都为就绪状态。 3、每次运行所设计的处理器调度程序调度进程之前,为每个进程任意确定它的要求运行时间。 4、此程序是模拟处理器调度,因此,被选中的进程并不实际启动运行,而是执行 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位时间。 .5、在所设计的程序中应有显示或打印语句,能显示或打印每次被选中的进程名以及运行一次后进程队列的变化。 6、为进程任意确定要求运行时间,运行所设计的处理器调度程序,显示或打印逐次被选中进程进程名以及进程控制块的动态变化过程。 7、设有一个就绪队列,就绪进程按优先数(优先数范围0-100)由小到大排列(优先数越小,级别越高)。当某一进程运行完一个时间片后,其优先级应下调(如优先数加2或3)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值