개요
운영체제 전공에서 시스템 콜을 활용하여 진행하는 과제가 생겼습니다. 과제를 해결하면서 학습했던 지식들을 짧게 나마 정리해보고자 합니다.
1. 커널의 스케쥴링 정책
리눅스 커널은 CFS (Completely Fair Scheduling) 을 사용하고 있습니다.
과제에서 요구하고 있는 사항은 다음과 같습니다.
리눅스 커널의 스케줄링 정책을(CFS, RT_FIFO, RT_RR) 변경하면서 프로세스들의 실행 순서 및 실행 시간을 확인할 수 있는 프로그램 작성
총 네개의 스케쥴링 정책 (CFS_DEFAULT, CFS_NICE, RT_FIFO, RT_RR) 중 하나를 입력 받아 해당 스케쥴링 정책을 적용하는 프로세스 21개를 생성 후 실행 시간을 출력하는 것이 과제의 목표입니다.
우선 스케쥴링 정책을 어떻게 바꿀까요?
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
Java
복사
다음 명령어를 통해 바꿀 수 있습니다.
CPU Core 중 하나만 사용하게 하는 명령어
Kernel Boot Parameter 변경:
•
GRUB (GRand Unified Bootloader)를 사용하는 경우:
1.
/etc/default/grub 파일을 편집합니다.
2.
GRUB_CMDLINE_LINUX 항목을 찾아서 maxcpus=1을 추가합니다.
makefileCopy code
GRUB_CMDLINE_LINUX="... maxcpus=1"
Makefile
복사
3.
설정을 저장하고 sudo update-grub을 실행합니다.
4.
시스템을 재부팅합니다.
sudo -s는 필수
Time Slice 값 변경 명령어
cat /proc/sys/kernel/sched_rr_timeslice_ms
Timeslice 값을 어떻게 가져왔는가?
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("/proc/sys/kernel/sched_rr_timeslice_ms", "r");
if (fp == NULL) {
perror("Error opening file");
return EXIT_FAILURE;
}
int timeslice;
if (fscanf(fp, "%d", ×lice) != 1) {
perror("Error reading timeslice");
fclose(fp);
return EXIT_FAILURE;
}
printf("Current RR time quantum: %d ms\n", timeslice);
fclose(fp);
return 0;
}
Java
복사