C++/디딤돌 자료구조와 알고리즘 with C++

라운드 로빈 스케쥴러 시뮬레이션 [C++]

언제나휴일 2016. 6. 11. 12:01
반응형

라운드 로빈 스케쥴러 시뮬레이션 [C++]


스케쥴러 시뮬레이션.zip





"본문 내용"은 언제나 휴일 본 사이트에 있습니다.


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



프로그래밍 언어 및 기술 학습, 무료 동영상 강의 언제나 휴일

반응형