⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 schedule.cpp

📁 计算机操作系统中的重要实验
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -