早教吧作业答案频道 -->其他-->
进程调度模拟算法,发到邮箱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,重新选择优先权高的继续运行。
实验一:进程调度模拟算法
【题目名称】
进程调度模拟算法
【实验目的】
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();
}
#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();
}
看了进程调度模拟算法,发到邮箱ta...的网友还看了以下:
请根据下图所示的实验过程和提供的数据(步骤②产生的气体全部逸出),计算:实验后所得CaCl2溶液的 2020-04-09 …
解下列方程并检验.70-x=31 5.6-x=0.8解下列方程并检验.70-x=31 5.6-x= 2020-05-16 …
笔算.(要求验算的要写出验算过程.)337+245=39÷7═912-378=验算500-236= 2020-06-14 …
笔算下面各题.(最后两题要求写出验算过程)273×28465÷31208×6587×29验算167 2020-07-19 …
用竖式计算.(①、②小题写出验算过程.)①535+286=(验算)②900-673=(验算)③80 2020-07-19 …
竖式计算,要求验算的请写出验算过程.(1)375+168=验算:(2)701-425=验算:(3) 2020-07-19 …
重铬酸钾容量法标定中Feso4的当量计算,急求计算过程称取K2Cr2O7(相对分子质量294.18 2020-07-19 …
小明同学在实验室称取了13g锌,放在盛有足量稀盐酸的烧杯中进行充分反应,试计算反应共生成氢气多少克 2020-07-25 …
小明同学在实验室称取了26g锌,放在盛有足量稀盐酸的烧杯中进行充分反应,试计算反应共生成氢气多少克 2020-07-25 …
我国最早广泛使用的计算工具叫算筹,其运算过程称为“筹算”。到宋、元时代,由于手工业、商业和对外贸易的 2020-12-18 …