进程调度实验Word格式文档下载.docx
- 文档编号:6350576
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:16
- 大小:17.82KB
进程调度实验Word格式文档下载.docx
《进程调度实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《进程调度实验Word格式文档下载.docx(16页珍藏版)》请在冰点文库上搜索。
//开始执行时间
unsignedendtime;
//完成时间
unsignedcosttime;
//已经服务的时间
unsignedT;
//周转时间
floatTs;
//带权周转时间
unsignedrequesttime;
//还需的时间
structPCB*next;
structPCB*all_q_next;
char*start_addr;
};
//给链表尾添加成员
voidlinkadd(structPCB*p,structPCBa)
structPCB*q;
q=(structPCB*)malloc(sizeof(structPCB));
if(NULL==q)
exit(0);
}
q->
INID=a.INID;
strcpy(q->
OUTID,a.OUTID);
status=a.status;
priority=a.priority;
cometime=etime;
servertime=a.servertime;
starttime=a.starttime;
endtime=a.endtime;
costtime=a.costtime;
T=a.T;
Ts=a.Ts;
requesttime=a.requesttime;
next=NULL;
while(p->
next!
=NULL)
p=p->
next;
p->
next=q;
//创建链表
structPCB*linkcreak()
structPCB*H=NULL;
structPCB*p;
p=(structPCB*)malloc(sizeof(structPCB));
if(NULL==p)
H=p;
returnH;
/*voiddelay(longdelaytiem)//延时函数
while(delaytime>
0);
delaytime--;
0s.c
#include"
os.h"
#defineN4//时间片大小
structPCB*creque();
structPCB*crerandque();
structPCB*head;
//进程队列头指针
voidFCFS(structPCB*head);
voidprintall(structPCB*Head);
intpcbid=0;
//进程数目
//intservernum=0;
structPCB*readylink;
//就绪队列头指针
voidRR();
intmain()
//head=creque();
head=crerandque();
readylink=linkcreak();
//创建一个带头结点的就绪队列链表
readylink->
INID=0;
//就绪队列的进程数目
//printall(head);
//FCFS(head);
RR();
return0;
//创建进程队列
structPCB*creque()
structPCB*head;
structPCBa;
inti;
intn=1;
//用来打印进程数目显示
printf("
开始创建进程队列\n"
);
head=linkcreak();
输入要创建的进程总数:
"
scanf("
%d"
&
i);
while(i>
0)
a.INID=pcbid++;
a.status=0;
a.starttime=0;
a.endtime=0;
a.costtime=0;
a.T=0;
a.Ts=0;
//还需的时间
printf("
创建第%d个进程\n"
n++);
/*printf("
进程外部标识符(<
20个字符):
scanf("
%s"
a.OUTID);
进程优先级(数字1到5,1最大):
%ud"
a.priority);
*/
到达时间(正整数):
etime);
服务时间(整数,单位为秒):
a.servertime);
a.requesttime=a.servertime-a.costtime;
linkadd(head,a);
i--;
returnhead;
voidFCFS(structPCB*head)
unsignedtime=0;
structPCB*test=head->
\t\tFCFS调度\n"
for(time;
time<
time++)
while(NULL!
=test)
{
if(test->
cometime<
=time)//在所有小于等于此时刻的进程中选最先到达的执行
{
test->
starttime=time;
time+=test->
servertime;
endtime=time;
T=test->
endtime-test->
cometime;
Ts=test->
T/test->
printf("
到达时间服务时间开始执行时间完成时间周转时间带权周转时间\n"
%d\t%d\t\t%d\t%d\t\t%d\t%f\n"
test->
cometime,test->
servertime,
test->
starttime,test->
endtime,test->
T,test->
Ts);
test=test->
}
else
}
if(NULL==test)
break;
//next:
第一个进程执行的时间是:
%d\n"
time);
/*while(NULL!
for(time;
)
if(test->
=time)
{
printf("
执行的时间:
test->
服务时间:
servertime);
time+=test->
完成时间:
%d\n\n"
break;
}
else
time++;
test=test->
voidprintall(structPCB*Head)//输出链表中的所有节点
if(NULL==Head->
next)
NOPCB\n"
else
Head=Head->
while(Head!
printf("
到达时间:
%d\t服务时间:
Head->
cometime,Head->
Head=Head->
voidSPF(structPCB*head)
\t\tSPF调度\n"
time++)
voidaddreadylink(inttime1,inttime2)//把在time1time2期间到来的进程加入到就绪队列(左开右闭区间)
i=time1+1;
把在%d--%d(闭区间)期间到来的进程加入到就绪队列\n"
i,time2);
for(i;
=time2;
//printf("
\n\t\t%d时刻添加到就绪队列的进程信息\n"
i);
p=head->
while(p!
if(p->
cometime==i)
linkadd(readylink,*p);
readylink->
INID++;
到达时间:
%d,服务世间:
p->
cometime,p->
p=p->
voidRR()
inttime=-1;
//系统时间
intruntime=1;
//进程实际执行时间
structPCB*temp=NULL;
inti=0;
\n\t\t\t\t开始模拟时间片轮转调度算法\n\n"
//readylink=linkcreak();
40;
______________________%d__________________\n"
time+runtime);
addreadylink(time,time+runtime);
//把在这个进程运行期间到来的进程加入到就绪队列(左开右闭区间)
现在就绪队列中所有的进程如下\n"
printall(readylink);
if((1==i)||(i==2))
%d时刻到达的进程,现移到就绪队列的末尾\n"
temp->
cometime);
readylink->
next=readylink->
next->
temp->
//printf("
______________________________%d\n"
readylink->
INID);
linkadd(readylink,*temp);
printall(readylink);
i=0;
//}
//if(i==2)
/*{
i==0;
time+=runtime;
if(readylink->
=NULL)//就绪队列还有进程
if(readylink->
requesttime<
=N)//所需时间小于等于一个时间片,此次执行会结束这个进程
runtime=readylink->
requesttime;
costtime+=runtime;
requesttime=readylink->
servertime-readylink->
costtime;
endtime=time+runtime;
INID--;
%d时刻到达的进程被执行一次,执行了%d个时间点,现服务时间完成,从就绪队列删除\n"
readylink->
cometime,runtime);
\t一个进程运行完毕:
此进程到达时间:
%d\t完成时间:
cometime,readylink->
endtime);
//删除这个执行完的进程
printall(readylink);
runtime=N;
if(readylink->
INID!
=1)
//linkadd(readylink,*readylink->
next);
//把这个进程加到就绪队列的末尾
//printf("
%d时刻到达的进程被执行一次,执行了%d个时间点,现移到就绪队列的末尾\n"
%d时刻到达的进程被执行一次,执行了%d个时间点\n"
//readylink->
temp=readylink->
i=2;
printall(readylink);
}
else//当就绪队列中仅有一个进程时,
{//先把在执行最后一个进程过程中到来的进程加到队列中再将此进程加末尾
%d时刻到达的进程被执行一次,执行了%d个时间点,\n"
i=1;
else//就绪队列无进程
//time++;
//runtime=0;
runtime=1;
structPCB*crerandque()
unsignedx=0;
//创建进程的最大数目
//printf("
请输入要创建进程的最大数目:
\n"
//scanf("
%u"
x);
i=myrand(1,5);
下面要开始创建有%d个进程的进程队列(随机产生)\n"
++pcbid);
a.INID=pcbid;
此进程的内部标识为:
%u\t"
pcbid);
a.priority=myrand(1,5);
进程优先级:
%u\n"
a.priority);
etime=myrand(0,20);
etime);
a.servertime=myrand(1,20);
服务时间:
a.servertime);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 实验