Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

41111
637
415417


[리눅스커널] 스케줄링: 우선순위(nice)란 10. 프로세스 스케줄링

nice는 유저 공간에서 설정한 프로세스 실행 우선 순위를 뜻합니다. 정수형인 nice 범위는 -20~19인데 이 값은 커널 공간에서 100~139 사이 값으로 변환되어 관리합니다.

이해를 돕기 위해 다음 그림을 함께 봅시다.
 

유저 공간에서 설정한 nice 값의 범위는 -20~19인데 커널 공간에서 100~139 사이 우선 순위로 변환됩니다. 커널 공간에서 RT 스케줄러 클래스에 등록한 RT 프로세스 우선 순위 범위는 0~99이고, CFS 스케줄러 클래스에서 구동하는 일반 프로세스 우선 순위 범위는 100~139입니다.

위 그림에서 유저 공간 Normal와 커널 공간 Normal 우선순위 사이에 NICE_TO_PRIO() 함수를 볼 수 있습니다. NICE_TO_PRIO() 함수는 유저 공간에서 설정된 nice값 커널에서 관리하는 우선 순위로 바꿉니다.

NICE_TO_PRIO() 함수는 다음 공식으로 nice를 커널 우선 순위로 변환합니다.
static_prio = 120 + nice

이해를 돕기 위해 NICE_TO_PRIO() 소스 코드를 소개합니다.
[https://elixir.bootlin.com/linux/v4.14.70/source/include/linux/sched/prio.h]
1 #define NICE_TO_PRIO(nice) ((nice) + DEFAULT_PRIO)
2
3 #define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2)
4 #define MAX_USER_RT_PRIO 100
5
6 #define MAX_NICE 19
7 #define MIN_NICE -20
8 #define NICE_WIDTH (MAX_NICE - MIN_NICE + 1)

1 번째 줄은 NICE_TO_PRIO() 매크로 선언부이고, 3~8 번째 줄은 NICE_TO_PRIO() 매크로를 계산할 때 필요한 정보입니다.

이 정보를 활용해서 다음과 같이 단계별로 "((nice) + DEFAULT_PRIO)" 수식을 풀어가면 결과 수식은 "nice + 120"임을 알 수 있습니다.
((nice) + DEFAULT_PRIO)
((nice) + (MAX_RT_PRIO + NICE_WIDTH / 2))
((nice) + (100 + NICE_WIDTH / 2))
((nice) + (100 + (MAX_NICE - MIN_NICE + 1) / 2))
((nice) + (100 + (19 - (-20) + 1) / 2))
((nice) + (100 + (19 +20 + 1) / 2))
((nice) + (100 + (40) / 2))
((nice) + (100 + (20))
((nice) + (120))

우선 순위 별로 RT 프로세스와 일반 프로세스로 분류할 수 있습니다. 각각 특징을 알아보면 다음과 같습니다.

RT 프로세스
0~99 사이 우선권을 갖고 있습니다.
일반 프로세스에 비해 높은 우선권으로 실행하므로 빠르고 신속히 처리하도록 구현해야 합니다.

스케줄러 정책은 SCHED_FIFO 이며 우선 순위가 더 높은 RT 프로세스가 없으면 계속 CPU를 점유해 사용합니다. 런큐 내 서브 런큐 중 RT 프로세스를 관리하는 RT 프로세스 런큐가 있으며 struct rt_rq 구조체로 구현돼 있습니다.

일반 프로세스
100~139 사이 우선권을 갖고 있습니다. CFS 스케줄러 클래스로 실행되며 대부분 프로세스가 이 범주에 속해 있습니다.

CFS 스케줄러 정책에 따라 SCHED_NORMAL 스케줄링 정책으로 CFS 스케줄러는 시분할 방식으로 프로세스를 관리합니다. 

이번 절에서는 스케줄링이 무엇이고 커널에서 이를 어떤 방식으로 구현하는지에 대해서 소개했습니다. 다음 절에서는 프로세스 상태 기준으로 커널이 어떻게 스케줄링을 수행하는지 살펴보겠습니다.


"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)

Reference(프로세스 스케줄링)

스케줄링 소개
프로세스 상태 관리
   어떤 함수가 프로세스 상태를 바꿀까?
스케줄러 클래스
런큐
CFS 스케줄러
   CFS 관련 세부 함수 분석  
선점 스케줄링(Preemptive Scheduling)   
프로세스는 어떻게 깨울까?
스케줄링 핵심 schedule() 함수 분석
컨택스트 스위칭
스케줄링 디버깅
   스케줄링 프로파일링
     CPU에 부하를 주는 테스트   
     CPU에 부하를 주지 않는 테스트


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2





 

핑백

덧글

  • david 2022/07/11 13:22 # 삭제 답글

    nice 명령을 이용해 batch job 2개를 던지면
    1. batch job nice 0
    2. batch job nice 15

    라고 명령을 순차적으로 주면
    2번 batch는 1번 batch가 끝날때까지 기다렸다가 실행되나요!?
  • AustinKim 2022/07/16 14:58 #

    그렇게 동작하진 않습니다. 커널에서 더 높은 우선 순위를 지닌 프로세스가 있으면 2번 batch가 실행된 다음에 다른 프로세스가 실행될 수 있습니다.
댓글 입력 영역