进程管理.docx

上传人:b****2 文档编号:20349825 上传时间:2023-04-25 格式:DOCX 页数:12 大小:126.85KB
下载 相关 举报
进程管理.docx_第1页
第1页 / 共12页
进程管理.docx_第2页
第2页 / 共12页
进程管理.docx_第3页
第3页 / 共12页
进程管理.docx_第4页
第4页 / 共12页
进程管理.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

进程管理.docx

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

进程管理.docx

进程管理

昆明理工大学信息工程与自动化学院学生实验报告

(2011—2012学年第二学期)

课程名称:

操作系统开课实验室:

信自楼4442012年4月16日

年级、专业、班

计科101

学号

201010803116

姓名

李力

成绩

实验项目名称

进程管理

指导教师

杨云飞

 

 

 

教师签名:

年月日

一、实验目的

通过编写进程管理的算法,要求学生掌握整个进程管理的各个环节,进程的数据结构描述,进程的各种状态之间的转换,以及进程的调度算法。

以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。

二、实验原理及基本技术路线图(方框原理图)

三、所用仪器、材料(设备名称、型号、规格等)。

计算机一台

四、实验方法、步骤

#include

#include

#defineM3//队列总数

#defineN5//进程总数

typedefstructpcb{

intid;//进程号

intintime;//提交时间

intpriority;//优先级

intstarttime;//开始执行时间

intlength;//进程长度大小

intendtime;//结束时间

charstate;//状态

intptime;//时间片

structpcb*next;

}*PCB,pcb;//进程控制块

PCBCreatReady(PCBR,inti){

R=(PCB)malloc(sizeof(pcb));

R->id=i+1;

R->priority=5-i;

R->ptime=i+1;

R->state='R';

R->next=NULL;

printf("第%d级:

\t%d\t%d\n",R->id,R->priority,R->ptime);

returnR;

}

PCBCreatWait(PCBW)

{

inti;

pcb*p,*q;

q=W;

printf("给进程初始化如下(tab键隔开):

\n");

printf("进程\tin时间\t优先级\t长度\n");

for(i=0;i

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

p->next=NULL;

p->id=i+1;

printf("P%d\t",p->id);

scanf("%d\t%d\t%d",&p->intime,&p->priority,&p->length);

q->next=p;

q=p;

}

returnW;

}

voidInsert(PCBR,pcb*cp){

pcb*tail;

tail=R;

while(tail->next){

tail=tail->next;

}

tail->next=cp;

cp->next=NULL;

}

intFindQuery(PCBR[M]){

inti,j;

for(i=0;i

if(R[i]->next){

j=i;break;

}

else

printf("第%d级就绪队列为空\n",R[i]->id);

}

returnj;

}

intDispatch(PCBR,pcb*cp,PCBW,inttime,pcb*tp){

ints;

pcb*p,*phead;

phead=W;

p=W->next;

cp->starttime=time;

cp->length-=R->ptime;

cp->endtime=cp->starttime+R->ptime;

if(cp->length<=0){

s=1;//表示完成

cp->endtime+=cp->length;

}

else{

if(p){

while(p){

if((p->intimeendtime)&&(p->priority>cp->priority)){

tp->id=p->id;

tp->intime=p->intime;

tp->length=p->length;

tp->priority=p->priority;

tp->state=p->state;

//将抢占进程p备份到tp中

phead->next=p->next;//从后备队列中删除抢占的进程

cp->length+=cp->endtime-tp->intime;

cp->endtime-=cp->endtime-tp->intime;

s=-1;//表示被抢占

break;

}

else

if(p->intime>=cp->endtime){

s=0;//在后备队列中没有可以抢占的进程时

break;

}

p=p->next;phead=phead->next;

}//查找可以抢占cpu的优先级高的进程tp

}

elses=0;//在后备队列没有进程时

}

returns;

}

voidPrint(PCBF){

pcb*p;

p=F->next;

while(p){

printf("P%d\t结束时间:

%d\n",p->id,p->endtime);

p=p->next;

}

}

PCBMFQ(PCBW,PCBR[M],PCBF){

pcb*cp;//当前系统操作的进程

pcb*tp;//抢占cpu的进程

tp=(PCB)malloc(sizeof(pcb));

tp->priority=0;

tp->next=NULL;

inttime=0;//time表示系统当前时间

intFinish=0;

inti,have,j;

ints;

while(Finish

cp=W->next;

if(cp&&cp->intime<=time){

have=1;

}

else

have=0;

//判断当前时刻有无进程被提交

if(have){

i=0;

W->next=cp->next;//从后备队列中删除cp

Insert(R[0],cp);

cp->priority=R[0]->priority;

cp->state=R[0]->state;

cp=R[0]->next;

printf("%d时,P%d被提交入就绪队列%d\n",time,cp->id,R[0]->id);

}//将新进程入第一级就绪队列

else{

i=FindQuery(R);//循环查找不为空的就绪队列

cp=R[i]->next;

printf("%d时,无可以提交的进程,因此转到就绪队列%d执行P%d\n",time,R[i]->id,cp->id);

}

s=Dispatch(R[i],cp,W,time,tp);//cpu执行进程,并生成三种结果

if(s==1){

R[i]->next=cp->next;//从就绪队列中删除已完成的进程

Insert(F,cp);

Finish++;

printf("%d时,P%d处理完成!

\n",cp->endtime,cp->id);

}

if(s==0){

if(i<2)j=i+1;

elsej=i;

R[i]->next=cp->next;//从就绪队列中删除时间片耗尽的进程

Insert(R[j],cp);

cp->priority=R[j]->priority;

printf("%d时,P%d因时间片耗尽进入下一级就绪队列%d!

\n",cp->endtime,cp->id,R[j]->id);

}

if(s==-1){

R[i]->next=cp->next;

Insert(R[i],cp);

tp->next=R[0]->next;R[0]->next=tp;

tp->priority=R[0]->priority;tp->state=R[0]->state;

//将抢占cpu的进程进入第一级就绪队列并首先执行

printf("%d时,P%d被P%d抢占cpu并转入就绪队列%d队尾!

\n",cp->endtime,cp->id,tp->id,R[i]->id);

}

time=cp->endtime;

}

returnF;

}

 

voidmain(){

PCBW;//后备队列

PCBR[M];//就绪队列

PCBF;//完成队列

inti;

printf("就绪队\t优先级\t时间片\n");

for(i=0;i

R[i]=CreatReady(R[i],i);

}//创建就绪队列

W=(PCB)malloc(sizeof(pcb));

W->state='W';

W->next=NULL;

W=CreatWait(W);

//创建后备队列

F=(PCB)malloc(sizeof(pcb));

F->state='F';

F->next=NULL;//创建完成队列

F=MFQ(W,R,F);//MFQ算法调度

printf("完成队列如下:

\n");

Print(F)

}

 

五、实验过程原始记录(数据、图表、计算等)

六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

其中,绘制曲线图时必须用计算纸计算)

三个星期的实验,虽然时间有点短,但我也收获不少,通过这次试验,加深了我对进程概念及进程管理的理解;比较熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。

也让我认识到自己的不足,操作系统的有些知识,我知道的还不多,没有掌握好,还需要多多学学,不断提升自己的能力。

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

当前位置:首页 > 高中教育 > 其它课程

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

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