1209实验3报告

实验三 进程调度模拟程序

 

 实验三 进程调度模拟程序

                               13物联网   201306104116  谢敏

1. 目的和要求

实验目的

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

实验要求

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

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

2.内容

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

 

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

2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。

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

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

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

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

3.代码

#pragma comment(linker, "/subsystem:console")
 #include<stdio.h>
 #include<stdlib.h>
 #include<conio.h>
 #include<dos.h>
 #define getpch(type) (type*)malloc(sizeof(type))
 #define NULL 0
 struct pcb
{ /* 定义进程控制块PCB */
 char name[10];
 char state;
 int super;
 int ntime;
 int rtime;
 struct pcb* link;
 }
 *ready=NULL,*p;
 typedef struct pcb PCB;
 sort() /* 建立对进程进行优先级排列函数*/
 {
PCB *first, *second;
 int insert=0;
 if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/
 {
p->link=ready;
 ready=p;
 }
 else /* 进程比较优先级,插入适当的位置中*/
 {
first=ready;
 second=first->link;
 while(second!=NULL)
 {
 if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/
 { /*插入到当前进程前面*/
p->link=second;
 first->link=p;
 second=NULL;
 insert=1;
 }
 else /* 插入进程优先数最低,则插入到队尾*/
 {
first=first->link;
 second=second->link;
 }
 }
 if(insert==0) first->link=p;
 }
 
 }
 input() /* 建立进程控制块函数*/
 {
int i,num;
 
 printf("
 请输入进程号:");
scanf("%d",&num);
    num=num++;
 for(i=1;i<num;i++)
 {
 printf("
 进程号No.%d:
",i);
 p=getpch(PCB);
 printf("
 输入进程名:");
scanf("%s",p->name);
 printf("
 输入进程优先数:");
scanf("%d",&p->super);
 printf("
 输入进程运行时间:");
scanf("%d",&p->ntime);
 printf("
");
 p->rtime=0;p->state='w';
 p->link=NULL;
 sort(); /* 调用sort函数*/
 }
 }
int space()
 {
 int l=0; PCB* pr=ready;
 while(pr!=NULL)
 {
 l++;
 pr=pr->link;
 }
 return(l);
 }
 disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
 {
printf("
 qname 	 state 	 super 	 ndtime 	 runtime 
");
 printf("|%s	",pr->name);
 printf("|%c	",pr->state);
 printf("|%d	",pr->super);
 printf("|%d	",pr->ntime);
 printf("|%d	",pr->rtime);
 printf("
");
 }
 check() /* 建立进程查看函数 */
 {
PCB* pr;
 printf("
 **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
disp(p);
 pr=ready;
 printf("
 ****当前就绪队列状态为:
"); /*显示就绪队列状态*/
while(pr!=NULL)
 {
 disp(pr);
 pr=pr->link;
 }
 }
 destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
 {
printf("
 进程 [%s] 已完成.
",p->name);
 free(p);
 }
 running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
 {
 (p->rtime)++;
 if(p->rtime==p->ntime)
 destroy(); /* 调用destroy函数*/
else
 {
 (p->super)--;
p->state='w';
 sort(); /*调用sort函数*/
 }
 }
main() /*主函数*/
 {
int len,h=0;
 char ch;
 input();
 len=space();
 while((len!=0)&&(ready!=NULL))
 {
 ch=getchar();
 h++;
 printf("
 The execute number:%d 
",h);
 p=ready;
 ready=p->link;
 p->link=NULL;
 p->state='R';
 check();
 running();
 printf("
 按任一键继续......");
ch=getchar();
 }
 printf("

 进程已经完成.
");
 ch=getchar();
 }

 4.总结

     这是参考别人的程序做出来的,我自己并没有什么想法.

原文地址:https://www.cnblogs.com/aa88/p/5032844.html