반응형
EHProcess.h
#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.cpp
#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<<" 총 작업량:"<<tjob<<" CPU 점유시 작업량:"<<cjob<<endl;
ntjob = tjob; //프로그램 이미지 메모리에 로딩을 표현
}
#include <Windows.h>
int EHProcess::Running()//CPU를 점유하여 실행, 남은 작업량 반환
{
cout << pname << " CPU 점유" << endl;
ncjob = cjob; //ncjob에 CPU 사용할 수 있는 시간 대입
for( ; ntjob && ncjob ; ntjob--, ncjob--)
{
Sleep(300);
cout<<ntjob<<" ";//단위 시간 작업 수행을 표현
}
cout <<endl;//CPU를 반납함을 표현
return ntjob; //남은 작업량 반환
}
void EHProcess::EndProgram() //프로세스 종료
{
cout<<pname<<"종료"<<endl; //프로세스 종료를 표현
}
Scheduler.h
//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();
void Simulation();//시뮬레이션 시작
virtual ~Scheduler();
private:
void Init(); //시뮬레이션 초기화- 프로그램 설치 및 실행 명령
void Ending();//시뮬레이션 종료
};
Scheduler.cpp
//Scheduler.h
#include "Scheduler.h"
Scheduler::Scheduler()
{
Init();
}
void Scheduler::Init()
{
//하드디스크에 프로그램 설치를 표현
hard_disk.push_back(new EHProcess("A",20,5));
hard_disk.push_back(new EHProcess("B",23,6));
hard_disk.push_back(new EHProcess("C",18,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
//Program.cpp
#include "Scheduler.h"
#include <conio.h>
int main()
{
Scheduler *sch = new Scheduler;
sch->Simulation();
delete sch;
return 0;
}
실행 결과
A 총 작업량:20 CPU 점유시 작업량:5
B 총 작업량:23 CPU 점유시 작업량:6
C 총 작업량:18 CPU 점유시 작업량:4
A CPU 점유
20 19 18 17 16
B CPU 점유
23 22 21 20 19 18
C CPU 점유
18 17 16 15
A CPU 점유
15 14 13 12 11
B CPU 점유
17 16 15 14 13 12
C CPU 점유
14 13 12 11
A CPU 점유
10 9 8 7 6
B CPU 점유
11 10 9 8 7 6
C CPU 점유
10 9 8 7
A CPU 점유
5 4 3 2 1
A종료
B CPU 점유
5 4 3 2 1
B종료
C CPU 점유
6 5 4 3
C CPU 점유
2 1
C종료
반응형
'C++ > C++ 예제' 카테고리의 다른 글
파서 트리를 이용한 계산기 [C++] (0) | 2020.07.28 |
---|---|
함수 개체, 회원 및 회원 컬렉션 구현[C++] (0) | 2020.07.24 |
개체 출력자 실습 – 회원 클래스 및 쉬프트 연산자 중복 정의 [C++] (0) | 2020.07.22 |
다형성 실습 – 오케스트라, 음악가, 피아니스트, 드러머 [C++] (0) | 2020.07.21 |
상품과 할인 상품 – 상속 실습 [C++] (0) | 2020.07.17 |