操作系统进程调度算法模拟MFC实现.docx
- 文档编号:4820628
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:22
- 大小:20.14KB
操作系统进程调度算法模拟MFC实现.docx
《操作系统进程调度算法模拟MFC实现.docx》由会员分享,可在线阅读,更多相关《操作系统进程调度算法模拟MFC实现.docx(22页珍藏版)》请在冰豆网上搜索。
操作系统进程调度算法模拟MFC实现
#include"windows.h"
#include"windowsx.h"
#include"tchar.h"
#include"strsafe.h"
#include"resource.h"
#pragmawarning(disable:
4312)
#pragmawarning(disable:
4244)
#defineEDITLEN20
#defineRR2//时间片
#definechHANDLE_DLGMSG(hWnd,message,fn)\
case(message):
return(SetDlgMsgResult(hWnd,uMsg,\
HANDLE_##message((hWnd),(wParam),(lParam),(fn))))
structProcInfo{
intprocID;//进程ID
floatarriveT;//达到时间
floatserverT;//服务时间
floatremainT;//剩余运行时间
floatlastrunT;//上次运行时间
floatrunT;//运行时间总和
floatpriority;//优先级,高响应比优先调度算法时初始为1,其他算法未用到,初始为0
structProcInfo*next;//下一结点
}*startProc,*endProc;
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);
if(lstrcmp(str,_T("\0"))==0)
returnfalse;
}
returntrue;
}
/*
计算平均周转时间和平均带权周转时间,并显示
*/
voidShowEdits()
{
floatzzsj=0,pjzz=0;
wchar_tstr[10];
for(inti=IDC_A4;i<=IDC_F4;i+=5){
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);
StringCchPrintf(str,10,_T("%f"),pjzz/6);
SetDlgItemText(hWnd,IDC_TIME2,str);
}
/*
清除所有编辑框的内容
*/
voidClearEdits()
{
for(inti=IDC_A1;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; if(startProc->next! =NULL){ startProc=startProc->next; startProc->lastrunT=tmp->lastrunT+tmp->remainT; }else{ startProc=endProc=NULL; } finishT=tmp->lastrunT+tmp->remainT; StringCchPrintf(str,10,_T("%f"),finishT); SetDlgItemText(hWnd,IDC_A3+5*tmp->procID,str); StringCchPrintf(str,10,_T("%f"),finishT-tmp->arriveT); SetDlgItemText(hWnd,IDC_A4+5*tmp->procID,str); StringCchPrintf(str,10,_T("%f"),(finishT-tmp->arriveT)/(float)tmp->serverT); SetDlgItemText(hWnd,IDC_A5+5*tmp->procID,str); deletetmp; } } /* 当链表头结点被抢占或时间片到时,将头结点移到尾结点 参数: moreT为头结点运行到被抢占或时间片到的时间间隔 */ voidChangeNode(intmoreT) { if(startProc! =NULL){ if(startProc->next! =NULL){ ProcInfo*tmp=startProc; startProc=startProc->next; tmp->next=NULL; tmp->runT+=moreT; tmp->remainT-=moreT; endProc->next=tmp; endProc=tmp; startProc->lastrunT=tmp->lastrunT+moreT; }else{ startProc->lastrunT+=moreT; startProc->runT+=moreT; startProc->remainT-=moreT; } } } /* 先到先服务调度算法 */ voidAlgoFCFS(int*arrive,int*server) { intprocNum=6; intindex=0; ProcInfo*node; startProc=endProc=NULL; while(procNum){ if(startProc! =NULL){ //直接将每个进程插入链表,链表中每个结点按顺序运行 while(index<6){ node=newProcInfo; node->procID=index; node->arriveT=arrive[index]; node->serverT=server[index]; node->remainT=server[index]; node->lastrunT=arrive[index]; node->runT=0; node->priority=0; node->next=NULL; index++; InsertNode(node); } RemoveNode(); procNum--; }else{ if(index<6){ node=newProcInfo; node->procID=index; node->arriveT=arrive[index]; node->serverT=server[index]; node->remainT=server[index]; node->lastrunT=arrive[index]; node->runT=0; node->priority=0; node->next=NULL; index++; InsertNode(node); }else break; } } } /* 短进程优先调度算法 */ voidAlgoSJF(int*arrive,int*server) { intprocNum=6; intindex=0; floatminremainT; ProcInfo*node,*tmp,*seize,*mid,*tmp2; startProc=endProc=NULL; while(procNum){ if(startProc! =NULL){ tmp=seize=startProc; minremainT=startProc->remainT; //查看链表中是否有剩余运行时间比头结点小的进程,如果有存入最小运行时间 while((tmp=tmp->next)! =NULL){ if(tmp->remainT minremainT=tmp->remainT; seize=tmp; }elseif(minremainT if(tmp->arriveT seize=tmp; } } while(index<6){ //查看在头结点被短进程抢占,或运行结束时,是否有新进程到达 if(arrive[index]<(startProc->lastrunT+minremainT)){ node=newProcInfo; node->procID=index; node->arriveT=arrive[index]; node->serverT=server[index]; node->remainT=server[index]; node->lastrunT=arrive[index]; node->runT=0; node->priority=0; node->next=NULL; index++; InsertNode(node); //当有新进程到达时,根据剩余运行时间插入到链表中 mid=NULL; tmp=startProc; while(tmp->next! =endProc){ if(tmp->next->remainT>endProc->remainT){ mid=tmp; break; } tmp=tmp->next; } if(mid! =NULL){ tmp=startProc->next; while(tmp->next! =NULL){ if(tmp->next==endProc){ tmp2=endProc; tmp->next=NULL; endProc=tmp; tmp2->next=mid->next; mid->next=tmp2; break; } tmp=tmp->next; } } //查看刚插入的结点的剩余运行时间是否小于最小剩余时间 if(node->remainT minremainT=node->remainT; seize=node; }elseif(minremainT if(node->arriveT seize=node; } }else break; } //当seize仍为头结点时,表示没有比头结点更小的剩余运行时间,故移除头结点 if(seize==startProc){ RemoveNode(); procNum--; }else{//否则,将抢占进程移到头结点之后,并更改结点 tmp=startProc; while(tmp! =NULL){ if(tmp->next==seize){ tmp->next=seize->next; if(seize==endProc) endProc=tmp; break; } tmp=tmp->next; } seize->next=startProc->next; if(startProc==endProc) endProc=seize; startProc->next=seize; ChangeNode(minremainT); } }else{ if(index<6){ node=newProcInfo; node->procID=index; node->arriveT=arrive[index]; node->serverT=server[index]; node->remainT=server[index]; node->lastrunT=arrive[index]; node->runT=0; node->priority=0; node->next=NULL; index++; InsertNode(node); }else break; } } } /* 高响应比优先调度算法 */ voidAlgoHRP(int*arrive,int*server) { intprocNum=6; intindex=0; floatwaitT,minwaitT,waitT2,lastwaitT; ProcInfo*node,*tmp,*seize,*second; floatprio=0,stmp; startProc=endProc=NULL; while(procNum){ if(startProc! =NULL){ tmp=seize=second=startProc; minwaitT=startProc->remainT; //计算在头结点剩余时间内,是否有进程的优先级超过头结点,如果有,取最先超过头结点的进程为抢占进程 while((tmp=tmp->next)! =NULL){ waitT=(startProc->priority-1)*tmp->serverT+0.1;//计算超过头结点的最小等待时间 lastwaitT=waitT-(startProc->lastrunT-tmp->arriveT-tmp->runT);//计算头结点运行期间还需要等待的时间 if(lastwaitT minwaitT=lastwaitT; tmp->priority=waitT/tmp->serverT+1; seize=tmp; }elseif(minwaitT if(tmp->serverT tmp->priority=waitT/tmp->serverT+1; seize=tmp; }elseif(tmp->serverT==seize->serverT){//当等于最小时间,服务时间也相同时,先到达者优先 if(tmp->arriveT tmp->priority=waitT/tmp->serverT+1; seize=tmp; } } }else{ if(minwaitT==startProc->remainT){//当头结点剩余时间内,没有进程的优先级抢占时,计算优先级第二高的进程 waitT2=startProc->lastrunT-tmp->arriveT-tmp->runT+startProc->remainT; stmp=waitT2/tmp->serverT+1; if(stmp>prio){ tmp->priority=prio=stmp; second=tmp; } } } } while(index<6){//查看在头结点的剩余时间内,或被抢占的时间间隔内,是否有进程到达 if(arrive[index]<(startProc->lastrunT+minwaitT)){ node=newProcInfo; node->procID=index; node->arriveT=arrive[index]; node->serverT=server[index]; node->remainT=server[index]; node->lastrunT=arrive[index]; node->runT=0; node->priority=1; node->next=NULL; index++; InsertNode(node); //查看在该进程到达,到头结点运行结束,或被抢占前,优先级是否能超过头结点 waitT=(startProc->priority-1)*node->serverT+0.1; lastwaitT=waitT+(node->arriveT-startProc->lastrunT); if(lastwaitT minwaitT=lastwaitT; node->priority=waitT/node->serverT+1; seize=node; }elseif(minwaitT if(node->serverT node->priority=waitT/node->serverT+1; seize=node; }elseif(node->serverT==seize->serverT){ if(node->arriveT node->priority=waitT/node->serverT+1; seize=node; } } }else{ if(minwaitT==startProc->remainT){ waitT2=startProc->remainT-(node->arriveT-startProc->lastrunT); stmp=waitT2/node->serverT+1; if(stmp>prio){ node->priority=prio=stmp; second=node; } } } }else break; } //当计算的抢占结点仍为头结点时,表示没有抢占的进程,故将第二高优先级的进程移到头结点之后,并移除头结点 if(seize==startProc){ if(second! =startProc){ tmp=startProc; while(tmp! =NULL){ if(tmp->next==second){ tmp->next
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程 调度 算法 模拟 MFC 实现