Researcher to Developer

프로세스 스케쥴링 관련 시스템 콜 - nice(), getpriority(), setpriority() 본문

카테고리 없음

프로세스 스케쥴링 관련 시스템 콜 - nice(), getpriority(), setpriority()

Probe29 2021. 1. 2. 17:06

#Priority-Based 스케쥴러 (우선 순위 기반) 종류

 

정적 우선 순위 스케쥴러

프로세스마다 우선 순위를 미리 지정한다.

 

 

동적 우선 순위 스케쥴러

스케쥴러가 상황에 따라 우선 순위를 동적으로 변경한다.

 

 

 

#nice()

우선 순위를 변경하는 시스템 콜

프로세스 중 root가 소유한 프로세스만 우선 순위를 높일 수 있다. root로 실행해야만 가능하다.

다른 프로세스는 우선 순위를 낮출 수만 있다.

스케쥴링 방식에 따라 우선 순위가 적용될 수 도 있고 안될 수 도 있다.

 

nice() 함수 사용의 예는 다음과 같다.

#include <unistd.h>
int nice (int inc);       // inc 값에 우선순위 값을 넣어주면 해당 우선순위를 우선 실행하도록 되어있다.

 

 

#getpriority(), setpriority()

프로세스의 우선 순위 값을 얻어내거나, 프로세스 리소스에 대해 우선 순위 값을 매겨주는 시스템 콜이다.

 

사용 예는 다음과 같다.

#include <sys/resource.h>
int getpriority(int which, id_t who); 
                                      //현재 시스템콜을 실행하고 있는 프로세스의 우선 순위 값을 얻어내는 시스템 콜
int setpriority(int which, id_t who, int value);       
                         //현재 프로세스 또는 프로세스 관련된 리소스에 대해서 우선 순위 값을 매겨주는 시스템 콜

 

id_t who

프로세스 ID를 써줌, 0 이라고 쓰면 현재 프로세스

 

int value 

우선 순위값

 

which 
프로세스(PRIO_PROCESS), 프로세스 그룹(PRIO_PGRP), 사용자(PRIO_USER)별로 
우선순위를 가져올 수 있다.

 

 

다음 예제로 확인해보자

 

priority.c (root 소유로 실행) 파일을 만드려고한다.
이외에 스케줄링 조작 시스템콜 기본 제공(POSIX 기반), 스케줄링 알고리즘 변경으로 사용은 어려움

#include <sys/resource.h>
int which = PRIO_PROCESS;
id_t pid;
int ret;
pid = getpid();
ret = getpriority(which, pid);

 

코드는 다음과 같다.

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

int main() {
      int which = PRIO_PROCESS;       // which 값을 PRIO_PROCESS 값으로 정의하고
      id_t pid;    // pid 값을 받을 수 있는 변수와 ret 값을 받을 수 있는 변수를 선언하고
      int ret;

      pid = getpid();                                       // pid 를 가져오는 함수
      ret = getpriority(which, 0);                        // PRIO_PROCESS에 0 을 넣어주면 현재 프로세스
      printf("PID=%d, PRIORITY=%d\n", pid, ret);
      ret = nice(10);                                        // nice 시스템 콜에 10을 넣어서 우선 순위 값을 10으로 설정하고
      ret = getpriority(which, 0);                         // 설정이 되었는지 get으로 확인
      printf("PID=%d, PRIORITY=%d\n", pid, ret);

      ret = setpriority(which, 0, 5);                     //현재 프로세스의 우선 순위를 5로 설정
      ret = getpriority(which, 0);                        // 설정이 되었는지 get으로 확인
      printf("PID=%d, PRIORITY=%d\n", pid, ret);    
      return 0;
}


결과창에서는


PID = 18720, PRIORITY = 0
PID = 18720, PRIORITY = 10
PID = 18720, PRIORITY = 5

 

이렇게 출력된다.