본문 바로가기

프로젝트/개인 프로젝트

[C++] 스케줄링 시뮬레이션 C++ Ver

# of Processes : 3
Arrival time : 2 5 10
Burst time : 2 2 2
time : 0
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : -1
runProcess : -1
exitProcessCnt : 0
runProcessCuurentBurstTime : 2 2 2
queue :
isInQueue : 0 0 0
---------------------
time : 1
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : -1
runProcess : -1
exitProcessCnt : 0
runProcessCuurentBurstTime : 2 2 2
queue :
isInQueue : 0 0 0
---------------------
time : 2
responseRatio[스왑 전] : 1
queue[스왑 전] : 0
responseRatio[스왑 후] : 1
queue[스왑 후] : 0
runProcess[실행 도중] : 0
runProcess : 0
exitProcessCnt : 0
runProcessCuurentBurstTime : 1 2 2
queue :
isInQueue : 1 0 0
---------------------
time : 3
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : 0
runProcess : -1
exitProcessCnt : 1
runProcessCuurentBurstTime : 0 2 2
queue :
isInQueue : 1 0 0
---------------------
time : 4
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : -1
runProcess : -1
exitProcessCnt : 1
runProcessCuurentBurstTime : 0 2 2
queue :
isInQueue : 1 0 0
---------------------
time : 5
responseRatio[스왑 전] : 1
queue[스왑 전] : 1
responseRatio[스왑 후] : 1
queue[스왑 후] : 1
runProcess[실행 도중] : 1
runProcess : 1
exitProcessCnt : 1
runProcessCuurentBurstTime : 0 1 2
queue :
isInQueue : 1 1 0
---------------------
time : 6
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : 1
runProcess : -1
exitProcessCnt : 2
runProcessCuurentBurstTime : 0 0 2
queue :
isInQueue : 1 1 0
---------------------
time : 7
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : -1
runProcess : -1
exitProcessCnt : 2
runProcessCuurentBurstTime : 0 0 2
queue :
isInQueue : 1 1 0
---------------------
time : 8
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : -1
runProcess : -1
exitProcessCnt : 2
runProcessCuurentBurstTime : 0 0 2
queue :
isInQueue : 1 1 0
---------------------
time : 9
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : -1
runProcess : -1
exitProcessCnt : 2
runProcessCuurentBurstTime : 0 0 2
queue :
isInQueue : 1 1 0
---------------------
time : 10
responseRatio[스왑 전] : 1
queue[스왑 전] : 2
responseRatio[스왑 후] : 1
queue[스왑 후] : 2
runProcess[실행 도중] : 2
runProcess : 2
exitProcessCnt : 2
runProcessCuurentBurstTime : 0 0 1
queue :
isInQueue : 1 1 1
---------------------
time : 11
responseRatio[스왑 전] :
queue[스왑 전] :
responseRatio[스왑 후] :
queue[스왑 후] :
runProcess[실행 도중] : 2
runProcess : -1
exitProcessCnt : 3
runProcessCuurentBurstTime : 0 0 0
queue :
isInQueue : 1 1 1
---------------------
---processState---
0 time has waitingRow :
1 time has waitingRow :
2 time has waitingRow :
3 time has waitingRow :
4 time has waitingRow :
5 time has waitingRow :
6 time has waitingRow :
7 time has waitingRow :
8 time has waitingRow :
9 time has waitingRow :
10 time has waitingRow :
11 time has waitingRow :
waitingTime : 0 0 0
turnaroundTime : 2 2 2
nomarlizeTurnaroundTime : 1 1 1

TUI : -1 -1 0 0 -1 1 1 -1 -1 -1 2 2
intervalRunTime[0] : 2 intervalRunTime[1] : 2 intervalRunTime[2] : 1 intervalRunTime[3] : 2 intervalRunTime[4] : 3
intervalRunTime[5] : 2
runSequence[0] : -1 runSequence[1] : 0 runSequence[2] : -1 runSequence[3] : 1 runSequence[4] : -1
runSequence[5] : 2

위는 실행 화면입니다.

3개의 프로세스를 2 5 10의 Init Time을 갖고, 2 2 2의 Burst Time을 가졌을 때 TUI로 나타낸 것입니다 !

 

아래는 이 중 하나인 HRRN 코드입니다.

int currentTime = 0;
	int exitProcessCnt = 0;
	int runProcess = -1;
	bool *isInQueue = new bool[processes];
	bool isEmptyTime = false;
	int runTimeSelecter = -1;
	vector<int> queue;
	int *cloneBurstTime = new int[processes];
	//@수정함
	vector<double> responseRatio;
	for (int i = 0; i < processes; i++) {
		//대기시간 초기화
		waitingTime[i] = 0;

		//BusrtTime 클론 생성.
		cloneBurstTime[i] = burstTime[i];
		isInQueue[i] = false;
	}

	while (exitProcessCnt < processes) {
		cout << "time : " << currentTime << endl;;
		//지금 시간대에 누군가 왔을 경우 Q 처리.
		for (int optionProcess = 0; optionProcess < processes; optionProcess++) {
			//해당 프로세스 도착시간이 지났으며, 프로세스 실행 시간이 남아있고, Q안에 존재하지 않을 경우.
			if (_arrivalTime[optionProcess] == currentTime && cloneBurstTime[optionProcess] > 0 && !isInQueue[optionProcess]) {
				isInQueue[optionProcess] = true;
				queue.push_back(optionProcess);
			}
		}

		//Queue의 대기열 상태를 바꿈 ->(WT + BT) / BT 기준.
		//@수정함.
		//생성
		responseRatio.clear();
		for (int queueSwaper = 0; queueSwaper < queue.size(); queueSwaper++) responseRatio.push_back(0);
		//대입
		for (int queueSwaper = 0; queueSwaper < queue.size(); queueSwaper++) {
			responseRatio[queueSwaper] = double(burstTime[queue[queueSwaper]] + waitingTime[queue[queueSwaper]]) / double(burstTime[queue[queueSwaper]]);
		}
		cout << "responseRatio[스왑 전] : ";
		for (int i = 0; i < responseRatio.size(); i++) cout << responseRatio[i] << " ";
		cout << endl;
		cout << "queue[스왑 전] : ";
		for (int i = 0; i < queue.size(); i++) cout << queue[i] << " ";
		cout << endl;
		//스왑
		for (int queueSwaper = 0; queueSwaper < queue.size(); queueSwaper++) {
			for (int queueInSwaper = queueSwaper + 1; queueInSwaper < queue.size(); queueInSwaper++) {
				if (responseRatio[queueSwaper] < responseRatio[queueInSwaper]) {
					double dtemp;
					int itemp;
					dtemp = responseRatio[queueSwaper];
					responseRatio[queueSwaper] = responseRatio[queueInSwaper];
					responseRatio[queueInSwaper] = dtemp;

					itemp = queue[queueSwaper];
					queue[queueSwaper] = queue[queueInSwaper];
					queue[queueInSwaper] = itemp;
				}
			}
		}
		//@여기까지
		cout << "responseRatio[스왑 후] : ";
		for (int i = 0; i < responseRatio.size(); i++) cout << responseRatio[i] << " ";
		cout << endl;
		cout << "queue[스왑 후] : ";
		for (int i = 0; i < queue.size(); i++) cout << queue[i] << " ";
		cout << endl;
		//프로세서 할당
		//대기열에 누군가 있냐 ? 그리고 실행중인 프로세스가 없냐 ?
		if (queue.size() > 0 && runProcess == -1) {
			runProcess = queue[0];
			queue.erase(queue.begin());

			runTimeSelecter++;
			intervalRunTime.push_back(0);
			runSequence.push_back(runProcess);
			isEmptyTime = false;
		}
		//대기열에도 없으면서 실행중이지도 않냐? ==> 공백시간이냐 ?
		else if (queue.size() <= 0 && runProcess == -1 && isEmptyTime == false) {
			runTimeSelecter++;
			intervalRunTime.push_back(0);
			runSequence.push_back(-1);
			isEmptyTime = true;
		}
		cout << "runProcess[실행 도중] : " << runProcess << endl;
		//실행 처리
		//누군가 실행중이냐?
		if (runProcess != -1) {
			//burstTime이 아직 남았냐?
			if (cloneBurstTime[runProcess] > 0) {
				intervalRunTime[runTimeSelecter]++;
				cloneBurstTime[runProcess] --;
				//burstTime이 더 이상 없냐?
				if (cloneBurstTime[runProcess] <= 0) {
					exitProcessCnt++;
					runProcess = -1;
				}
			}
		}
		//공백시간이냐?
		else if (runProcess == -1 && isEmptyTime == true) {
			intervalRunTime[runTimeSelecter]++;
		}

		//대기열에 남은 프로세스가 존재 하냐?(대기시간)
		for (int waitProcess = 0; waitProcess < queue.size(); waitProcess++) {
			waitingTime[queue[waitProcess]] ++;
		}
		//Queue저장.
		queueLine.push_back(queue);

		currentTime++;
		//----------------------------------------출력 부분----------------------------------------------
		cout << "runProcess : " << runProcess << endl;
		cout << "exitProcessCnt : " << exitProcessCnt << endl;

		cout << "runProcessCuurentBurstTime : ";
		for (int i = 0; i < processes; i++) cout << cloneBurstTime[i] << " ";
		cout << endl;

		cout << "queue : ";
		for (int i = 0; i < queue.size(); i++) cout << queue[i] << " ";
		cout << endl;

		cout << "isInQueue : ";
		for (int i = 0; i < processes; i++) cout << isInQueue[i] << " ";
		cout << endl;

		cout << "---------------------" << endl;
	}
	for (int i = 0; i < processes; i++) {
		turnAroundTime[i] = waitingTime[i] + burstTime[i];
		normalizedTurnAroundTime[i] = (double)turnAroundTime[i] / (double)burstTime[i];
	}
	cout << "---processState---" << endl;

	for (int i = 0; i < queueLine.size(); i++) {
		cout << i << " time has waitingRow : ";
		for (int j = 0; j < queueLine[i].size(); j++)
			cout << queueLine[i][j] << " ";
		cout << endl;
	}
	cout << "waitingTime : ";
	for (int i = 0; i < processes; i++) cout << waitingTime[i] << " ";
	cout << endl;

	cout << "turnaroundTime : ";
	for (int i = 0; i < processes; i++) cout << turnAroundTime[i] << " ";
	cout << endl;

	cout << "nomarlizeTurnaroundTime : ";
	for (int i = 0; i < processes; i++) cout << normalizedTurnAroundTime[i] << " ";
	cout << endl;

	cout << "\t" << endl;
	delete[] cloneBurstTime;

코드 : https://github.com/kiJu2/Schduling-Simulator-consoleVer

 

kiJu2/Schduling-Simulator-consoleVer

This is Scheduling-Simulator C++ ver. Contribute to kiJu2/Schduling-Simulator-consoleVer development by creating an account on GitHub.

github.com