?? schedule.cpp
字號:
goto Schedule;
}
//時間片調(diào)度
void Schedule_TimePiece()
{
PCB pcb;
Schedule:
if(g_bIsEnd && g_pcbReadyPriorityQueue.empty())
{
g_listStatInfoProcPriority.sort();
PrintStatInfo_Priority(g_listStatInfoProcPriority,TimePiece);
return;
}
if(g_pcbReadyPriorityQueue.empty())
goto Schedule;
EnterCriticalSection(&g_CriticalSection);
pcb=g_pcbReadyPriorityQueue.front();
g_pcbReadyPriorityQueue.pop_front();
LeaveCriticalSection(&g_CriticalSection);
if(!RunProc(&pcb))
{
EnterCriticalSection(&g_CriticalSection);
g_pcbReadyPriorityQueue.push_back(pcb);
LeaveCriticalSection(&g_CriticalSection);
}
else
{
//添加統(tǒng)計信息
STATINFO_PRIORITY infoStat;
infoStat.nPeriod=GetTickCount()-pcb.infoStat.nRequestTime;
infoStat.procPriority=pcb.infoProcSch.procPriority;
infoStat.nProcID=pcb.idProc.nInID;
infoStat.nWeightPeriod=infoStat.nPeriod/pcb.infoStat.nGetCPUTime;
g_listStatInfoProcPriority.push_back(infoStat);
}
goto Schedule;
}
//運行程序
BOOL RunProc(PCB *pPcb)
{
int i;
PROGRAM *pProgram=&pPcb->program;
int nProcID=pPcb->idProc.nInID;
int nSize=pProgram->instructionSet.size();
int nTimePieceCnt=0;
int nStartTime=GetTickCount();
// cout.unsetf(cout.dec);
// cout.setf(cout.hex);
switch(g_ScheduleAlgorithm)
{
case FCFS:
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<endl<<"進程"<<setw(2)<<nProcID<<"開始運行,其請求運行時間為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
cout<<setw(2)<<pProgram->timeSystem.wMinute<<"分"
<<setw(2)<<pProgram->timeSystem.wSecond<<"秒"
<<setw(3)<<pProgram->timeSystem.wMilliseconds<<"微秒"<<endl;
cout<<endl;
LeaveCriticalSection(&g_CriticalSection);
for(i=0;i<nSize;i++)
{
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
printf("進程%2d正在運行指令%4X...\n",nProcID,pProgram->instructionSet[i]);
LeaveCriticalSection(&g_CriticalSection);
}
pPcb->infoStat.nGetCPUTime=GetTickCount()-nStartTime;
if(!pPcb->infoStat.nGetCPUTime)
pPcb->infoStat.nGetCPUTime+=2;
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<"進程"<<setw(2)<<nProcID<<"運行完畢"<<endl;
LeaveCriticalSection(&g_CriticalSection);
break;
case SPF:
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<endl<<"進程"<<setw(2)<<nProcID<<"開始運行,其長度為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
cout<<pProgram->nProgLen<<endl;
cout<<endl;
LeaveCriticalSection(&g_CriticalSection);
for(i=0;i<nSize;i++)
{
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
printf("進程%2d正在運行指令%4X...\n",nProcID,pProgram->instructionSet[i]);
LeaveCriticalSection(&g_CriticalSection);
}
pPcb->infoStat.nGetCPUTime=GetTickCount()-nStartTime;
if(!pPcb->infoStat.nGetCPUTime)
pPcb->infoStat.nGetCPUTime=2;
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<"進程"<<setw(2)<<nProcID<<"運行完畢"<<endl;
LeaveCriticalSection(&g_CriticalSection);
break;
case FPF_Reaved:
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
if(!pProgram->nIP)
{
cout<<endl<<"進程"<<setw(2)<<nProcID<<"開始運行,其優(yōu)先級為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
PrintPriority(pPcb->infoProcSch.procPriority);
cout<<endl;
}
else
{
cout<<endl<<"進程"<<setw(2)<<nProcID<<"恢復執(zhí)行,其優(yōu)先級為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
PrintPriority(pPcb->infoProcSch.procPriority);
cout<<endl;
}
cout<<endl;
LeaveCriticalSection(&g_CriticalSection);
for(i=pProgram->nIP;i<nSize;i++)
{
if(g_bIsPrioritierReach)
{
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<endl<<"優(yōu)先級為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
PrintPriority(g_pcbPrioritier.infoProcSch.procPriority);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<"的進程"<<setw(2)<<g_pcbPrioritier.idProc.nInID<<"請求運行,進程"
<<setw(2)<<nProcID<<"(優(yōu)先級為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
PrintPriority(pPcb->infoProcSch.procPriority);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<")被中斷執(zhí)行"<<endl;
g_bIsPrioritierReach=FALSE;
LeaveCriticalSection(&g_CriticalSection);
pProgram->nIP=i;
pPcb->infoStat.nGetCPUTime+=GetTickCount()-nStartTime;
return FALSE;
}
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
printf("進程%2d正在運行指令%4X...",nProcID,pProgram->instructionSet[i]);
cout<<"(優(yōu)先級為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
PrintPriority(pPcb->infoProcSch.procPriority);
cout<<")"<<endl;
LeaveCriticalSection(&g_CriticalSection);
}
pPcb->infoStat.nGetCPUTime+=GetTickCount()-nStartTime;
if(!pPcb->infoStat.nGetCPUTime)
pPcb->infoStat.nGetCPUTime=2;
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<"進程"<<setw(2)<<nProcID<<"運行完畢"<<endl;
LeaveCriticalSection(&g_CriticalSection);
return TRUE;
case TimePiece:
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
if(!pProgram->nIP)
{
cout<<endl<<"進程"<<setw(2)<<nProcID<<"開始運行,其長度為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
cout<<pPcb->program.nProgLen<<endl;
}
else
{
cout<<endl<<"進程"<<setw(2)<<nProcID<<"繼續(xù)運行,其長度為";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
cout<<pPcb->program.nProgLen<<endl;
}
cout<<endl;
LeaveCriticalSection(&g_CriticalSection);
for(i=pProgram->nIP;i<nSize;i++)
{
if(nTimePieceCnt>g_nMaxTimePiece)
{
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<"進程"<<nProcID<<"的時間片已經(jīng)用完,暫停執(zhí)行"<<endl;
LeaveCriticalSection(&g_CriticalSection);
pProgram->nIP=i;
pPcb->infoStat.nGetCPUTime+=GetTickCount()-nStartTime;
return FALSE;
}
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
printf("進程%2d正在運行指令%4X...\n",nProcID,pProgram->instructionSet[i]);
LeaveCriticalSection(&g_CriticalSection);
nTimePieceCnt++;
}
pPcb->infoStat.nGetCPUTime+=GetTickCount()-nStartTime;
if(!pPcb->infoStat.nGetCPUTime)
pPcb->infoStat.nGetCPUTime=2;
EnterCriticalSection(&g_CriticalSection);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<"進程"<<setw(2)<<nProcID<<"運行完畢"<<endl;
LeaveCriticalSection(&g_CriticalSection);
return TRUE;
}
return TRUE;
}
//退出系統(tǒng)
void Exit()
{
char c;
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
cout<<"確定退出嗎?(Y/N)";
c=getch();
SetConsoleTextAttribute(g_hStdOut,CLR_IN);
putch(c);
cout<<endl;
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
if(c=='Y' || c=='y')
{
Clean();
cout<<endl<<"謝謝使用本系統(tǒng)!"<<endl;
cout<<"按任意鍵退出本系統(tǒng)...";
getch();
exit(0);
}
cout<<endl<<"你取消了退出!"<<endl;
}
void PressAnyKey()
{
cout<<endl<<"請按任意鍵繼續(xù)...";
getch();
cout<<endl<<endl;
}
//關(guān)于我
void AboutMe()
{
char pAuthorInfo[]="作者:陶善文\n學號:080210114\nQQ:8261525\nEMail:ahei0802@126.com\n個人網(wǎng)站:http://home.pudn.com/ahei\n";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
cout<<endl;
AnimatePrint(pAuthorInfo);
}
void AnimatePrint(char* pStr)
{
UINT i;
for(i=0;i<strlen(pStr);i++)
{
cout<<pStr[i];
Sleep(20);
}
}
void CoolBeep(UINT uiCbSort)
{
switch(uiCbSort)
{
case CB_ERROR:
Beep(410,150);
break;
case CB_OK:
//聲音1
Beep(2000,30);
Sleep(100);
Beep(2000,30);
Sleep(100);
Beep(2000,30);
//聲音2
/* Beep(3000,150);
Sleep(50);
Beep(3000,150);*/
break;
default:
break;
}
}
void Reset(SCHEDULEALGORITHM algo)
{
g_bIsEnd=FALSE;
g_nCurProcID=0;
g_nFinishedTime=0;
g_bIsPrioritierReach=FALSE;
switch(algo)
{
case FCFS:
g_nCloseTime=6000;
g_nMaxRunTime=20;
g_nMaxInterval=1000;
g_listStatInfoProgLen[algo].clear();
break;
case SPF:
g_nCloseTime=100;
g_nMaxRunTime=30;
g_nMaxInterval=10;
g_listStatInfoProgLen[algo].clear();
break;
case FPF_Reaved:
g_nCloseTime=100;
g_nMaxRunTime=20;
g_nMaxInterval=10;
g_listStatInfoProgLen[algo].clear();
break;
case TimePiece:
g_nCloseTime=55;
g_nMaxRunTime=20;
g_nMaxInterval=10;
g_nMaxTimePiece=4;
g_listStatInfoProcPriority.clear();
break;
}
}
//按程序大小入隊列
void SortInsProgLenQ(PCBPQUEUE& pcbQ,PCB pcb)
{
PCBPQUEUE::iterator p;
for(p=pcbQ.begin();p!=pcbQ.end();p++)
{
if(pcb.program.nProgLen<(*p).program.nProgLen)
{
pcbQ.insert(p,pcb);
return;
}
}
pcbQ.push_back(pcb);
}
//按優(yōu)先級入隊列
void SortInsPriorityQ(PCBPQUEUE& pcbQ,PCB pcb)
{
PCBPQUEUE::iterator p;
for(p=pcbQ.begin();p!=pcbQ.end();p++)
{
if(pcb.infoProcSch.procPriority > (*p).infoProcSch.procPriority)
{
pcbQ.insert(p,pcb);
return;
}
}
pcbQ.push_back(pcb);
}
//以文字方式打印優(yōu)先級
void PrintPriority(PROCPRIORITY p)
{
switch(p)
{
case Low:
cout<<"\"低\"";
break;
case LowStandard:
cout<<"\"低于標準\"";
break;
case Standard:
cout<<"\"標準\"";
break;
case HighStandard:
cout<<"\"高于標準\"";
break;
case High:
cout<<"\"高\"";
break;
case RealTime:
cout<<"\"實時\"";
break;
}
}
//打印統(tǒng)計信息:程序長度
void PrintStatInfo_ProgLen(STATINFOL_PROGLEN l,SCHEDULEALGORITHM algo)
{
int nPeriod=0;
int nWeightPeriod=0;
int nSize=l.size();
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
cout<<endl;
cout<<"算法:";
PrintAlgorithm(algo);
cout<<endl;
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<endl;
cout<<"程序長度 ";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
cout<<"進程ID "<<"周轉(zhuǎn)時間 "<<"帶權(quán)周轉(zhuǎn)時間"<<endl;
STATINFOL_PROGLEN::iterator p;
for(p=l.begin();p!=l.end();p++)
{
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<setw(5)<<(*p).nProgLen;
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
cout<<setw(7)<<(*p).nProcID
<<setw(10)<<(*p).nPeriod
<<setw(10)<<(*p).nWeightPeriod<<endl;
nPeriod+=(*p).nPeriod;
nWeightPeriod+=(*p).nWeightPeriod;
}
cout<<endl;
cout<<"平均周轉(zhuǎn)時間為:"<<nPeriod/nSize<<endl;
cout<<"平均帶權(quán)周轉(zhuǎn)時間為:"<<nWeightPeriod/nSize;
cout<<endl;
}
//打印統(tǒng)計信息:進程優(yōu)先級
void PrintStatInfo_Priority(STATINFOL_PRIORITY l,SCHEDULEALGORITHM algo)
{
int nPeriod=0;
int nWeightPeriod=0;
int nSize=l.size();
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
cout<<endl;
cout<<"算法:";
PrintAlgorithm(algo);
cout<<endl;
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<endl;
cout<<"進程優(yōu)先級 ";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
cout<<"進程ID "<<"周轉(zhuǎn)時間 "<<"帶權(quán)周轉(zhuǎn)時間"<<endl;
STATINFOL_PRIORITY::iterator p;
for(p=l.begin();p!=l.end();p++)
{
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<setw(5)<<(*p).procPriority;
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
cout<<setw(10)<<(*p).nProcID
<<setw(8)<<(*p).nPeriod
<<setw(10)<<(*p).nWeightPeriod<<endl;
nPeriod+=(*p).nPeriod;
nWeightPeriod+=(*p).nWeightPeriod;
}
cout<<endl;
cout<<"平均周轉(zhuǎn)時間為:"<<nPeriod/nSize<<endl;
cout<<"平均帶權(quán)周轉(zhuǎn)時間為:"<<nWeightPeriod/nSize;
cout<<endl;
}
//打印算法
void PrintAlgorithm(SCHEDULEALGORITHM algo)
{
switch(algo)
{
case FCFS:
cout<<"先來先服務(wù)";
break;
case SPF:
cout<<"短進程優(yōu)先";
break;
case FPF_Reaved:
cout<<"搶占式高優(yōu)先權(quán)";
break;
case TimePiece:
cout<<"時間片輪轉(zhuǎn)";
break;
}
}
BOOL CtrlHandler(DWORD dwCtrlType)
{
int nAns;
switch(dwCtrlType)
{
case CTRL_C_EVENT:
nAns=MessageBox(0,"你真的要退出嗎?","退出系統(tǒng)",MB_ICONQUESTION | MB_YESNO);
if(nAns==IDYES)
exit(0);
return TRUE;
default:
return TRUE;
}
}
//事后清理
void Clean()
{
DeleteCriticalSection(&g_CriticalSection);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -