대학교에서 운영체제를 처음 수강하면서 잘 이해가 되지 않았지만, 중간고사 공부를 빡세게 하니.. 눈에 조금씩 들어오기 시작한 거 같다.
자료구조와 유닉스 기초를 수강해야 운영체제를 들을 수 있다고 하였지만 '나를 믿어보자'라는 다짐으로 수강하게 되었다
모르면 알아가면 되는 거니까!!
CPU 스케줄링 구현을 C언어로 구현해볼 수 있다는 사실을 알게 되면서 흥미를 가지게 되었다.
교수님 생각으로 어렵다고 생각한 실시간 프로세스, Feedback 스케줄링과 FCFS 스케줄링, Round-Robin 스케줄링을 합친 CPU 스케줄링을 구현해 보려고 한다.
자료구조와 유닉스 기초에 대한 지식은 없지만 차근차근 완성해 볼 계획이다!
만들어볼 CPU 스케줄링에 대한 설명이다.
프로세스의 종류는 실시간 프로세스와 일반 프로세스로 구분된다.
실시간 프로세스는 priority가 음수(-1에서 -10), 일반 프로세스는 양수(1부터 31)이며 실시간 프로세스의 우선순위는 직접적인 의미는 없으며, 시간할당량(time quantum)이 없다.(FCFS)
총 4개의 Queue가 있다.
Queue1은 priority가 1~10, Queue2은 11~20, Queue3는 21~30, Queue4는 31 이다.
priority가 같은 프로세스의 경우 FCFS, 시간할당량(time quantum)은 20이다.
20이내에 종료하지 못하면 priority가 +10으로 변경되어 다음 Queue에 연결된다.
priority가 30을 초과하게 되면 31로 고정한다(최댓값: 31)
Queue4에서는 Round-Robin 방식으로 처리한다.
스케줄링과 프로세스 스위칭 오버헤드는 0으로 가정한다.
우선 프로그램 입력 예제이다.
왼쪽부터 차례대로 type / process_id / priority / computing_time을 의미한다.
type: 0은 프로세스의 생성을 나타낸다.
type: 1은 하나의 프로세스의 시간할당량이 다되어 스케줄이 되어야 함을 나타내며, 나머지 값은 0이 되며, 특멸한 의미는 없다.
type: -1은 입력 완료를 의미한다.
프로그램 출력 예제는 다음과 같다.
출력 예제에서 arrive_time(도착 시간) 정보도 추가하려고 한다.
이렇게 블로그로 구현할 스케줄링을 정리해보니 쉽지 않은 것 같다!
그래도 어떻게든 완성할 것이다(화이팅)
코드는 언제든 수정될 수 있으니 열린 마음으로 봐주었으면 좋겠다..!
우선 프로세스 구조체 선언과 입력 예제를 유사하게 구현하였다
#include <stdio.h>
#define MAX_PROCESSES 100 // 최대 설정프로세스
#define TIME_QUANTUM 20 // 시간 할당량 설정
// 프로세스 구조체 정의
typedef struct {
int type; // 타입: 0: 생성 / 1: 종료(시간할당량 지남) / -1: 입력 완료
int process_id; // 프로세스 구별 id
int priority; // 우선순위
int computing_time; // 서비스 시간
int arrive_time; // 도착시간
int remaining_time; // 시간할당량 지난 후 잔여 시간
}Process;
int main()
{
int num_processes; // 프로세스 개수
Process processes[MAX_PROCESSES]; // 구조체 배열 선언
printf("- 입력\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
// 프로그램 입력
scanf("%d", &processes[i].type);
if (processes[i].type == -1) { // 입력 종료(-1 입력 시)
break;
}
scanf("%d", &processes[i].type);
scanf("%d", &processes[i].priority);
scanf("%d", &processes[i].computing_time);
}
printf("입력완료!\n");
return 0;
}
실행을 하면 다음과 같이 실행이 되고!
-1을 입력을 하게되면
이렇게 실행이 되면서 종료가 된다!
아직 입력까지만 구현했는데 구조체를 처음 다루어 보면서 많이 헤맸다..
그리고 처음에 입력 줄을 한 줄로 입력을 받았더니 type 값을 -1로 주면 다른 값들이 초기화가 되지 않아 오류가 발생하는 문제가 생겨서 삥삥 돌다가 해결방법을 찾게 되었다!
하나씩 입력을 받으면 되었던 것!
2편부터는 구현을 본격적으로 시작할 것이다!