計算機操作系統-多道程序設計的實現


設計實例

設在內存中有三道程序A、B和C,並按A、B、C的優先次序運行,其內部計算和I/O操作的時間如下所示:

A: [計算 30ms] -- [I/O 40ms] -- [計算 10ms]
B: [計算 60ms] -- [I/O 30ms] -- [計算 10ms]
B: [計算 20ms] -- [I/O 40ms] -- [計算 20ms]

程序環境

程序將在單CPU,雙通道的情況下運行,為搶占式

代碼設計

代碼思路及重點分為以下幾點

  1. 使用隊列模擬CPU與兩個通道
  2. 自定義結構體存儲程序信息
  3. 設置總時間變量和當前程序變量
  4. 計算函數runPro,處理當前程序(計算和轉通道)
  5. IO函數runIO,處理當前程序(IO和轉CPU)
  6. 打印信息函數printStatus,以刷新屏幕打印信息的方式實現信息動態顯示
  7. 主函數處理當前程序變量和CPU所需要執行的程序

詳細代碼

#include <iostream>
#include <cstdio>
#include <queue>
#include <Windows.h> 

using namespace std;

struct program
{
	int countOne,IO,countTwo;
	int level;
};

program pro[100]={{30,40,10,0},{60,30,10,1},{20,40,20,2},{0,0,0,100}};

queue<program> CPU;
queue<program> PassageOne;
queue<program> PassageTwo;
program temp;

int nowTime,nowPro=0;

void runPro()
{
	if(CPU.front().level==100)	return;
	if(!PassageOne.empty())
	{
		if(PassageOne.front().level==CPU.front().level)
		{
			CPU.pop();
			return;
		}
	}
	if(!PassageTwo.empty())
	{
		if(PassageTwo.front().level==CPU.front().level)
		{
			CPU.pop();
			return;
		}
	}
	if(CPU.front().countOne>0)
	{
		CPU.front().countOne--;
		if(CPU.front().countOne==0)
		{
			temp=CPU.front();
			CPU.pop();
			pro[temp.level]=temp;
			if(PassageOne.empty())
				PassageOne.push(temp);
			else if(PassageTwo.empty())
				PassageTwo.push(temp);
		}
	}
	else
	{
		if(CPU.front().countTwo>0)
		{			
			CPU.front().countTwo--;
			if(CPU.front().countTwo==0)
			{
				temp=CPU.front();
				CPU.pop();
				pro[temp.level]=temp;
			}
		}
	}
}

void runIO()
{
	if(!PassageOne.empty())
	{
		PassageOne.front().IO--;
		if(PassageOne.front().IO==0)
		{
			temp=PassageOne.front();
			PassageOne.pop();
			pro[temp.level]=temp;
			if(temp.level<CPU.front().level)
			{
				CPU.push(temp);
				temp=CPU.front();
				pro[temp.level]=temp;
				CPU.pop();
			}
			if(CPU.empty())
			{
				CPU.push(temp);
			}
		}
	}
	if(!PassageTwo.empty())
	{
		PassageTwo.front().IO--;
		if(PassageTwo.front().IO==0)
		{
			temp=PassageTwo.front();
			PassageTwo.pop();
			pro[temp.level]=temp;
			if(temp.level<CPU.front().level)
			{
				CPU.push(temp);
				temp=CPU.front();
				pro[temp.level]=temp;
				CPU.pop();
			}
			if(CPU.empty())
			{
				CPU.push(temp);
			}
		}
	}
	
}

void printStatus()
{
	Sleep(500);
	system("cls");
	if(!CPU.empty() && CPU.front().level!=100)
	{
		if(CPU.front().level!=100)
		{
			printf("\t\t\t\t\t\t-CPU 正在執行 程序%c-\n", 'A'+CPU.front().level);
			printf("\t\t\t\t\t\t------%2d %2d %2d------\n\n", CPU.front().countOne, CPU.front().IO, CPU.front().countTwo);
		}
	}
	else
	{
		printf("\t\t\t\t\t\t-CPU 處於空閑-\n"); 
		printf("\t\t\t\t\t\t--------------------\n\n");
	}
	if(!PassageOne.empty())
	{
		printf("\t\t\t\t\t\t程序%c 正在使用通道1\n", 'A'+PassageOne.front().level);
		printf("\t\t\t\t\t\t------%2d %2d %2d------\n\n", PassageOne.front().countOne, PassageOne.front().IO, PassageOne.front().countTwo);
	}
	else
	{
		printf("\t\t\t\t\t\t通道1 正處在空閑狀態\n"); 
		printf("\t\t\t\t\t\t--------------------\n\n");
	}
	if(!PassageTwo.empty())
	{
		printf("\t\t\t\t\t\t程序%c 正在使用通道2\n", 'A'+PassageTwo.front().level);
		printf("\t\t\t\t\t\t------%2d %2d %2d------\n\n", PassageTwo.front().countOne, PassageTwo.front().IO, PassageTwo.front().countTwo);
	}
	else
	{
		printf("\t\t\t\t\t\t通道2 正處在空閑狀態\n"); 
		printf("\t\t\t\t\t\t--------------------\n\n");
	}
}

int main()
{
//	freopen("data.out","w",stdout);
	CPU.push(pro[0]);
	while(true)
	{
		nowTime++;
		runPro();
		runIO();
		printStatus();

		while(CPU.empty())
		{
			if(pro[nowPro].countOne!=0)	CPU.push(pro[nowPro]);
			else if(pro[nowPro].countOne==0 && pro[nowPro].IO!=0)	CPU.push(pro[nowPro+1]);
			else if(pro[nowPro].countOne==0 && pro[nowPro].countTwo==0)	nowPro++;
			if(nowPro>2)	break;
		}
		if(pro[2].countTwo==0)	break;
	}
	cout<<"三道程序運行結束需要 "<<nowTime+1<<" MS"<<endl;
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM