C语言模拟进程管理.docx

上传人:b****4 文档编号:24296925 上传时间:2023-05-26 格式:DOCX 页数:23 大小:92.30KB
下载 相关 举报
C语言模拟进程管理.docx_第1页
第1页 / 共23页
C语言模拟进程管理.docx_第2页
第2页 / 共23页
C语言模拟进程管理.docx_第3页
第3页 / 共23页
C语言模拟进程管理.docx_第4页
第4页 / 共23页
C语言模拟进程管理.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

C语言模拟进程管理.docx

《C语言模拟进程管理.docx》由会员分享,可在线阅读,更多相关《C语言模拟进程管理.docx(23页珍藏版)》请在冰豆网上搜索。

C语言模拟进程管理.docx

C语言模拟进程管理

操作系统课程设计报告

 

一需求分析

在多道处理程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。

这就要求系统能按照某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由金城调度程序完成的。

一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按照其状态,将其组成不同的进程队列。

于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。

进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。

进程调度的算法有多种,常用的有优先级调度算法、先来先服务算法、时间片轮转算法。

二概要设计

<一>最高优先级优先调度算法

动态优先数是指在进程创建时先确定一个初始优先数,以后在进程运行中随着进程特性的改变不断修改优先数,这样,由于开始优先数很低而得不到CPU的进程,就能因为等待时间的增长而优先数变为最高而得到CPU运行。

例如:

在进程获得一次CPU后就将其优先数减少3。

或者,进程等待的时间超过某一时限时增加其优先数的值,等等。

<二>简单轮转法调度算法

所有就绪进程按FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。

即将CPU的处理时间划分成一个个相同的时间片,就绪队列的诸进程轮流运行一个时间片。

当一个时间片结束时,如果运行进程用完它的时间片后还未完成,就强迫运行机制进程让出CPU,就把它送回到就绪队列的末尾,等待下一次调度。

同时,进程调度又去选择就绪队列中的队首进程,分配给它一时间片,以投入运行。

直至所有的进程运行完毕。

<三>短作业优先调度算法

所有就绪进程按所需时间由少到多排成一个队列,依次运行队列中的进程,并列表显示出来,每个进程的开始运行时间减去进入内存时间就是该进程的等待时间,每个进程的结束运行时间减去进入内存时间就是该进程的周转时间,每个进程的周转时间除于服务时间就是带权周转时间。

三详细设计

一.优先权调度算法:

1、用户可以自行输入进程的数量,每一个进程由进程控制块(PCB)表示,各种队列均采用链表数据结构。

2、进程控制块包含如下信息:

进程号、cpu时间、所需要时间、优先数、状态等等。

3、在每次运行程序时都要输入“进程数量”、“进程名称及占用时间”。

4、按照优先数的高低进行排列

5、处理机调度队首元素运行。

采用动态优先数办法,进程每运行一次优先数减“3”,同时将已运行时间加“1”。

6、进程运行一次后,若要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“F”,且退出就绪队列。

7、“R”状态的进程队列不为空,则重复上面步骤,直到所有进程都成为“F”状态。

流程图:

图.最高优先级优先调度算法流程图

主要代码:

voidpriority(charalgo){

PCBq;

prt1(algo);

for(inti=0;i<=Num;i++)

{

q=pq.top();

pq.pop();

if(q.state!

=3)

q.state=1;

prt2(algo,q);

if(q.state!

=3)

q.state=2;

q.cputime++;

if(q.needtime>0)

q.needtime--;

if(q.needtime==0)

q.state=3;

if(q.state!

=3)

q.prio-=3;

pp.push(q);

while(!

pq.empty())

{

q=pq.top();

pq.pop();

if(q.needtime==0)

q.state=3;

prt2(algo,q);prt1(algo);

pp.push(q);

}

pq=pp;

pp=pqempty;

}

printf("**************************************************************************\n");

printf("输出结束\n");

getchar();

}

二.时间片轮转算法:

1、用户可以自行输入进程的数量,每一个进程由进程控制块(PCB)表示,各种队列均采用链表数据结构。

2、按照进程输入的先后顺序排成一个队列。

再设一个队首指针指向第一个到达进程的首址。

3、执行处理机调度时,开始选择队首的第一个进程运行。

另外,再设一个当前运行进程的指针,指向当前正在运行的进程。

4、考虑到代码的可重用性,轮转法调度程序和最高优先级优先调度是调用同一个模快进行输出

5、在规定的时间片内进程是根据先来先服务的方式配列的,每个进程只运行时间片大小的时间然后转到下一个进程运行。

直到所有进程运行完为止。

流程图

 

图.简单轮转法调度算法流程图

主要代码:

voidRoundrun(inttimeSlice){

while(run!

=NULL){

run->cputime=run->cputime+timeSlice;

run->needtime=run->needtime-timeSlice;

run->round+=timeSlice;

run->count++;

if(run->needtime<=0){

run->needtime=0;

run->next=finish;

finish=run;

if(run!

=tail){

tail->next=ready;

}

else{

ready=NULL;

}

run->state='F';

run=NULL;

if(ready!

=NULL){

firstin();

}

}

else{

if(ready!

=NULL){

run->state='W';

tail=run;

run=ready;//就绪队列的头指针赋值给运行

run->state='R';//进程状态变为等待状态

ready=ready->next;//就绪队列头指针移到下一个进程

}}

prt('r');}}

三.短作业优先调度算法

1,用户可以自行输入进程的数量,每一个进程由进程控制块(PCB)表示,各种队列均采用链表数据结构。

2,按照进程服务时间由少到多顺序排成一个队列。

再按顺序依次执行。

主要代码:

voidshort_timefirst(charalgo){

PCq;intt;prt3();

for(intj=0;j

p[j].state='R';

for(inti=0;i

{

if(p1[i].state=='W')p1[i].waittime=Tim;

if(strcmp(p[j].name,p1[i].name)==0){

p1[i].state='R';

prit(i);

p1[i].state='F';

p1[i].cputime=p1[i].needtime;

p1[i].needtime=0;

}

else{prit(i);}

}

p[j].state='F';

p[j].cputime=p[j].needtime;

p[j].needtime=0;

p[j].waittime=Tim;

Tim+=p[j].cputime;

printf("**************************************************************************\n");

}

for(inti=0;i

printf("**************************************************************************\n");

printf("输出结束\n");

getchar();

}

四调试分析、测试结果

一.进入系统显示欢迎界面

 

二.如果选择P进行优先数算法则提示输入进程数:

 

三.输入进程号和运行时间:

 

四.输出优先数算法信息:

 

五.可以继续选择R进行时间片轮转算法,并输入时间片大小:

 

六.输出时间片轮转算法信息:

 

附录

#include

#include

#include

#include

usingnamespacestd;

typedefstructnode{

charname[10];

intprio;

intround;

intneedtime;

intcputime;

intcount;

intstate;

structnode*next;

booloperator<(constnode&o)const{

if(state==o.state)

returnprio

returnstate>o.state;

}

}PCB;

priority_queuepq,pqempty,pp,qq;

PCB*finish,*ready,*tail,*run;

intN,Num;

typedefstructnod{

charname[10];

intneedtime;

intcputime;

intwaittime;

intstate;

structnode*next;

}PC;

PCp[10];

PCp1[10];

intTim=0;

voidfirstin(){

run=ready;

run->state='R';

ready=ready->next;

}

voidprt1(chara){

if(a=='P')

printf("*进程号cpu时间所需要时间优先数状态*\n");

else

printf("*进程号cpu时间所需时间记数时间片状态*\n");

}

voidprt2(chara,PCBq){

if(a=='P')

printf("*%-10s%-10d%-10d%-10d%-10d*\n",q.name,q.cputime,q.needtime+Tim,q.prio,q.state);

else

printf("*%-10s%-10d%-10d%-10d%-10d%-10c*\n",q.name,q.cputime,q.needtime+Tim,q.count,q.round,q.state);

}

voidprt22(chara,PCB*q){

printf("*%-10s%-10d%-10d%-10d%-10d%-10c*\n",q->name,q->cputime,q->needtime,q->count,q->round,q->state);

}

voidprt(charalgo){

PCB*q;

prt1(algo);

if(run!

=NULL)

prt22(algo,run);

q=ready;

while(q!

=NULL&&q!

=run){

prt22(algo,q);

if(q->next==run)break;

elseq=q->next;}

q=finish;

while(q!

=NULL){

prt22(algo,q);

q=q->next;}

getchar();}

voidpriority(charalgo){

PCBq;

prt1(algo);

for(inti=0;i<=Num;i++){

q=pq.top();

pq.pop();

if(q.state!

=3)

q.state=1;

prt2(algo,q);

if(q.state!

=3)

q.state=2;

q.cputime++;

if(q.needtime>0)

q.needtime--;

if(q.needtime==0)

q.state=3;

if(q.state!

=3)

q.prio-=3;

pp.push(q);

while(!

pq.empty()){

q=pq.top();

pq.pop();

if(q.needtime==0)

q.state=3;

prt2(algo,q);prt1(algo);

pp.push(q);

}

pq=pp;

pp=pqempty;

}

printf("**************************************************************************\n");

printf("输出结束\n");

getchar();}

voidcreate1(charalgo){

PCBp;

inti,time;

charna[10];

ready=NULL;

finish=NULL;

run=NULL;

printf("输入进程号和运行时间:

\n");

printf("");

for(i=1;i<=N;i++){

scanf("%s",na);

printf("\n");

scanf("%d",&time);

if(i!

=N)printf("");

Num+=time;

strcpy(p.name,na);

p.cputime=0;

p.needtime=time;

p.state=2;

p.prio=50-time;

pq.push(p);

}

printf("优先数算法输出信息:

\n");

printf("**************************************************************************\n");

}

voidinsert2(PCB*q){

tail->next=q;

tail=tail->next;

}

voidcreate2(charalgo){

PCB*p;

inti,time;

charna[10];

ready=NULL;

finish=NULL;

run=NULL;

printf("输入进程号和运行时间:

\n\n");

printf("");

for(i=1;i<=N;i++)

{

p=(PCB*)malloc(sizeof(PCB));

scanf("%s",na);

scanf("%d",&time);

printf("");

strcpy(p->name,na);

p->cputime=0;

p->needtime=time;

p->state='W';

p->round=0;

p->count=0;

if(ready!

=NULL)

insert2(p);

else{

p->next=ready;

ready=p;

tail=ready;

}

}

printf("时间片轮转法输出信息:

\n");

printf("********************************************************************\n");

run=ready;

ready=ready->next;

tail->next=run;

run->state='R';

prt(algo);

}

voidRoundrun(inttimeSlice){

while(run!

=NULL){

run->cputime=run->cputime+timeSlice;

run->needtime=run->needtime-timeSlice;

run->round+=timeSlice;

run->count++;

if(run->needtime<=0){

run->needtime=0;

run->next=finish;

finish=run;

if(run!

=tail){

tail->next=ready;

}

else{

ready=NULL;

}

run->state='F';

run=NULL;

if(ready!

=NULL){

firstin();

}

}

else{

if(ready!

=NULL){

run->state='W';

tail=run;

run=ready;

run->state='R';

ready=ready->next;

}

}

prt('r');

}

printf("输出结束\n");

printf("********************************************************************\n");

}

intcmp(constvoid*a,constvoid*b){

return((structnod*)a)->needtime-((structnod*)b)->needtime;

}

voidcreate3(charalgo){

inti,time;

charna[10];

printf("输入进程号和运行时间:

\n");

printf("");

for(i=0;i

scanf("%s",na);

scanf("%d",&time);

if(i!

=N)printf("");

strcpy(p[i].name,na);

p[i].cputime=0;

p[i].needtime=time;

p[i].waittime=0;

p[i].state='W';

p1[i]=p[i];

}

qsort(p,N,sizeof(p[0]),cmp);

printf("短作业优先算法输出信息:

\n");

printf("**************************************************************************\n");

}

voidprt3(){

printf("*进程号cpu时间所需要时间已等待时间状态*\n");

}

voidprit(inti){

PCq=p1[i];

printf("*%-10s%-10d%-10d%-10d%-10c*\n",q.name,q.cputime,q.needtime,q.waittime,q.state);}

voidshort_timefirst(charalgo){

PCq;intt;prt3();

for(intj=0;j

p[j].state='R';

for(inti=0;i

{

if(p1[i].state=='W')p1[i].waittime=Tim;

if(strcmp(p[j].name,p1[i].name)==0){

p1[i].state='R';

prit(i);

p1[i].state='F';

p1[i].cputime=p1[i].needtime;

p1[i].needtime=0;

}

else{prit(i);}

}

p[j].state='F';

p[j].cputime=p[j].needtime;

p[j].needtime=0;

p[j].waittime=Tim;

Tim+=p[j].cputime;

printf("**************************************************************************\n");

}

for(inti=0;i

printf("**************************************************************************\n");

printf("输出结束\n");

getchar();

}

intmain(){

inttimeSlice;

charalgo;

while

(1){

Num=0;

printf("\t选择算法:

P优先数算法\n");

printf("\t\tD短作业优先算法\n");

printf("\t\tR时间片轮转算法\n");

printf("");

scanf("%c",&algo);

if(algo!

='R'&&algo!

='P'&&algo!

='D'){

printf("输入错误!

\n");

exit(0);

}

printf("输入进程数:

");

printf("");

scanf("%d",&N);

if(algo=='P'){

create1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 纺织轻工业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1