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
가 스레드의 스케줄링 우선순위를 지정한다. 이 값은 지정한 policy
로 sched_get_priority_min(2)과 sched_get_priority_max(2)를 호출해서 반환받은 범위 내의 수이다. 리눅스에서 이 시스템 호출들은 각각 1과 99를 반환한다.
리눅스 2.6.32부터 sched_setscheduler()
를 호출할 때 policy
에 SCHED_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_BATCH
및 SCHED_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