일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 강의
- C++
- 표준 라이브러리 함수
- 안드로이드 앱 개발
- 네트워크 프로그래밍
- 프로젝트
- 졸업 작품 소재
- c#
- 동영상 강의
- 클래스 다이어그램
- 충남 천안
- 실습으로 다지는 c#
- 독립기념관
- 소켓 통신
- 원격 제어 프로그램
- 소스 코드
- 언제나 휴일
- 동영상
- 캡슐화
- Windows Forms
- c언어
- 파이썬
- 언제나휴일
- 유튜브 동영상 강의
- 표준 입출력
- 추천
- 산책하기 좋은 곳
- 무료 동영상 강의
- 알고리즘
- 실습
Archives
- Today
- Total
프로그래밍 언어 및 기술 [언제나휴일]
Queue를 이용한 스케쥴러 시뮬레이션 [C++] 본문
안녕하세요. 언제나 휴일에 언휴예요.
이번 실습은 Queue를 이용한 스케쥴러 시뮬레이션입니다.
스케쥴러는 운영체제의 핵심 개체로 누가 CPU를 점유하여 사용할 것인지를 판단하는 역할을 수행합니다.
여기에서는 대기 큐를 이용하는 라운드 로빈 방식의 스케쥴러를 코드로 표현해 볼게요.
보다 자세한 사항은 자료구조와 알조리즘 C++ 3.5 큐를 이용한 스케쥴러 시뮬레이션을 참고하세요.
EHProcess.H
#include
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
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
#include
using namespace std;
#include "EHProcess.h"
typedef vector Memory;
typedef queue 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
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++ 예제 및 소스' 카테고리의 다른 글
[C언어 소스] 연결리스트를 이용하여 구현한 큐 (0) | 2025.01.09 |
---|---|
[C언어 소스] 부분 문자열 비교하는 함수 만들기 (0) | 2025.01.09 |
[C언어 소스] 문자열 길이를 계산하는 함수 만들기 (0) | 2025.01.08 |
파서 트리를 이용한 계산기 [C++] (0) | 2025.01.08 |
함수 개체, 회원 및 회원 컬렉션 구현[C++] (0) | 2025.01.08 |
개체 출력자 실습 – 회원 클래스 및 쉬프트 연산자 중복 정의 [C++] (0) | 2025.01.08 |
다형성 실습 – 오케스트라, 음악가, 피아니스트, 드러머 [C++] (0) | 2025.01.08 |
상품과 할인 상품 – 상속 실습 [C++] (0) | 2025.01.08 |