操作系统进程调度算法模拟MFC实现Word格式文档下载.docx
- 文档编号:17769504
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:22
- 大小:20.14KB
操作系统进程调度算法模拟MFC实现Word格式文档下载.docx
《操作系统进程调度算法模拟MFC实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统进程调度算法模拟MFC实现Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
HWNDhWnd;
/*
检查6个进程的到达时间和服务时间是否已经全部输入
已经全部输入返回TRUE,否则返回FALSE
*/
boolCheckEdits()
{
wchar_tstr[EDITLEN];
for(inti=IDC_A1;
i<
=IDC_F1;
i+=5){
GetDlgItemText(hWnd,i,str,EDITLEN);
if(lstrcmp(str,_T("
\0"
))==0)
returnfalse;
GetDlgItemText(hWnd,i+1,str,EDITLEN);
))==0)
}
returntrue;
}
计算平均周转时间和平均带权周转时间,并显示
voidShowEdits()
floatzzsj=0,pjzz=0;
wchar_tstr[10];
for(inti=IDC_A4;
=IDC_F4;
GetDlgItemText(hWnd,i,str,10);
zzsj+=_wtof(str);
GetDlgItemText(hWnd,i+1,str,10);
pjzz+=_wtof(str);
StringCchPrintf(str,10,_T("
%f"
),zzsj/6);
SetDlgItemText(hWnd,IDC_TIME1,str);
),pjzz/6);
SetDlgItemText(hWnd,IDC_TIME2,str);
清除所有编辑框的内容
voidClearEdits()
IDC_TIME2+1;
i++){
SetWindowText(GetDlgItem(hWnd,i),_T("
"
));
在链表尾部插入node结点
voidInsertNode(ProcInfo*node)
if(startProc==NULL){
startProc=endProc=node;
}else{
endProc->
next=node;
endProc=node;
if(startProc->
next==NULL){
startProc->
next=endProc;
}
移除链表头结点
voidRemoveNode()
if(startProc!
=NULL){
floatfinishT;
wchar_tstr[10];
ProcInfo*tmp=startProc;
next!
startProc=startProc->
next;
lastrunT=tmp->
lastrunT+tmp->
remainT;
}else{
startProc=endProc=NULL;
finishT=tmp->
StringCchPrintf(str,10,_T("
),finishT);
SetDlgItemText(hWnd,IDC_A3+5*tmp->
procID,str);
),finishT-tmp->
arriveT);
SetDlgItemText(hWnd,IDC_A4+5*tmp->
),(finishT-tmp->
arriveT)/(float)tmp->
serverT);
SetDlgItemText(hWnd,IDC_A5+5*tmp->
deletetmp;
当链表头结点被抢占或时间片到时,将头结点移到尾结点
参数:
moreT为头结点运行到被抢占或时间片到的时间间隔
voidChangeNode(intmoreT)
ProcInfo*tmp=startProc;
tmp->
next=NULL;
runT+=moreT;
remainT-=moreT;
endProc->
next=tmp;
endProc=tmp;
lastrunT+moreT;
lastrunT+=moreT;
先到先服务调度算法
voidAlgoFCFS(int*arrive,int*server)
intprocNum=6;
intindex=0;
ProcInfo*node;
startProc=endProc=NULL;
while(procNum){
if(startProc!
//直接将每个进程插入链表,链表中每个结点按顺序运行
while(index<
6){
node=newProcInfo;
node->
procID=index;
arriveT=arrive[index];
serverT=server[index];
remainT=server[index];
lastrunT=arrive[index];
runT=0;
priority=0;
index++;
InsertNode(node);
}
RemoveNode();
procNum--;
if(index<
}else
break;
短进程优先调度算法
voidAlgoSJF(int*arrive,int*server)
floatminremainT;
ProcInfo*node,*tmp,*seize,*mid,*tmp2;
tmp=seize=startProc;
minremainT=startProc->
//查看链表中是否有剩余运行时间比头结点小的进程,如果有存入最小运行时间
while((tmp=tmp->
next)!
if(tmp->
remainT<
minremainT){
minremainT=tmp->
seize=tmp;
}elseif(minremainT<
startProc->
remainT&
&
tmp->
remainT==minremainT){
if(tmp->
arriveT<
seize->
arriveT)
seize=tmp;
}
//查看在头结点被短进程抢占,或运行结束时,是否有新进程到达
if(arrive[index]<
(startProc->
lastrunT+minremainT)){
node=newProcInfo;
node->
index++;
InsertNode(node);
//当有新进程到达时,根据剩余运行时间插入到链表中
mid=NULL;
tmp=startProc;
while(tmp->
=endProc){
if(tmp->
next->
remainT>
endProc->
remainT){
mid=tmp;
break;
}
tmp=tmp->
}
if(mid!
tmp=startProc->
while(tmp->
if(tmp->
next==endProc){
tmp2=endProc;
tmp->
endProc=tmp;
tmp2->
next=mid->
mid->
next=tmp2;
break;
}
tmp=tmp->
//查看刚插入的结点的剩余运行时间是否小于最小剩余时间
if(node->
minremainT=node->
seize=node;
}elseif(minremainT<
node->
if(node->
seize=node;
}else
break;
//当seize仍为头结点时,表示没有比头结点更小的剩余运行时间,故移除头结点
if(seize==startProc){
RemoveNode();
procNum--;
}else{//否则,将抢占进程移到头结点之后,并更改结点
tmp=startProc;
while(tmp!
next==seize){
tmp->
next=seize->
if(seize==endProc)
endProc=tmp;
break;
tmp=tmp->
seize->
next=startProc->
if(startProc==endProc)
endProc=seize;
startProc->
next=seize;
ChangeNode(minremainT);
/*
高响应比优先调度算法
*/
voidAlgoHRP(int*arrive,int*server)
intprocNum=6;
intindex=0;
floatwaitT,minwaitT,waitT2,lastwaitT;
ProcInfo*node,*tmp,*seize,*second;
floatprio=0,stmp;
while(procNum){
tmp=seize=second=startProc;
minwaitT=startProc->
//计算在头结点剩余时间内,是否有进程的优先级超过头结点,如果有,取最先超过头结点的进程为抢占进程
while((tmp=tmp->
waitT=(startProc->
priority-1)*tmp->
serverT+0.1;
//计算超过头结点的最小等待时间
lastwaitT=waitT-(startProc->
lastrunT-tmp->
arriveT-tmp->
runT);
//计算头结点运行期间还需要等待的时间
if(lastwaitT<
minwaitT){//当小于最小时间时,更新最小时间,优先级,和抢占进程
minwaitT=lastwaitT;
tmp->
priority=waitT/tmp->
serverT+1;
}elseif(minwaitT<
lastwaitT==minwaitT){//当等于最小时间时,服务时间越小,优先级越高
serverT<
serverT){
}elseif(tmp->
serverT==seize->
serverT){//当等于最小时间,服务时间也相同时,先到达者优先
arriveT){
tmp->
seize=tmp;
}else{
if(minwaitT==startProc->
remainT){//当头结点剩余时间内,没有进程的优先级抢占时,计算优先级第二高的进程
waitT2=startProc->
runT+startProc->
stmp=waitT2/tmp->
if(stmp>
prio){
priority=prio=stmp;
second=tmp;
6){//查看在头结点的剩余时间内,或被抢占的时间间隔内,是否有进程到达
lastrunT+minwaitT)){
priority=1;
//查看在该进程到达,到头结点运行结束,或被抢占前,优先级是否能超过头结点
waitT=(startProc->
priority-1)*node->
lastwaitT=waitT+(node->
arriveT-startProc->
lastrunT);
if(lastwaitT<
minwaitT){
minwaitT=lastwaitT;
node->
priority=waitT/node->
}elseif(minwaitT<
lastwaitT==minwaitT){
node->
}elseif(node->
if(node->
node->
seize=node;
}else{
if(minwaitT==startProc->
waitT2=startProc->
remainT-(node->
stmp=waitT2/node->
if(stmp>
prio){
second=node;
//当计算的抢占结点仍为头结点时,表示没有抢占的进程,故将第二高优先级的进程移到头结点之后,并移除头结点
if(second!
=startProc){
while(tmp!
next==second){
next
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程 调度 算法 模拟 MFC 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)