EHProcess.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class EHProcess
{
string pname; //프로그램 이름
const int tjob; //전체 작업량
const int cjob; //cpu 점유 시 수행가능 최대 작업량
int ntjob = 0; //현재 남은 작업량
int ncjob = 0; //현재 cpu 점유 시 수행가능 최대 작업량
public:
EHProcess(string pname, int tjob, int cjob);
//Idle 상태에서 Ready 상태로 전이
void IdleToReady();
//CPU를 점유하여 실행, 남은 작업량 반환
int Running();
//프로세스 종료
void EndProgram();
};
EHProces.cpp
#include "EHProcess.h"
EHProcess::EHProcess(string pname, int tjob, int cjob) : pname(pname), tjob(tjob), cjob(cjob)
{
}
void EHProcess::IdleToReady()
{
cout << pname << " 시작" << endl;
ntjob = tjob; //프로그램 이미지 메모리에 로딩을 표현
}
int EHProcess::Running()
{
ncjob = cjob; //ncjob에 CPU 사용할 수 있는 시간 대입
//남은 작업량(ntjob)과 CPU 사용할 수 있는 시간(ncjob)이 있다면
for(; ntjob && ncjob ; ntjob--, ncjob--)
cout<<pname<<" "; //단위 시간 작업 수행을 표현
cout << endl;
return ntjob;
}
void EHProcess::EndProgram()
{
cout << pname << "종료" << endl;
}
Scheduler.h
#pragma once
#include <vector>
#include <queue>
using namespace std;
class EHProcess;
typedef vector<EHProcess*> Memory;
typedef queue<EHProcess*> ReadyQueue;
typedef Memory::iterator miter;
class Scheduler
{
Memory hardDisk; // 하드디스크
ReadyQueue rq; //대기 큐
public:
Scheduler();
virtual ~Scheduler();
private:
// 시뮬레이션 초기화- 프로그램 설치 및 실행 명령
void Init();
// 시뮬레이션 시작
void Simulation();
//시뮬레이션 종료
void Ending();
};
Scheduler.cpp
#include "Scheduler.h"
#include "EHProcess.h"
Scheduler::Scheduler()
{
Init();
Simulation();
}
void Scheduler::Init()
{
//하드디스크에 프로그램 설치를 표현
hardDisk.push_back(new EHProcess("A", 30, 5));
hardDisk.push_back(new EHProcess("B", 24, 6));
hardDisk.push_back(new EHProcess("C", 25, 4));
miter seek = hardDisk.begin();
miter end = hardDisk.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 = hardDisk.begin();
for (; seek != hardDisk.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();//프로세스 종료
}
}
main.cpp
#include "Scheduler.h"
int main()
{
Scheduler* pro = new Scheduler;
delete pro;
}
'CS > 자료구조 & 알고리즘' 카테고리의 다른 글
스택 포인터와 프레임 포인터 (0) | 2024.04.16 |
---|---|
에이전트의 정의 (0) | 2024.04.08 |
[C++] lower bound, upper bound (0) | 2023.12.19 |
[C++] 계단 오르기 알고리즘 (0) | 2023.12.18 |
sort() 함수에서 쓰여지는 정렬 알고리즘 (Intro 인트로, Tim 팀) (0) | 2023.12.11 |