리눅스 커널 소스 해설3 [스케쥴러]
"리눅스 커널 소스 해설3 [스케쥴러]"는 전세계적으로 가장 많은 컴퓨터 기기에서 사용되고 있는 컴퓨터 운영체제인 리눅스 커널의 스케쥴러 소스를 자세히 설명하는 책입니다. 리눅스 커널 소스는 오픈소스로 누구나 접근할 수 있지만, 소스의 복잡성과 난해함 때문에 이것을 쉽게 설명하는 기술서가 많이 부족합니다. 커널연구회는 수년간 꾸준히 리눅스 커널 소스를 분석하여 쉽게 설명하는 기술서를 출판해오고 있으며, 관련 업계에 종사하는 엔지니어들에게 도움을 드리고 있습니다. 이번에 리눅스 커널중에서 가장 중요한 역할을 하는 스케쥴러 소스를 분석하여 자세히 설명하는 해설서를 다음과 같은 내용으로 출판하게 되었습니다.
책내용 요약
• 스케쥴러 전체 개요
• sched_class 구조체
• sched_init() 함수
• 스케쥴 도메인과 그룹
• Stop Scheduler
• DeadLine Scheduler
• RealTime Scheduler
• Fair Scheduler(CFS)
• Idle Scheduler
• activate/deactive_task()
• schedule 실행 과정
• 태스크 동작상태(State)
• CPU Load Average
• PELT(Per Entity Load Tracking)
• PELT, CFS 스케쥴링 테스트
• CPU Load Balancing
• CFS Bandwidth
• NO_HZ
• WorkQueue
책정보
• 리눅스 커널 소스 해설3 [스케쥴러]
• 저자 정재준
• 발행인: 정재준
• 발행처: 커널연구회
• 출판사등록번호: 제2011-75호
• 출판사등록일: 2011년 09월 27일
• 전화: 031-592-0478 / 팩스: 031-594-5307
• 발행일: 2022년 09월 20일
• ISBN: 978-89-97750-16-0
• 페이지수: 425
• 가격: 3만3천원
• 책크기: 가로 188mm X 세로 257mm (B5)
책서두
스케쥴링은 어떻게 해야 하는가? 일상생활에 영어가 많이 들어와 있어서 “스케쥴링”을 우리말로 해석하려 하면 오히려 부자연스러울 수 있습니다만, 스케쥴링은 우리말로 “일정관리” 혹은 “작업관리” 라고 할 수 있습니다. 일정(작업)관리는 우리가 생활속에서 하는 것이기 때문에 이 표현이 오히려 쉽게 다가 옵니다. 우리는 항상 “나의 일감들을 어떻게 관리하고 실행하는 것이 좋을까?” 고민 하면서 최적의 효율로 최대 효과가 나오도록 실천 합니다. 더구나 일감들이 너무 많아서 혼자 관리하기 힘들면 일감의 종류와 특성별로 전담하는 관리자(매니저)들을 고용 하기도 합니다. 컴퓨터도 우리와 같은 고민을 합니다. 특히 리눅스 커널은 컴퓨터 성능이 발전 하면서 발생하는 여러가지 일감들을 최대한 효율적으로 관리하기 위해서 스케쥴러를 고용 했습니다. 커널 스케쥴러 입장에서는 일감을 임무(태스크: task)로 정의하여 관리 합니다. 앞으로 우리는 리눅스 커널 스케쥴러와 친하게 소통해야 하므로 일감을 태스크(task)라고 하겠습니다. 그리고 커널은 태스크들을 특성별로 좀더 효율적으로 관리하기 위해서 맞춤형 스케쥴러들을 고용 했습니다.
우리는 일상 생활속에서 일감들을 스케쥴링하는 것을 고민하며 살고 있기 때문에, 이 고민을 리눅스 커널 스케쥴러들과 같이 한다면 좀더 쉽게 태스크를 스케쥴링하는 방법들을 이해할 수 있을 것입니다. 더구나 커널 스케쥴러는 오히려 우리보다 더 좋은 방향으로 스케쥴링을 하고 있어서 한 수 배울 수도 있고, 반대로 우리가 스케쥴러를 잘 알고 있어서 좀더 좋은 방법을 가르쳐 줄 수도 있습니다.
목차
Table of Contents
• 리눅스 커널 소스 해설3 [스케쥴러] 1
• 저작권 2
ISBN 3
저자 소개 4
• 머리말 7
• 목차 9
• 스케쥴러 전체 개요 18
스케줄러 설정(set scheduler) 25
스케쥴러 실행(schedule) 27
• sched_class 구조체 34
stop_sched_class 37
dl_sched_class 38
rt_sched_class 39
fair_sched_class 40
idle_sched_class 42
스케쥴러 중요 함수 실행 흐름 43
• sched_init() 함수 45
sched_init() 구조체 할당 48
sched_init() 구조체 연결 54
sched_create_group() 함수 57
• 스케쥴 도메인과 그룹 67
SMP와 NUMA 시스템 67
sched_init_smp() 함수 74
sched_init_numa() 함수 75
sched_init_domains() 함수 84
• Stop Scheduler 93
sched_set_stop_task() 함수 94
enqueue_task_stop() 함수 95
set_next_task_stop() 함수 96
pick_next_task_stop() 함수 96
dequeue_task_stop() 함수 97
put_prev_task_stop() 함수 97
balance_stop() 함수 98
• DeadLine Scheduler 99
sched_setattr() 함수 102
enqueue_task_dl() 함수 106
set_next_task_dl() 함수 110
pick_next_task_dl() 함수 111
dequeue_task_dl() 함수 112
put_prev_task_dl() 함수 113
DeadLine 스케쥴링 요약 114
select_task_rq_dl() 함수 118
balance_dl() 함수 119
• RealTime Scheduler 120
enqueue_task_rt() 함수 125
set_next_task_rt() 함수 130
pick_next_task_rt() 함수 131
dequeue_task_rt() 함수 134
put_prev_task_rt() 함수 135
RealTime 스케쥴링 요약 136
switched_from_rt() 함수 140
switched_to_rt() 함수 141
select_task_rq_rt() 함수 142
balance_rt() 함수 143
• Fair Scheduler(CFS) 144
enqueue_task_fair() 함수 146
set_next_task_fair() 함수 149
pick_next_task_fair() 함수 149
dequeue_task_fair() 함수 156
put_prev_task_fair() 함수 158
switched_from_fair() 함수 159
switched_to_fair() 함수 160
select_task_rq_fair() 함수 161
balance_fair() 함수 164
• Idle Scheduler 165
set_next_task_idle() 함수 166
pick_next_task_idle() 함수 167
dequeue_task_idle() 함수 167
• activate/deactive_task() 함수 169
activate_task() 함수 169
deactivate_task() 함수 170
wake_up_new_task() 함수 172
wake_up_process() 함수 173
list_add_leaf_cfs_rq() 함수 174
• schedule 실행 과정 176
PREEMPT 선택 176
schedule() 함수 호출 흐름 182
_TIF_NEED_RESCHED 플래그 183
scheduler_tick() 함수 187
task_tick_fair() 함수 189
task_tick_rt() 함수 191
check_preempt_curr() 함수 193
pick_next_task() 함수 197
• 태스크 동작상태(State) 199
TASK_NEW 201
EXIT_DEAD 201
TASK_RUNNING 202
TASK_INTERRUPTIBLE 203
TASK_UNINTERRUPTIBLE 206
기타 상태값 207
• CPU Load Average 209
이동평균(Moving Average) 209
CPU Load Average 산출식 211
calc_global_load_tick() 함수 214
calc_global_load() 함수 215
calc_load() 함수 218
• PELT(Per Entity Load Tracking) 223
decay_load() 함수 224
___update_load_sum() 함수 230
accumulate_sum() 함수 231
___update_load_avg() 함수 235
__update_load_avg_se() 함수 236
__update_load_avg_cfs_rq() 함수 237
Load 계산 과정 요약 238
• PELT 계산 전체 흐름 240
post_init_entity_util_avg() 함수 243
activate_task() 함수 245
• PELT 계산 함수들 249
update_load_avg() 함수 249
__update_load_avg_*() 함수 251
propagate_entity_load_avg() 함수 252
update_load_avg() 함수 전체 요약 256
attach_entity_cfs_rq() 함수 258
attach_entity_load_avg() 함수 258
update_tg_load_avg() 함수 261
propagate_entity_cfs_rq() 함수 263
attach_entity_cfs_rq() 전체 요약 265
enqueue_task_fair() 함수 269
update_curr() 함수 270
update_cfs_group() 함수 272
enqueue_runnable_load_avg() 함수 276
account_entity_enqueue() 함수 277
__enqueue_entity() 함수 277
enqueue_task_fair() 전체 요약 279
• PELT, CFS 스케쥴링 테스트1 283
task_group 생성 284
task 생성 286
schedule 테스트 291
• PELT, CFS 스케쥴링 테스트2 300
첫번째 태스크 attach 301
첫번째 태스크 enqueue 303
두번째 태스크 attach 307
두번째 태스크 enqueue 309
세번째 태스크 attach 313
세번째 태스크 enqueue 316
스케쥴링 테스트 320
네번째 태스크 attach 322
네번째 태스크 enqueue 325
• PELT, CFS 스케쥴링 테스트3 330
첫번째 태스크 attach 331
첫번째 태스크 enqueue 336
두번째 태스크 attach 342
두번째 태스크 enqueue 345
세번째 태스크 attach 347
세번째 태스크 enqueue 350
네번째 태스크 attach 352
네번째 태스크 enqueue 356
• CPU Load Balancing 358
rebalance_domains() 함수 360
load_balance() 함수 362
find_busiest_group() 함수 365
find_busiest_queue() 함수 368
• CFS Bandwidth 370
cfs_bandwidth 구조체 372
전체흐름 요약 374
tg_set_cfs_bandwidth() 함수 377
init_cfs_bandwidth() 함수 379
do_sched_cfs_period_timer() 함수 382
distribute_cfs_runtime() 함수 383
unthrottle_cfs_rq() 함수 384
throttle_cfs_rq() 함수 385
• NO_HZ 387
NO_HZ_IDLE 388
NO_HZ_FULL 389
NO_HZ Kconfig 옵션 389
NO_HZ 관련 소스 391
• WorkQueue 394
queue_work 395
DECLARE_WORK 예제 395
workqueue 구조체 정리 400
queue_work() 실행 과정 402
workqueue_init 404
workqueue_init_early() 소스 설명 405
workqueue_init() 소스 설명 409
worker_thread 411
• 부록 415
2022년 08월 [v5.19] 커널 버전 비교 415
v5.4와 v5.19 전체 비교 416
CPU 아키텍쳐 소스 비교 417
스케쥴러 소스 비교 418
메모리 소스 비교 420
CONFIG_SCHED_CORE 421
리눅스 커널 소스 해설3 [스케쥴러]