일요일, 9월 11, 2016

System Project: CPU Scheduling Simulator


1. Introduction
2016년 1학기 운영체제 수업에서 텀프로젝트로 진행했던 CPU Scheduling Simulator이다. 프로세스의 생명주기를 실제와 유사하게 표현하였고, 다양한 스케줄링 알고리즘들을 구현하여 각각의 알고리즘마다 어떤식으로 스케줄링이 이루어지며, 성능은 어떤지 비교분석을 해준다.
원활한 시뮬레이션을 위해 프로세스마다 CPU Burst Time을 예측할 수 있다는 전제를 바탕으로 하며, 조금 더 현실에 가깝게 하기 위해 I/O 작업을 수행하는 프로세스도 구현하였고, 역시 I/O 작업을 수행하는데 걸리는 시간도 예측할 수 있다고 전제하였다.
시뮬레이션을 하기 위한 프로세스의 갯수와, 그 중에서 I/O 작업을 수행할 프로세스의 갯수를 사용자로부터 입력받아서 여러 알고리즘들을 통해 시뮬레이션한 결과를 출력해준다.

2. Demo

3. 개발 환경
Ubuntu 16.04 LTS 환경에서 C언어로 작성하였으며, 컴파일러는 gcc 5.4.0 버전을 사용하였다. 콘솔 기반의 프로그램이기 때문에 입력과 출력이 모두 콘솔상에서 이루어진다.

4. 구현 알고리즘
FCFS (First Come First Served)
- 가장 먼저 Job Queue에 도착한 프로세스가 가장 먼저 수행되는 알고리즘이다.

SJF (Shortest Job First)
- CPU Burst Time이 가장 적게 남은 프로세스가 먼저 수행되는 알고리즘이다. Preemptive와 Non-preemptive 방식 총 두 가지로 구현하였다.

Priority
- 미리 설정된 Priority값을 기준으로 프로세스의 수행 순서를 결정해주는 알고리즘이다. 이 프로그램에서는 Priority값이 낮은 프로세스가 더 우선권을 가진다. SJF 알고리즘과 마찬가지로 Preemptive와 Non-preemtive 방식 두 가지를 모두 구현하였다.

Round Robin
- 시스템에 설정된 Time Quantum을 기준으로 일정 시간마다 수행될 프로세스를 변경해주는 방식이다. Time Quantum이 만약 무한대라면, 특정 프로세스가 먼저 리소스를 점거할 경우 종료가 될 때까지 다른 프로세스들이 수행되지 않기 때문에, FCFS 방식과 동일해진다.

LIF (Longest I/O First)
- I/O 작업을 수행하는 시간이 긴 프로세스가 후반부에 스케줄링될 경우 CPU의 유휴상태가 발생할 확률이 높아진다는 점에 착안하여 가장 I/O Burst Time이 큰 프로세스부터 우선적으로 스케줄링해주는 방식이다. Preemptive / Non-preemptive 방식 둘 다 구현하였다.

LISC (Longest I/O & Shortest CPU First)
- LIF가 CPU Burst Time을 고려해주지 않는다는 단점을 보완하여 CPU Burst Time도 스케줄링에 반영한 알고리즘이다. Preemptive / Non-preemptive 방식 둘 다 구현하였다.

5. 사용법
Github에서 실행파일(CPUScheduler)을 다운받아서 콘솔에서 실행시키면 된다. 이때 인자로 두 개의 정수를 넘겨주어야 하는데, 첫 번째는 전체 프로세스의 갯수, 두 번째는 그중에서 I/O 작업을 수행할 프로세스의 갯수이다. I/O 작업을 수행할 프로세스가 전체 프로세스의 수보다 많을 경우 실행되지 않는다. 나머지 여러 속성들은 프로그램 내에서 자동으로 임의적으로 설정된다.
출력되는 내용이 비교적 긴 편이기 때문에 외부 파일에 출력내용을 저장해서 보는 것을 추천한다. 예를 들어 다음과 같이 콘솔창에 입력하면 된다.
./CPUScheduler 10 3 >> result.txt

6. Source Code
자세한 사항은 Github에서 확인할 수 있다. 전체 소스코드와 실행파일 및 보고서가 포함되어 있다.
https://github.com/arkainoh/CPU-Scheduling-Simulator

댓글 없음:

댓글 쓰기