当前位置:文档之家› 有关高优先权优先的实验

有关高优先权优先的实验

高优先权优先调度算法
一、实验目的
进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。

本实验要求学生独立的用高级语言编写和调试一个简单的进程调度程序。

算法要求使用高优先权优先调度算法。

通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法
二、实验内容与要求
(1)设计一个有n 个进程(可假定系统有2个进程)并发执行的进程调度程序。

每一个进程用一个进程控制块PCB 来代表。

PCB中应包含下列信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间及进程的状态等,且可按调度算法的不同而增减。

各进程的优先数或轮转时间片数,以及进程运行需要地时间片数,均由伪随机数发生器产生。

(2)每个进程处于运行R、就绪W和完成F 三种状态之一,假定初始状态都为就绪状态W。

(3)系统能显示或打印各进程状态和参数的变化情况。

三、实验步骤
1、打开计算机,打开应用软件VC。

2、进行编程。

3、测试程序。

4、记录结果。

四、运行结果
1、就绪队列
2、运行过程
3、最终结果
五、实验总结
通过本次实验,我充分了解了进程调度算法中高优先权优先算法的实现过程,进一步加深我对该知识点的认知,让过在实践中亲身接触到了该算法的实现,同时也让我认识到了实践对知识认知的重要性,任何东西只有经得起实践的检验才能得到认可,我们才能真正理解其内涵。

在此,也要感谢老师给予我这次试验的机会。

六、源代码
#include "stdio.h"
#include "stdlib.h"
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
struct pcb { /* 定义进程控制块PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb* next;
}*ready=NULL,*p;
typedef struct pcb PCB;
void sort(PCB *a) /* 建立对进程进行优先级排列函数*/
{
PCB *first, *second;
int insert=0;
if((ready==NULL)||((a->super)>(ready->super))) /*优先级最大者,插入队首*/
{
a->next=ready;
ready=a;
}
else /* 进程比较优先级,插入适当的位置中*/
{
first=ready;
second=first->next;
while(second!=NULL)
{
if((a->super)>(second->super))
{ /*若插入进程比当前进程优先数大,插入到当前进程前面*/
a->next=second;
first->next=a;
second=NULL;
insert=1;
}
else /* 插入进程优先数最低,则插入到队尾*/
{
first=first->next;
second=second->next;
}
}
if(insert==0) first->next=a;
}
}
void createpcb() /* 建立进程控制块函数*/
{
int i,num;
printf("*----------------------------------------------------------*\n");
printf("|*****************最高优先权优先调度算法模拟***************|\n");
printf("*----------------------------------------------------------*\n");
printf("\n 请输入进程数目:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
p=getpch(PCB);
printf("\n 输入第%d个进程的名字、优先数及该进程要求服务的时间:",i);
scanf("%s%d%d",p->name,&p->super,&p->ntime);
p->rtime=0; p->state='w';
p->next=NULL;
sort(p);
}
}
void display1() /*建立进程显示函数,用于显示当前进程*/
{
printf("\n进程名状态优先数要求服务的时间已运行时间
\n");
}
void display2(PCB * pr)
{
printf("%3.5s %7c %6d %12d %10d",pr->name,pr->state,pr->sup er,pr->ntime,pr->rtime);
printf("\n");
}
void check() /* 建立进程查看函数 */
{
PCB *pr;
printf("\n------------------------------------------------------");
printf("\n **** 当前正在运行的进程是%s,它的状态如下:",p->name); /*显示当前运行进程*/
display1();
display2(p);
pr=ready;
printf("\n ****当前就绪队列中进程的状态如下:\n"); /*显示就绪队列状态*/
if(pr==NULL) printf(" ****就绪队列为空!");
else
{
display1();
while(pr!=NULL)
{
display2(pr);
pr=pr->next;
}
}
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ {
printf("\n 进程 [%s] 已完成.\n",p->name);
free(p);
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)++;
if(p->rtime==p->ntime) destroy(); /* 调用destroy函数*/ else
{
(p->super)--;
p->state='w';
sort(p); /*调用sort函数*/
}
}
void main()
{
char ch;
createpcb();
printf("\n 初始时就绪队列的状态如下:");
display1();
p=ready;
while(p!=NULL)
{
display2(p);
p=p->next;
}
printf("\n 开始运行:..............");
while(ready!=NULL)
{
ch=getchar();
p=ready;
ready=p->next;
p->next=NULL;
p->state='R';
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n 进程已经完成.\n");
}。

相关主题