๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš— Major Study (Bachelor)/๐ŸŸง Operating System

[OS /์šด์˜ ์ฒด์ œ] Thread Scheduling, Contention Scope, Pthread Scheduling, Linux Scheduler, Linux CFS Scheduler, Windows Scheduling, Process Synchronization, Critical Section, Progress

by UKHYUN22 2022. 4. 28.
728x90

 

Thread Scheduling

Kernel Thread๊ฐ€ Scheduling์˜ ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค. PCB์— ๋ฉ”๋‹ฌ๋ ค ์žˆ๋Š” LWP๊ฐ€ ์žˆ๋‹ค. LWP์™€ Thread๋Š” One to one correspondence๊ฐ€ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ Kernel์— ํ•ด๋‹นํ•˜๋Š” LWP๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์‹ค์ œ ์Šค์ผ€์ค„๋ง์€ LWP ๋‹จ์œ„๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

 

 

Contention Scope

PCS์™€ SCS๊ฐ€ ์žˆ๋‹ค. Scheduling์€ kernel์—์„œ ์ด๋ฃจ์–ด์ง€๊ณ  (CPU๋ฅผ Kernel Thread๋กœ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ฒƒ) ์ด๋•Œ ๊ฒฝ์Ÿ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ ์ด๋•Œ๋ฅผ SCS๋ผ๊ณ  ํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ Process ์•ˆ์—์„œ์˜ ๊ฒฝ์Ÿ์ด๋‹ค. User Process ์•ˆ์—์„œ์˜ ๊ฒฝ์Ÿ์ด PCS๋ผ๊ณ  ํ•œ๋‹ค. 

 

 

Pthread Scheduling

pthread_attr_init์œผ๋กœ default setting์„ ํ•œ๋‹ค. getscope๋ฅผ ํ•˜๋ฉด attr์˜ ์ •๋ณด๋ฅผ ๊บผ๋‚ด์„œ scope๋กœ ๊ฐ€์ ธ๋‹ค ์ฃผ๊ฒŒ ๋œ๋‹ค. scope์˜ ๊ฐ’์€ ๋‘ ๊ฐ€์ง€ Constant์˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. PTHREAD SCOPE SYSTEM์€ user level์˜ scheduling์„ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค. attr ๊ฐ’์—๋‹ค๊ฐ€ SCOPE๊ฐ’์„ ์ง‘์–ด๋„ฃ๊ฒŒ ๋œ๋‹ค. create๋ฅผ ํ•˜๋ฉด attr๋Œ€๋กœ tid๋ฅผ ๋งŒ๋“œ๋ ค๊ณ  ๋…ธ๋ ฅ์„ ํ•œ๋‹ค. one to one model์€ user level thread library๊ฐ€ ์—†๋‹ค. ์ž์‹ ์˜ Thread ๋ชจ๋ธ์ด ์ง€์›์„ ํ•˜๋ฉด ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ  ์ง€์›ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฌด์‹œํ•˜๊ฒŒ ๋œ๋‹ค. setscope๋Š” ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋„ฃ์—ˆ์„ ๋•Œ ์ ์šฉ์ด ๋œ๋‹ค.

 

JUMP

 

Operating System Example

 

Linux Scheduler

kernel version์ด 2.5์•„๋ž˜์˜€๋‹ค. SMP๋ฅผ ์ž˜ ์ง€์›ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์ดํ›„์— ๋‚˜์˜จ Big Oh (1)์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ๋“ฑ์žฅํ–ˆ๋‹ค. Scheduler๊ฐ€ Constant Time์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ์Šค์ผ€์ค„๋ง์„ ์ง€์›ํ•ด์คฌ๋‹ค. 2.6 ๋ฒ„์ „๋ถ€ํ„ฐ CFS๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

Linux Scheduler

Real-time scheduling์€ ์ œ์ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ๋“ค์ด๋‹ค. Real time์€ 0์—์„œ 99๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ž๊ธฐ๋ณด๋‹ค ๋‚ฎ์€ ์นœ๊ตฌ๋Š” ๋จผ์ € ๋“ค์–ด๊ฐ„๋‹ค. SCHED_FIFO ์ž๊ธฐ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์€ ๋…€์„์ด ๋Œ๊ณ ์žˆ์œผ๋ฉด ์ž๊ธฐ๊บผ๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค. Nonpreemtive์ด๊ณ  ๋‚˜๋Š” Preemtive์ธ๋ฐ ์ƒ๋Œ€๋ฐฉ์€ ๋‚˜ํ•œํ…Œ Nonpreemtiveํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. SCHED_RR(Round Robin์€ ์ตœ๋Œ€ ์‹œ๊ฐ„์˜ ์ œํ•œ์ด ์žˆ๊ฒŒ ๋œ๋‹ค) ์ผ์ • ์‹œ๊ฐ„ ์ดํ›„์—๋Š” ์–‘๋ณดํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค. Preemtiveํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ด€์ ์—์„œ FIFO์™€ RR์˜ ๊ณตํ†ต์ ์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

 

Linux CFS Scheduler

task๋งˆ๋‹ค nice value๋ผ๋Š” ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. nice value๋Š” ์ผ์ข…์˜ ์ƒ๋Œ€์ ์ธ ๊ฐ’์ด๋‹ค. User๊ฐ€ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. External Priority์™€ Internal Priority๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์—ˆ๋‹ค. ์ด๋Š” Expernal Priority์ด๋‹ค. Nice๋ฅผ ๋†’์ด๋ฉด ์ƒ๋Œ€์ ์ธ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ณ  Nice ๊ฐ’์„ ์ค„์ด๋ฉด ์ƒ๋Œ€์ ์ธ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. 

 

Target latency ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Completely๋ผ๊ณ  ํ‘œํ˜„์„ ํ•œ๋‹ค. min ๊ฐ’๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ˜„์žฌ task๊ฐ€ ๋งŽ์•„์ง€๋ฉด target latency๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์ด ๊ฐ’์€ ์ฒ˜์Œ์— ์ฃผ์–ด์ง€์ง€๋งŒ task์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

Linux CFS Scheduler

vruntime value๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ’์˜ ๊ณฑ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค. Physical runtime์— decay factor ๊ฐ’์„ ๊ณฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. Normal priority๋Š” ๊ณฑํ•˜๋‚˜ ๋งˆ๋‹ค ํ•œ 1์˜ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฐ’๋“ค์€ Decay factor๋ฅผ ์ค„์ด๊ฒŒ ๋œ๋‹ค. schedulingํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. 

 

 

Linux CFS Scheduler

IO Bound process๋Š” IO์ชฝ์œผ๋กœ ๊ฐ€๋ฏ€๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค.

CPU Bound Process๋Š” vruntime ๊ฐ’์ด ํฐ ๊ฒƒ์ด ๋œ๋‹ค. vruntime์ด ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ํƒํ•˜๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๊ฒŒ ๋œ๋‹ค.

 

 

Windows Scheduling

Dispatcher๊ฐ€ ํ•œ๋‹ค๊ณ  ์–˜๊ธฐ๋ฅผ ํ•œ๋‹ค. ์œˆ๋„์šฐ๋Š” ์ˆซ์ž๊ฐ€ ๋†’์€ ๊ฒƒ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ฒด์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

Priority class๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. IDLE Process๋Š” ๋†€๊ณ  ์žˆ๋Š” CPU์—๊ฒŒ ๋นˆ Process๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ค€ ๊ฒƒ์ด๋‹ค. ๋™์ผํ•œ ํด๋ž˜์Šค์—์„œ๋„ Prioriry๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋ฅผ relative priority๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. real time์ด ๋“ค์–ด๊ฐ”๋‹ค๊ณ  ํ•˜๋ฉด ์ผ๋‹จ ๋†’๋‹ค... 

 

 

Windows Scheduling

setPriorityClass(), setThreadPriority()

IO bound process์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ด๊ณ  CPU Bound Process์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. quantum์„ ์ „์ฒด ๋‹ค ์ผ๋‹ค ํ•˜๋ฉด CPU Bound Process์ด๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. wait process๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ•˜๋ฉด IO Bound Process์ด๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ธ๋‹ค. time quantum์˜ ๊ธธ์ด๋ฅผ 3๋ฐฐ ์ •๋„ ๋Š˜๋ฆฌ๊ฒŒ ๋œ๋‹ค. 

 


 

 

Background

๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ~~ ์ด ๊ทธ๋ฆผ์—์„œ Buffer๊ฐ€ shared memory๊ฐ€ ๋œ๋‹ค. Producer์™€ Consumer๊ฐ€ Process์ด๋ฉด Buffer๊ฐ€ shared memory์—ฌ์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ Thread์ธ ๊ฒฝ์šฐ Global ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

Concurrent Access of Shared Data

์ „์—ญ ๋ณ€์ˆ˜ count๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋นผ๊ณ ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. count๋Š” ์ „์—ญ ๋ณ€์ˆ˜์— ์žˆ๊ณ  ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์„ ๋ฐ”๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ž˜์ง€์Šคํ„ฐ๋กœ ๊ฐ€์ ธ๋‹ค ๋„ฃ๊ณ  ์ฆ๊ฐ์„ ํ•ด์•ผ ํ•œ๋‹ค. 

 

 

Synchronization Problem

์‹œ์ž‘ count ์˜ ๊ฐ’์ด 5๋ผ๊ณ  ํ•˜์ž. ๋ถ„๋ช…ํžˆ ์ž˜๋ชป ์ €์žฅ๋  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

Process Synchronization

race condition

์ผ์ข…์˜ ๋ฒ„๊ทธ. ๊ทธ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ์„ Synchronize๋ผ๊ณ  ํ•œ๋‹ค. ๊ณต์œ ๋˜๊ณ  ์žˆ๋Š” ์ž์›์ด ์žˆ์„ ๋•Œ ์•ฝ์†์— ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

Critical Section

shared data์— accessํ•˜๋Š” Process์˜ Interaction์ด ์žˆ๋‹ค. ๋‚˜๋จธ์ง€ ์˜์—ญ์„ Remainder Sectioin์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋‚จ์˜ Process์™€ ์ถฉ๋Œ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ critical section์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. Remainder section์—์„œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Sync ๊ด€๋ จ๋œ ๋ฒ„๊ทธ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. 

Critical section, ์ฃผ์ฐจ ๊ณต๊ฐ„. ์ฐจ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š” ์ง€๋ฅผ ๋จผ์ € ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋ˆ„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์—†๋‹ค๊ณ  ํ•˜๋ฉด ๋‚ด๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ๋œ๋‹ค. ๋“ค์–ด๊ฐ€๋ฉด ๋‚จ์ด ๋“ค์–ด์˜ค์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค. Entry Section์ด ๋ˆ„๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ถ€๋ถ„์ด๊ณ  Exit Section์€ ๋‚ด๊ฐ€ ์žˆ๋‹ค๊ฐ€ ๋‚˜์˜ค๋Š” ์ƒํ™ฉ์ด๊ณ  ํ•ด๋‹น ๊ณต๊ฐ„์— ๋‚จ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์—ด์–ด ๋†“๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 

 

 

Critical Section

๋ˆ„๊ฐ€ Critical Section์— ์žˆ๋‹ค๋ฉด Shared Data๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Shared Section์„ ๋งŒ์ง„๋‹ค๋Š” ๊ฒƒ์€ Critical section์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Remainder section์€ Shared Section์— ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

The Critical Section Problem

์ƒํ˜ธ ์ž‘์šฉ์ด๋ผ ํ•จ์€ Shared Resource๋ฅผ ๊ฐ™์ด ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค. Process์˜ ์ฝ”๋“œ๋Š” 4๊ฐ€์ง€ ์ข…๋ฅ˜์˜ Section์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค. 

 

The Critical Section Problem

do while์ด 4๊ฐ€ section์— ๋Œ€ํ•œ ํ‘œํ˜„์ด๋‹ค. 

 

 

The Critical Section Problem

Mutual exclusion

์–ด๋Š ํ•˜๋‚˜๊ฐ€ Critical section์— ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ด ๋“ค์–ด์˜ค๋ฉด ์•ˆ๋œ๋‹ค.

 

Progress

์–ด๋–ค ์ˆœ๊ฐ„์—๋Š” ์–ด๋””์— ๊ฑธ๋ ค์„œ ์ •์ง€๋˜๋Š” ์ƒํ™ฉ์„ ์–˜๊ธฐํ•œ๋‹ค. ๋ˆ„๊ฐ€ ์ฃผ์ฐจ ๊ณต๊ฐ„์— ๋“ค์–ด๊ฐ”๋Š”๋ฐ, ๋ˆ„๊ฐ€ ์žˆ์–ด์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜์™”๋Š”๋ฐ๋„ ๋‹ค๋ฅธ ์• ๋“ค์ด ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. 

์ฃผ์ฐจ ๊ณต๊ฐ„์—์„œ ๋‚˜์˜จ ์นœ๊ตฌ๋“ค์€ ๋‹ค์‹œ ๋“ค์–ด๊ฐ€๋ ค๊ณ  ๊ฒฝ์Ÿํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฌํ•œ ํŒ๋‹จ์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค. 

 

Bounded waiting

๊ฒฝ์Ÿ ์ƒํ™ฉ์—์„œ ๋‚จ์—๊ฒŒ ์–‘๋ณดํ•˜๋Š” ๊ฒƒ. ๊ฒฝ์Ÿ์ž๊ฐ€ 5๋ช…์ธ๋ฐ ์–‘๋ณด๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ ์–ด๋„ ๋ช‡ ๋ฒˆ ์ด์ƒ ๊ธฐ๋‹ค๋ฆฌ์ง€๋Š” ์•Š๊ฒ ๋‹ค๋ผ๋Š” Buffer bound๊ฐ€ ์กด์žฌํ•œ๋‹ค.

Mutual exclusion๊ณผ Progress๋Š” ๋ฌด์กฐ๊ฑด Critical ํ•˜๋‹ค.

 

 

Critical section problem

kernel์˜ ์‚ฌ๋ก€

Non-preemtive scheduling์€ Usermode์—์„œ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ scheduling์„ ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค ์•„๋‹ˆ๋‹ค๋ฅผ ๋”ฐ์ง€๋Š” ๊ฒƒ

Non-preemtive kernel์€ System call ์ƒํ™ฉ์—์„œ scheduling์„ ๋‹นํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๋ณด์ธ๋‹ค.

Non-preemtive kernel์„ ์‚ฌ์šฉํ•˜๋ฉด kernel ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค. ์ด์˜ ์ตœ๋Œ€ ์žฅ์ ์€ performance๋ณด๋‹ค Responsibility์ด๋‹ค.