본문 바로가기

C/C++

C언어 > CPU 스케줄링 프로그램 구현(Feedback + FCFS + Round-Robin) - 1

대학교에서 운영체제를 처음 수강하면서 잘 이해가 되지 않았지만, 중간고사 공부를 빡세게 하니.. 눈에 조금씩 들어오기 시작한 거 같다.

자료구조와 유닉스 기초를 수강해야 운영체제를 들을 수 있다고 하였지만 '나를 믿어보자'라는 다짐으로 수강하게 되었다

모르면 알아가면 되는 거니까!!

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편부터는 구현을 본격적으로 시작할 것이다!