3.5 큐를 이용한 스케쥴러 시뮬레이션 [소스 코드]

다음은 앞에서 작성한 스케쥴러 시뮬레이션 코드입니다.

//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종료