早教吧 育儿知识 作业答案 考试题库 百科 知识分享

进程调度模拟算法,发到邮箱tangyanbfsu@163.com实验一:进程调度模拟算法题目名称进程调度模拟算法实验目的1.掌握进程的描述。2.熟悉进程调度的不同算法。

题目详情
进程调度模拟算法,发到邮箱tangyan_bfsu@163.com
实验一:进程调度模拟算法
【题目名称】
进程调度模拟算法
【实验目的】
1.掌握进程的描述。
2.熟悉进程调度的不同算法。
3.比较各种算法的优劣。
【内容与要求】
1.设计一个有n个进程共行的进程调度程序,每个进程由一个PCB表示。PCB通常应包括下属信息:进程名,进程优先数,进程需运行的时间,占用CPU时间,进程的状态等,并可以按调度的算法删减。
2.调度程序应包含3~5种不同调度算法,运行时可以任选一种,进行比较分析。
3.系统能显示和打印各种进程状态和参数变化状况。
【设计的算法】
该程序设计的算法包括5种不同的调度算法,分别是:先来先服务,短进程优先,时间片轮转,非抢占优先权调度,抢占式优先权调度。
整体思路:将输入的PCB信息排列到等待队列,按照各种算法的要求使用不同的顺序来选择进程运行,打印运行前进程的状态信息,调用空循环来模拟进程运行(每调用一次,CPU-time加1),最后计算周转时间和带权周转时间,输出结果。
具体到不同算法,在等待队列中挑选出运行进程的算法不同,介绍如下:
1. 先来先服务:按照输入(到达时间)顺序执行,一个进程执行完再调出下一个。
2. 短进程优先:在某一时刻,从已到达的进程中选择需要服务时间最短的首先运行,运行结束后,再选择下一个符合条件的。
3. 时间片轮转:按顺序把每个等待队列中的进程执行规定的一个时间片(程序中定为4),时间片到或进程执行结束都将停止,把未执行完的进程排入等待队列,继续该过程至所有进程结束。
4. 非抢占优先权调度:算法同2,只是选择优先权最高的。进程结束时,把它的优先权记为0。
5. 抢占式优先权调度:在把CPU交给优先权最高的进程时,只允许它运行一个时间片。时间片到时,如果还未完成则把其优先权减3,重新选择优先权高的继续运行。
▼优质解答
答案和解析
#include "stdio.h"
#include
#include
#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;


void 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;
}
}
void input() /* 建立进程控制块函数*/
{
int i,num;
system("cls"); /*清屏*/
printf("\n 请输入进程个数:");
scanf("%d",&num);
for(i=1;i<=num;i++)
{
printf("\n 进程号No.%d:\n",i);
p=getpch(PCB);
printf("\n 输入进程名:");
scanf("%s",p->name);
printf("\n 输入进程优先数:");
scanf("%d",&p->super);
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
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);
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf(" \n qname\tstate\tsuper\tndtime\truntime\n");
printf(" %s\t",pr->name);
printf("%c\t",pr->state);
printf("%d\t",pr->super);
printf("%d\t",pr->ntime);
printf("%d\t",pr->rtime);
printf("\n");
}
void check() /* 建立进程查看函数 */
{
PCB* pr;
printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
disp(p);
pr=ready;
printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
}
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(); /*调用sort函数*/
}
}
void main() /*主函数*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
h++;
printf("\n The execute number:%d \n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n\n 进程已经完成.\n");
ch=getchar();
}