본문 바로가기
컴퓨터공학기초 개념/시스템 프로그래밍

25. 프로세스 - 우선순위 스케줄링 시스템 콜

by devraphy 2021. 9. 17.

0. 시작하기전에

- 이번 포스팅에서는 프로세스 스케줄링과 관련된 시스템 콜에 대해서 배울 예정이다. 


1. 우선순위 기반 스케줄러 (priority based)

- 우선순위를 기반으로 프로세스의 실행순서를 정하는 스케줄링 방식이다.

 

a) 리눅스는 우선순위에 크게 영향을 받지 않는다. 

- 리눅스는 우선순위에 크게 영향을 받는 스케줄링 방식을 사용하지 않는다.

- 당연히, 우선순위를 확인하고 이에 따라 실행되도록 하는 시스템 콜이 존재하지만, 

 

b) 그렇다면 왜 리눅스는 우선순위 기반의 스케줄링을 지원하는가?

- 리눅스 운영체제 자체가 우선순위에 크게 중점을 두지 않은 방식으로 스케줄링을 하도록 설계되어있다.

- 그렇다면 왜 우선순위 스케줄링의 시스템 콜을 제공할까? 이는 POSIX 규격으로 운영체제를 표준화했기 때문이다. 

 

c) 우선순위 스케줄링의 종류 

▶ 정적 우선순위(static)

- 프로세스마다 우선순위를 미리 지정하는 방식

 

동적 우선순위(dynamic)

- 상황에 따라 프로세스의 실행순서를 변경하는 방식


2. 우선순위 스케줄링의 시스템 콜

a) nice() - 우선순위 변경 시스템콜 

- root가 소요한 프로세스의 우선순위를 높일 수 있다.

- root가 소유하지 않은 프로세스에 대해서는 우선순위를 낮추기만 할 수 있다. 

- 스케줄링 방식에 따라서 우선순위가 기능할 수도, 그렇지 않을 수도 있다.

#include <unistd.h>
int nice(int inc); // 인자로 우선순의를 받는다.

 

b) getpriorty() & setpriorit()

#include <sys/resource.h>
int getpriority(int which, id_t who);
int setpriority(int which, id_t who, int value);

▶ getpriority()

- 어떤 프로세스의 우선순위 값을 가져온다.

 

▶ setprioirt()

- 어떤 프로세스의 우선순위 값을 변경한다.  

 

▶ 인자(parameter)

- int which는 우선순위 값을 가져올 자원을 명시한다. 

- int which에는 PRIO_PROCESS(프로세스), PRIO_GROUP(프로세스 그룹), PRIO_USER(사용자) 중 하나를 입력한다. 

- id_t who에는 우선순위 값을 가져올 해당 프로세스의 PID가 입력된다. 

- id_t who에 0을 입력하면 현재 프로세스의 PID가 입력된다. 

- int value는 변경할 우선순위 값을 입력한다. 

 

 

c) nice(), get/setpriority() 실습예제

#include <sys/resource.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
        int which = PRIO_PROCESS; // 프로세스의 우선순위를 찾는다. 
        id_t pid;
        int ret;

        pid = getpid();
        ret = getpriority(which, 0); // 현재 프로세스의 우선순위를 검색한다.
        printf("PID = %d, PRIORITY = %d\n", pid, ret);

        ret = nice(10); // 우선순위를 10으로 변경한다. 
        ret = getpriority(which, 0);
        printf("PID = %d, PRIORITY = %d\n", pid, ret);

        ret = setpriority(which, 0, 5); // 우선순위를 5로 변경한다.
        ret = getpriority(which, 0);
        printf("PID = %d, PRIORITY = %d\n", pid, ret);
        return 0;
}

 

 

▶ 실행결과 

 

- 우선순위 변경 시스템콜을 실행할 때에는 root 권한이 필요하다. 

- 그러므로 반드시 sudo 키워드와 함께 사용하는 것을 권장한다. 

- 만약 sudo 키워드를 사용하거나 root 사용자로 실행하지 않으면, 우선순위 값이 제대로 변경되지 않을 것이다. 

댓글