进程管理.docx
《进程管理.docx》由会员分享,可在线阅读,更多相关《进程管理.docx(12页珍藏版)》请在冰豆网上搜索。
进程管理
昆明理工大学信息工程与自动化学院学生实验报告
(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;ip=(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;iif(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(Finishcp=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;iR[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)
}
五、实验过程原始记录(数据、图表、计算等)
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸计算)
三个星期的实验,虽然时间有点短,但我也收获不少,通过这次试验,加深了我对进程概念及进程管理的理解;比较熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。
也让我认识到自己的不足,操作系统的有些知识,我知道的还不多,没有掌握好,还需要多多学学,不断提升自己的能力。