NAME

sched_setscheduler, sched_getscheduler - 스케줄링 정책/매개변수 설정하고 얻기

SYNOPSIS

#include <sched.h>

int sched_setscheduler(pid_t pid, int policy,
                       const struct sched_param *param);
int sched_getscheduler(pid_t pid);

DESCRIPTION

sched_setscheduler() 시스템 호출은 pid로 지정한 ID의 스레드를 위한 스케줄링 정책과 매개변수 모두를 설정한다. pid가 0이면 호출 스레드의 스케줄링 정책과 매개변수를 설정하게 된다.

스케줄링 매개변수를 param 인자로 지정하는데, 이는 다음 형태의 구조체의 포인터이다.

struct sched_param {
    ...
    int sched_priority;
    ...
};

현재 구현에서 이 구조체는 sched_priority 필드 하나만 담고 있다. param의 해석 방식은 선택한 정책에 따라 달라진다.

policy에 지정할 수 있는 값으로 현재 리눅스에서는 다음의 "일반" (즉 비실시간) 스케줄링 정책들을 지원한다.

SCHED_OTHER
표준 라운드 로빈 시공유 정책.
SCHED_BATCH
"배치" 방식 프로세스 실행
SCHED_IDLE
아주 낮은 우선순위의 배경 작업 실행

위 정책들 각각에서 param->sched_priority가 0이어야 한다.

실행 가능 스레드들 가운데 실행할 것을 선택하는 방식을 정밀하게 제어해야 하는 특수한 시간 제약적 응용들을 위해 다양한 "실시간" 정책들도 지원한다. 프로세스에서 언제 이 정책들을 사용할 수 있는지에 대한 규칙은 sched(7)를 보라. policy에 지정할 수 있는 실시간 정책들은 다음과 같다.

SCHED_FIFO
선입선출 정책
SCHED_RR
라운드 로빈 정책

위 정책들 각각에서 param->sched_priority가 스레드의 스케줄링 우선순위를 지정한다. 이 값은 지정한 policysched_get_priority_min(2)sched_get_priority_max(2)를 호출해서 반환받은 범위 내의 수이다. 리눅스에서 이 시스템 호출들은 각각 1과 99를 반환한다.

리눅스 2.6.32부터 sched_setscheduler()를 호출할 때 policySCHED_RESET_ON_FORK 플래그를 OR 할 수 있다. 이 플래그를 포함시키면 fork(2)로 생성된 자식이 특권적 스케줄링 정책을 물려받지 않는다. 자세한 내용은 sched(7)를 보라.

sched_getscheduler()pid가 나타내는 스레드의 현재 스케줄링 정책을 반환한다. pid가 0이면 호출 스레드의 정책을 가져오게 된다.

RETURN VALUE

성공 시 sched_setscheduler()는 0을 반환한다. 성공 시 sched_getscheduler()는 스레드의 정책(음수 아닌 정수)을 반환한다. 오류 시 두 호출 모두 -1을 반환하며 오류를 나타내도록 errno를 설정한다.

ERRORS

EINVAL
유효하지 않은 인자: pid가 음수이거나 param이 NULL이다.
EINVAL
(sched_setscheduler()) policy가 알려진 정책이 아니다.
EINVAL
(sched_setscheduler()) 지정한 policy에 대해 param이 말이 되지 않는다.
EPERM
호출 스레드가 적절한 특권을 가지고 있지 않다.
ESRCH
ID가 pid인 스레드를 찾을 수 없다.

CONFORMING TO

POSIX.1-2001, POSIX.1-2008 (하지만 아래 BUGS 참고). SCHED_BATCHSCHED_IDLE 정책은 리눅스 전용이다.

NOTES

위의 "일반" 및 "실시간" 스케줄링 정책들 모두의 더 자세한 의미론을 sched(7) 매뉴얼 페이지에서 찾을 수 있다. 그 페이지에서는 sched_setattr(2)을 통해서만 설정 가능한 SCHED_DEADLINE이라는 정책도 추가로 기술한다.

sched_setscheduler()sched_getscheduler()를 사용할 수 있는 POSIX 시스템에는 <unistd.h>_POSIX_PRIORITY_SCHEDULING이 정의되어 있다.

POSIX.1에서는 비특권 스레드가 sched_setscheduler()를 호출하기 위해 필요한 권한들에 대해 상술하지 않으며, 그래서 시스템에 따라 세부 사항이 다르다. 예를 들어 솔라리스 7 매뉴얼 페이지에서는 호출자의 실제 사용자 ID나 실효 사용자 ID가 대상의 실제 사용자 ID나 저장된 set-user-ID와 일치해야 한다고 한다.

리눅스에서 스케줄링 정책과 매개변수는 사실 스레드별 속성이다. gettid(2) 호출이 반환한 값을 pid 인자로 전달할 수 있다. pid를 0으로 지정하면 호출 스레드의 속성에 대해 동작하게 되고 getpid(2) 호출이 반환한 값을 전달하면 스레드 그룹의 주 스레드의 속성들에 대해 동작하게 된다. (POSIX 스레드 API를 쓰고 있다면 sched_*(2) 시스템 호출 대신 pthread_setschedparam(3), pthread_getschedparam(3), pthread_setschedprio(3)을 사용하라.)

BUGS

POSIX.1에서는 성공 시 sched_setscheduler()가 이전 스케줄링 정책을 반환해야 한다고 한다. 리눅스의 sched_setscheduler()는 이 요구 사항을 준수하지 않는데, 성공 시 항상 0을 반환한다.

SEE ALSO

chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getattr(2), sched_getparam(2)]], sched_rr_get_interval(2), sched_setaffinity(2), sched_setattr(2), sched_setparam(2), sched_yield(2), setpriority(2), capabilities(7), cpuset(7), sched(7)


2021-03-22