2019. 6. 5. 23:36ㆍ임베디드/리눅스시스템프로그래밍
자세한 내용은 man-page를 참고하도록 한다
http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html
함수원형은 int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param)
이 함수는 리눅스 커널에서 제공하는 프로세스 스케줄링 알고리즘을 원하는 프로세스에 적용시킬 수 있다
The sched_setscheduler() system call sets both the scheduling
policy and parameters for the thread whose ID is specified in
pid. If pid equals zero, the scheduling policy and parameters
of the calling thread will be set.
The scheduling parameters are specified in the param argument,
which is a pointer to a structure of the following form:
struct sched_param {
...
int sched_priority;
...
};
In the current implementation, the structure contains only one
field, sched_priority. The interpretation of param depends on
the selected policy.
pid를 0으로 하면 함수를 호출한 현재 프로세스에 적용이 된다. 그리고 우선순위는 strcut sched_param의 sched_priority를 바꿔서 넣어줄 수 있다. 단, sched_priority는 스케줄링 정책에 의해 의존적인 변수임을 유의해야 한다
Currently, Linux supports the following "normal" (i.e., non-
real-time) scheduling policies as values that may be specified
in policy:
SCHED_OTHER the standard round-robin time-sharing policy;
SCHED_BATCH for "batch" style execution of processes; and
SCHED_IDLE for running very low priority background jobs.
For each of the above policies, param->sched_priority must be 0.
일반 스케줄링 기법으로 일반 태스크에 적용시킬 수 있다. 이 기법을 쓸때엔 반드시 sched_prioirty는 0으로 해야만 한다
Various "real-time" policies are also supported, for special
time-critical applications that need precise control over the
way in which runnable threads are selected for execution. For
the rules governing when a process may use these policies, see
sched(7). The real-time policies that may be specified in pol‐
icy are:
SCHED_FIFO a first-in, first-out policy; and
SCHED_RR a round-robin policy.
For each of the above policies, param->sched_priority specifies
a scheduling priority for the thread. This is a number in the
range returned by calling sched_get_priority_min(2) and
sched_get_priority_max(2) with the specified policy. On Linux,
these system calls return, respectively, 1 and 99.
Since Linux 2.6.32, the SCHED_RESET_ON_FORK flag can be ORed in
policy when calling sched_setscheduler(). As a result of
including this flag, children created by fork(2) do not inherit
privileged scheduling policies. See sched(7) for details.
실시간 스케줄링 기법으로 간략하게 설명하면, SCHED_FIFO는 가장 높은 우선순위를 가진 프로세스가 리드를 하면서 CPU를 선점하게 된다. 따라서 우선순위가 가장 높은 프로세스가 가장 긴 타임 슬라이스를 가진다. IO 서비스나 다른 요청이 올때 이를 처리하고 바로 돌아오게 된다. SCHED_RR는 같은 우선순위상의 있는 프로세스들이 같은 타임슬라이스를 갖는 스케줄링 기법이다. 만일 같은 우선순위를 갖는 프로세스가 없다면 SCHED_FIFO로 동작하게 된다
이 기법을 사용할 땐, sched_priority는 1에서 99까지 설정될 수 있다. 리눅스 커널 2.6버전 이후부터는 flag에 SCHED_RESET_ON_FORK을 적용할 수 있는데 이는 자식프로세스가 부모프로세스의 스케쥴링 정책을 따르지 않겠다는 의미다
'임베디드 > 리눅스시스템프로그래밍' 카테고리의 다른 글
wrapper 함수란 (0) | 2019.06.07 |
---|---|
파일 소유에서의 root 사용자와 로그인 사용자 구분 (0) | 2019.06.06 |
fork 후 _exit를 반드시 해야하는 이유 (0) | 2019.06.04 |
.bashrc와 .bash_profile의 차이 (0) | 2019.06.04 |
SysV Message Queue (0) | 2019.06.02 |