📄 schedule.cpp
字号:
goto Schedule;
}
//时间片调度
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
{
//添加统计信息
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<<"开始运行,其优先级为";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
PrintPriority(pPcb->infoProcSch.procPriority);
cout<<endl;
}
else
{
cout<<endl<<"进程"<<setw(2)<<nProcID<<"恢复执行,其优先级为";
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<<"优先级为";
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<<"(优先级为";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALOUT);
PrintPriority(pPcb->infoProcSch.procPriority);
SetConsoleTextAttribute(g_hStdOut,CLR_CRITICALRESULT);
cout<<")被中断执行"<<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<<"(优先级为";
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<<"继续运行,其长度为";
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<<"的时间片已经用完,暂停执行"<<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;
}
//退出系统
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<<"谢谢使用本系统!"<<endl;
cout<<"按任意键退出本系统...";
getch();
exit(0);
}
cout<<endl<<"你取消了退出!"<<endl;
}
void PressAnyKey()
{
cout<<endl<<"请按任意键继续...";
getch();
cout<<endl<<endl;
}
//关于我
void AboutMe()
{
char pAuthorInfo[]="作者:陶善文\n学号:080210114\nQQ:8261525\nEMail:ahei0802@126.com\n个人网站: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);
}
//按优先级入队列
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);
}
//以文字方式打印优先级
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;
}
}
//打印统计信息:程序长度
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 "<<"周转时间 "<<"带权周转时间"<<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<<"平均周转时间为:"<<nPeriod/nSize<<endl;
cout<<"平均带权周转时间为:"<<nWeightPeriod/nSize;
cout<<endl;
}
//打印统计信息:进程优先级
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<<"进程优先级 ";
SetConsoleTextAttribute(g_hStdOut,CLR_NORMALRESULT);
cout<<"进程ID "<<"周转时间 "<<"带权周转时间"<<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<<"平均周转时间为:"<<nPeriod/nSize<<endl;
cout<<"平均带权周转时间为:"<<nWeightPeriod/nSize;
cout<<endl;
}
//打印算法
void PrintAlgorithm(SCHEDULEALGORITHM algo)
{
switch(algo)
{
case FCFS:
cout<<"先来先服务";
break;
case SPF:
cout<<"短进程优先";
break;
case FPF_Reaved:
cout<<"抢占式高优先权";
break;
case TimePiece:
cout<<"时间片轮转";
break;
}
}
BOOL CtrlHandler(DWORD dwCtrlType)
{
int nAns;
switch(dwCtrlType)
{
case CTRL_C_EVENT:
nAns=MessageBox(0,"你真的要退出吗?","退出系统",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 + -