라운드 로빈 스케쥴러 시뮬레이션 [C++]
"본문 내용"은 언제나 휴일 본 사이트에 있습니다.
//EHProcess.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class EHProcess
{
string pname; //프로그램 이름
const int tjob; //전체 작업량
const int cjob; //cpu 점유 시 수행가능 최대 작업량
int ntjob; //현재 남은 작업량
int ncjob; //현재 cpu 점유 시 수행가능 최대 작업량
public:
EHProcess(string pname,int tjob,int cjob);
void IdleToReady();//Idle 상태에서 Ready 상태로 전이
int Running();//CPU를 점유하여 실행, 남은 작업량 반환
void EndProgram(); //프로세스 종료
};
//EHProcess.h
#include "EHProcess.h"
EHProcess::EHProcess(string pname,int tjob,int cjob):tjob(tjob),cjob(cjob)
{
this->pname = pname;
}
void EHProcess::IdleToReady()//Idle 상태에서 Ready 상태로 전이
{
cout<<pname<<" 시작"<<endl;
ntjob = tjob; //프로그램 이미지 메모리에 로딩을 표현
}
int EHProcess::Running()//CPU를 점유하여 실행, 남은 작업량 반환
{
ncjob = cjob; //ncjob에 CPU 사용할 수 있는 시간 대입
//남은 작업량(ntjob)과 CPU 사용할 수 있는 시간(ncjob)이 있다면
for( ; ntjob && ncjob ; ntjob--, ncjob--)
{
cout<<pname<<" ";//단위 시간 작업 수행을 표현
}
cout<<endl; //CPU를 반납함을 표현
return ntjob; //남은 작업량 반환
}
void EHProcess::EndProgram() //프로세스 종료
{
cout<<pname<<"종료"<<endl; //프로세스 종료를 표현
}
//Scheduler.h
#pragma once
#include <vector>
#include <queue>
using namespace std;
#include "EHProcess.h"
typedef vector<EHProcess *> Memory;
typedef queue<EHProcess *> ReadyQueue;
typedef Memory::iterator miter;
class Scheduler
{
Memory hard_disk; // 하드디스크
ReadyQueue rq; //대기 큐
public:
Scheduler();
virtual ~Scheduler();
private:
void Init(); //시뮬레이션 초기화- 프로그램 설치 및 실행 명령
void Simulation();//시뮬레이션 시작
void Ending();//시뮬레이션 종료
};
//Scheduler.cpp
#include "Scheduler.h"
Scheduler::Scheduler()
{
Init();
Simulation();
}
void Scheduler::Init()
{
//하드디스크에 프로그램 설치를 표현
hard_disk.push_back(new EHProcess("A",30,5));
hard_disk.push_back(new EHProcess("B",24,6));
hard_disk.push_back(new EHProcess("C",25,4));
miter seek = hard_disk.begin();
miter end = hard_disk.end();
EHProcess *pro=0;
//하드디스크에 설치한 프로그램을 실행 명령을 표현
for( ; seek != end ; ++seek)
{
pro = *seek;
rq.push(pro); //대기 큐에서 기다림
pro->IdleToReady();//Idle 상태에서 Ready상태로 전이
}
}
Scheduler::~Scheduler()
{
Ending();
}
void Scheduler::Ending()
{
miter seek = hard_disk.begin();
for( ; seek != hard_disk.end(); ++seek)
{
delete (*seek);
}
}
void Scheduler::Simulation()
{
EHProcess *process = 0;
int job=0;
while( !rq.empty() ) //대기 큐가 비어있지 않을 때
{
process = rq.front();//가장 먼저 대기한 프로세스를 꺼냄
rq.pop();
job = process->Running();//꺼낸 프로세스를 실행
if(job) //남은 작업이 있다면
{
rq.push(process); //대기큐에서 기다림
}
else
{
process->EndProgram();//프로세스 종료
}
}
}
//Program.cpp
#include "Scheduler.h"
int main()
{
Scheduler *pro = new Scheduler;
delete pro;
return 0;
}
▷ 실행 결과
A 시작
B 시작
C 시작
A A A A A
B B B B B B
C C C C
A A A A A
B B B B B B
C C C C
A A A A A
B B B B B B
C C C C
A A A A A
B B B B B B
B종료
C C C C
A A A A A
C C C C
A A A A A
A종료
C C C C
C
C종료
프로그래밍 언어 및 기술 학습, 무료 동영상 강의 언제나 휴일
'C++ > 디딤돌 자료구조와 알고리즘 with C++' 카테고리의 다른 글
STL list 흉내내서 만들기 [C++] (0) | 2016.06.11 |
---|---|
STL vector 흉내내서 만들기 [C++] (0) | 2016.06.11 |
원형 큐 [C++소스] (0) | 2016.06.11 |
스택 [C++ 소스] (0) | 2016.06.11 |
STL list 사용, 정렬 상태를 유지 (특정 키 순으로 보관) [C++ 소스] (0) | 2016.06.11 |