Search
๐Ÿค”

Philosophers

Created
2021/07/13
tag
42์„œ์šธ
42Seoul
Philosophers
Synchronization
Mutex
Semaphore
Thread
Process

Subjects

โ€ข
โ€ข

1. Philosophers?

1) ์†Œ๊ฐœ

42์˜ ๋‹ค๋ฅธ Subject์— ๋Œ€ํ•ด์„œ ์ฐธ๊ณ ์„œ๋ฅผ ๋งŒ๋“ค ๋•Œ, ๊ฐ Subject๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ์–ธ๊ธ‰ํ•œ์ ์ด ์—†์—ˆ๋‹ค. ์šฐ์„  Subject์˜ ๋ชฉ์ ์ด ๊ณผ์ œ ์ด๋ฆ„๋งŒ์œผ๋กœ ๊ต‰์žฅํžˆ ๋šœ๋ ทํ•˜๊ฑฐ๋‚˜, ํ‰๊ฐ€๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋„์ค‘ ๊ฐ€์‹œ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์ด ๋‘๋ฃจ ์žˆ์–ด์„œ ํŒŒ์•…์ด ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ๋˜ํ•œ Subject์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค ํ˜น์€ ๋ถ€์ˆ˜์ ์ธ ์š”์†Œ๋งŒ ๋‹ด๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, Subject๊ฐ€ ์–ด๋–ค ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ง์ ‘ ํŒŒ์•…ํ•˜๊ธธ ๋ฐ”๋ผ๋Š” ๋งˆ์Œ์ด ๋” ์ปธ๋‹ค. ํ•˜์ง€๋งŒ Philosophers์— ๋Œ€ํ•ด์„œ๋Š” ์™œ Subject์˜ ์ด๋ฆ„์ด Philosophers์ด๋ฉฐ, ๋ฌด์—‡์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ณ  ์‹ถ์—ˆ๋‹ค.
Philosophers์—์„œ ๋‹ค๋ฃจ๋Š” ๋ฌธ์ œ๋Š” ์ปดํ“จํ„ฐ ์‚ฌ์ด์–ธ์Šค์—์„œ ๊ฝค๋‚˜ ์œ ๋ช…ํ•œ ์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž ๋ฌธ์ œ (Dining Philosophers Problem)์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์šด์˜์ฒด์ œ์˜ ๋™๊ธฐํ™” (Synchronization)์— ๋Œ€ํ•œ ๊ณ ์ „์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด 1960๋…„๋Œ€์— ์ œ์‹œ๋˜์—ˆ๋‹ค. ์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
๋น„์Šทํ•œ ์ข…๋ฅ˜๋กœ Consumer-Producer Problem, Readers-Writers Problem ๋“ฑ์ด ์žˆ๋‹ค.
5๋ช…์˜ ์ฒ ํ•™์ž๊ฐ€ ์›ํ˜• ์‹ํƒ์—์„œ ์‹์‚ฌ๋ฅผ ํ•˜๋ คํ•  ๋•Œ, ๊ฐ ์ฒ ํ•™์ž ์‚ฌ์ด์—๋Š” ์ “๊ฐ€๋ฝ์ด ํ•˜๋‚˜์”ฉ ๋†“์—ฌ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 5๊ฐœ์˜ ์ “๊ฐ€๋ฝ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์ด ์ “๊ฐ€๋ฝ์€ ์Œ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ ํ•™์ž๊ฐ€ ์‹์‚ฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ฒ ํ•™์ž ์–‘ ์˜†์— ์กด์žฌํ•˜๋Š” ์ “๊ฐ€๋ฝ๋“ค์„ ๋ชจ๋‘ ์žก์•„์•ผ ์‹์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋ช…๋ช…๋ฒ•์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐ ์ฒ ํ•™์ž๋Š” EATING, THINKING, SLEEPING๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ์ฒ ํ•™์ž๋Š” EATING ๋’ค์—” SLEEPING์ด ๋˜๊ณ , ์ ์ ˆํ•œ ์‹œ๊ฐ„๋งŒํผ์˜ SLEEPING ๋’ค์—” THINKING์ด ๋˜๋ฉฐ EATING์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž ๋ฌธ์ œ๊ฐ€ ๋™๊ธฐํ™”์— ๋Œ€ํ•œ ๊ณ ์ „์ ์ธ ๋ฌธ์ œ์ธ ๋งŒํผ ์–ด๋Š ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

2) ๋ฌธ์ œ์ 

do { ... THINKING ... wait(chopstick[i]) wait(chopstick[(i + 1) % 5]) ... EATING ... signal(chopstick[i]); signal(chopstick[(i + 1) % 5]) ... SLEEPING ... } while (1);
C
i ๋ฒˆ์งธ ์ฒ ํ•™์ž๊ฐ€ i, i + 1๋ฒˆ ์ “๊ฐ€๋ฝ์„ ์–ป์–ด์•ผ ์‹์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด i ๋ฒˆ์งธ ์ฒ ํ•™์ž์˜ ์‹์‚ฌ ์ง„ํ–‰์„ ์œ„ํ•ด ํ•˜๋‚˜์”ฉ ์ “๊ฐ€๋ฝ์„ ์žก๋Š”๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด์™€ ๊ฐ™์€ i๋ฒˆ์˜ ์ “๊ฐ€๋ฝ์„ ์žก์€ ๋’ค์— i + 1๋ฒˆ ์ “๊ฐ€๋ฝ์„ ์žก๋Š” ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  i ๋ฒˆ์งธ ์ฒ ํ•™์ž๊ฐ€ i๋ฒˆ์˜ ์ “๊ฐ€๋ฝ์„ ์žก์•˜์„ ๋•Œ 2๊ฐœ์˜ ์ “๊ฐ€๋ฝ์„ ์–ป์ง€ ๋ชปํ•ด ๊ต์ฐฉ ์ƒํƒœ (Deadlock)์— ๋น ์ง€๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๊ต์ฐฉ ์ƒํƒœ์— ๋Œ€ํ•ด์„  ์ถ”ํ›„์— ๋”ฐ๋กœ ์„ค๋ช…๋œ๋‹ค.

3) ๊ฐœ์„ ์•ˆ

์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
1.
์ “๊ฐ€๋ฝ์˜ ์ˆ˜๋ณด๋‹ค ์ ์€ ์ˆ˜์˜ ์ฒ ํ•™์ž๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
2.
์ “๊ฐ€๋ฝ์„ ํ•˜๋‚˜์”ฉ ์žก๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–‘์ชฝ ์ “๊ฐ€๋ฝ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ๋™์‹œ์— ๋‘ ์ “๊ฐ€๋ฝ์„ ์žก๋Š”๋‹ค.
3.
i ๋ฒˆ์งธ ์ฒ ํ•™์ž๊ฐ€ ํ™€์ˆ˜ index๋ผ๋ฉด i๋ฒˆ ์ “๊ฐ€๋ฝ์„, ์ง์ˆ˜ index๋ผ๋ฉด i + 1๋ฒˆ ์ “๊ฐ€๋ฝ์„ ์žก๋„๋ก ํ•œ๋‹ค.
/* ** i ๋ฒˆ์งธ ์ฒ ํ•™์ž๊ฐ€ ์‹์‚ฌ๋ฅผ ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ** ์–‘ ์˜†์˜ ์ฒ ํ•™์ž๊ฐ€ ์‹์‚ฌ๋ฅผ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์•„ ์ “๊ฐ€๋ฝ์„ ๋ชจ๋‘ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ฒ ํ•™์ž๊ฐ€ take_chopsticks์—์„œ waitํ•˜์ง€ ์•Š๋„๋ก signal์„ ๋ณด๋‚ธ๋‹ค. ** ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” philo[i]์˜ ๊ฐ’์ด 1์ด๋ฏ€๋กœ take_chopsticks์—์„œ Block๋˜์ง€ ์•Š๊ณ  EATING ํ•  ์ˆ˜ ์žˆ๋‹ค. */ check(int i) { if (state[i] == THINKING && state[LEFT] != EATING && state[RIGHT] != EATING) { state[i] = EATING; signal(philo[i]); } } /* ** mutex๋ฅผ ํ†ตํ•ด i ๋ฒˆ์งธ ์ฒ ํ•™์ž์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ** check๋ฅผ ํ†ตํ•ด ์–‘์ชฝ ์ฒ ํ•™์ž์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค. ** i ๋ฒˆ์งธ ์ฒ ํ•™์ž๋Š” ์ž์‹ ์ด ์‹์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. */ take_chopsticks(int i) { wait(mutex); state[i] = THINKING; check(i); signal(mutex); wait(philo[i]); } /* ** mutex๋ฅผ ํ†ตํ•ด i ๋ฒˆ์งธ ์ฒ ํ•™์ž์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ** check๋ฅผ ํ†ตํ•ด ์™ผ์ชฝ ์ฒ ํ•™์ž์™€ ์˜ค๋ฅธ์ชฝ ์ฒ ํ•™์ž์˜ ์–‘ ์˜†์„ ํ™•์ธํ•œ๋‹ค. ** ๋‘˜ ์ค‘ ์‹์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ฒ ํ•™์ž์—๊ฒŒ check ๋‚ด๋ถ€์—์„œ signal์„ ๋ณด๋‚ธ๋‹ค. */ put_chopsticks(int i) { wait(mutex); state[i] = SLEEPING; check(LEFT); check(RIGHT); signal(mutex); } /* ** Solution */ do { ... THINKING ... take_chopsticks(i) ... EATING ... put_chopsticks(i); ... SLEEPING ... } while (1);
C
์ œ์‹œ๋œ ๋ฐฉ๋ฒ•๋“ค ์ค‘ ๋‘ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ์–ผํ• ๋ณด๊ธฐ์—๋Š” i ๋ฒˆ์งธ ์ฒ ํ•™์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ L, R, LL, RR ๋ชจ๋‘ check์— ๊ฑธ๋ ค ์ƒํƒœ ํ™•์ธ ๋ฐ signal ์ˆ˜ํ–‰์œผ๋กœ ๋™๊ธฐํ™”์— ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ ๊ฐœ์„ ์•ˆ์ธ ์ด์œ ๋Š” ์ œ์‹œ๋œ ๋ฐฉ๋ฒ•๋“ค์ด ๊ต์ฐฉ ์ƒํƒœ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์€ ๊ฐ€๋Šฅํ• ์ง€๋ผ๋„ ๊ธฐ์•„ ์ƒํƒœ (Starvation)๊นŒ์ง€ ํ•ด๊ฒฐํ•˜์ง€๋Š” ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Philosophers์—์„œ๋Š” ์ฒ ํ•™์ž๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ EATING์„ ํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ฃฝ๊ฒŒ ๋˜๋ฏ€๋กœ ๊ธฐ์•„ ์ƒํƒœ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ๋„ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ต์ฐฉ ์ƒํƒœ์˜ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋”๋ผ๋„ ๋ฐ˜๋“œ์‹œ ๊ธฐ์•„ ์ƒํƒœ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋™๋ฐ˜๋˜์–ด์•ผ ํ•œ๋‹ค.
๊ธฐ์•„ ์ƒํƒœ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋“ค ์ค‘ ํ•˜๋‚˜๋กœ๋Š” ํ•œ ์ฐจ๋ก€ ๊ตถ์—ˆ๋˜ ์ฒ ํ•™์ž์—๊ฒŒ ์šฐ์„ ๊ถŒ์„ ์ฃผ๋Š” ๋ฐฉ์•ˆ๋„ ์žˆ๋‹ค.

4) ๊ณ ๋ คํ•  ์ 

์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž ๋ฌธ์ œ, Consumer-Producer Problem, Readers-Writers Problem ๋“ฑ ๋™๊ธฐํ™”์˜ ๊ณ ์ „์ ์ธ ๋ฌธ์ œ๋“ค์ด ์‹œ์‚ฌํ•˜๋Š” ์ ๋“ค์€ ๊ฒฐ๊ตญ ์•„๋ž˜์˜ ์‚ฌํ•ญ๋“ค๊ณผ ๊ฐ™๋‹ค. ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ ํ˜น์€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์€ ๋งŽ์€ ์žฅ์ ์„ ๊ฐ€์ ธ๋‹ค ์ฃผ์ง€๋งŒ, ๊ฒฐ๊ตญ ์ž์›์„ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ๋™๊ธฐํ™”๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๊ณ  ๊ทธ ๊ณผ์ •์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์ด์Šˆ๋“ค์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.
1.
Data Consistency๊ฐ€ ํ™•๋ณด๋˜๋Š”๊ฐ€?
2.
Deadlock์ด ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?
3.
Starvation์ด ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?
4.
Concurrency์˜ ์ œ๊ณต์ด ์›ํ™œํ•œ๊ฐ€?
Philosophers์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด, ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์š”๊ตฌ๋˜๋Š” ๊ฐœ๋…๋“ค๊ณผ ๊ฐ ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. ํŠนํžˆ ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ๋“ค์„ ํ™•์‹คํžˆ ์ตํžŒ ๋’ค์— ๊ตฌํ˜„์— ์ž„ํ•˜๋„๋ก ํ•˜์ž.

2. Thread

1) Context Switch

์šด์˜์ฒด์ œ์— ์˜ํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์Šค์ผ€์ค„๋ง ๋œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์šด์˜์ฒด์ œ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ์ด ๋‹จ์ผ ์ฝ”์–ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ํ•˜๋‚˜์˜ ์ฝ”์–ด์—๋Š” ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„  ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹์˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ์ „ํ™˜์ด ์š”๊ตฌ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ฒ˜๋ฆฌ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ „ํ™˜์„ Context Switch๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
Context Switch๋Š” ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ํ• ๋‹น๋œ Time Quantum์ด ๋ชจ๋‘ ์†Œ์ง„๋˜๊ฑฐ๋‚˜, I/O ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ Interrupt์— ์˜ํ•ด ๋ฐœ์ƒํ•œ๋‹ค. Context Switch์˜ ๋ฐœ์ƒ์ด ๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•˜๋˜ ์ž‘์—…์—์„œ ์ƒˆ๋กœ์šด ์ž‘์—…์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ์ž‘์—…์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜๋„ ์žˆ์–ด์•ผ ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•˜๋˜ ์ž‘์—…์ด ์ถ”ํ›„์— ์ด์–ด์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ €์žฅ๋  ์ˆ˜๋„ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์€ Kernel์˜ Dispatcher๋ผ๋Š” ๊ณณ์—์„œ ๋‹ด๋‹นํ•˜๋ฉฐ, PCB (Process Control Block)์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ค„์ง„๋‹ค.
Time Quantum์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„ ์ด๋Ÿ‰์„ ์˜๋ฏธํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ํ• ๋‹น๋˜๋Š” Time Quantum์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ฒด๊ฐํ•˜์ง€ ๋ชปํ•  ์ •๋„๋กœ ์ž‘๋‹ค. ๋•๋ถ„์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋ฐ–์— ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ž„์—๋„ ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๋ผ๊ฒŒ ๋œ๋‹ค.
Context Switch๋Š” ๋น„๋ก ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ์“ฐ๋ ˆ๋“œ ๊ฐ„์˜ ์ „ํ™˜์ธ Thread Switch๊ฐ€ Context Switch์™€ ํฌ๊ฒŒ ๋‹ค๋ฅผ ๊ฒƒ์ด ์—†์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ์ดํ•ด๋Š” ํ•„์ˆ˜์ ์ด๋‹ค. ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ PoldP_{old}๋ผ ํ•˜๊ณ , ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ PnewP_{new}๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, Context Switch์— ๋Œ€ํ•œ ํ๋ฆ„์€ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. ๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ, Context Switch๋Š” Interrupt์— ์˜ํ•ด ๋ฐœ์ƒํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค์˜ ๊ธฐ๋ก ์ž์ฒด๋Š” ์‹œ์Šคํ…œ ์ฝœ์— ๊ธฐ๋ฐ˜ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœ์— ๋”ฐ๋ผ PoldP_{old}์˜ ๋‚ด์šฉ์„ PCBoldPCB_{old}์— ๊ธฐ๋กํ•œ ํ›„, ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค์˜ ํ๋ฆ„์„ PCBnewPCB_{new}์—์„œ ์ฝ์–ด์™€์„œ PnewP_{new}๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ์‹์œผ๋กœ Context Switch๊ฐ€ ์ด๋ค„์ง„๋‹ค.
Context Switch ์ž์ฒด๋Š” ์œ„์—์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ Dispatcher์— ์˜ํ•ด์„œ ์ฒ˜๋ฆฌ๋˜๋Š”๋ฐ, ์ด๋Š” ๊ณง Dispatcher์˜ ํ˜ธ์ถœ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘๋œ๋‹ค. Dispatcher์˜ ํ˜ธ์ถœ์€ Interrupt์— ์˜ํ•ด ๋ฐœ์ƒํ•œ๋‹ค. Dispatcher๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Interrupt๋Š” Preemptive Scheduling๊ณผ Non-Preemptive Scheduling์œผ๋กœ ๋‚˜๋‰œ๋‹ค. Time Quantum์„ ๋ชจ๋‘ ์†Œ์ง„ํ•˜์—ฌ ์šด์˜์ฒด์ œ ๊ถŒํ•œ์œผ๋กœ ํ”„๋กœ์„ธ์Šค์˜ ๊ถŒํ•œ์„ ๋บ์œผ๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” Interrupt๊ฐ€ Preemptive Scheduling์ด๊ณ , I/O ํ˜ธ์ถœ๊ณผ ๊ฐ™์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์Šค์Šค๋กœ CPU ์ ์œ ๋ฅผ ํฌ๊ธฐํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” Interrupt๊ฐ€ Non-Preemptive Scheduling์ด๋‹ค.
PCB๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์šด์˜์ฒด์ œ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋Œ€์ฒด์ ์œผ๋กœ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ๋“ค์ด ํฌํ•จ๋œ๋‹ค. ํ˜„์žฌ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ PCBoldPCB_{old}๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ƒˆ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ PCBnewPCB_{new}๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ์„ ํ†ตํ•ด PCB๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด์šฉํ•˜๋Š” PCB๋Š” Kernel์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.
Kernel๋„ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์กด์žฌํ•˜๋Š” ์กฐ๊ธˆ ํŠน๋ณ„ํ•œ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์ด๋‹ค. ๋‹ค์ˆ˜์˜ PCB๊ฐ€ ์กด์žฌํ•˜์—ฌ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•๊ณผ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”๋ฐ, Virtual Address์™€ Demanding Page ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋กœ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.
Context Switch์— ๋”ฐ๋ผ PCB์— ์ €์žฅํ•˜๋Š” ๋‚ด์šฉ๋“ค์€ ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ (State) ์ •๋ณด๋“ค์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ State์˜ ์ €์žฅ ์ž์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ์ฐจ๋ก€์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๋ฅผ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค๋‚˜ ๋งŽ์€ CPU ์—ฐ์‚ฐ์„ ์†ํ•ด๋ณผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, State์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋ฉด ํด์ˆ˜๋ก Context Switch๋ฅผ ์œ„ํ•œ CPU ์—ฐ์‚ฐ์˜ ์†ํ•ด๋Š” ๋”์šฑ ์ปค์ง€๊ฒŒ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ํ˜„์ƒ์€ ํŠนํžˆ ํ”„๋กœ์„ธ์„œ์˜ ๊ตฌ์กฐ์—๋„ ํฐ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
CPU ์—ฐ์‚ฐ์˜ ์†ํ•ด๋ผ ํ‘œํ˜„ํ•˜๋Š” ์ด์œ ๋Š” Context Switch๊ฐ€ ์—†๋‹ค๋ฉด State ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๋Š” ์‹œ๊ฐ„๋งŒํผ ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ์— ์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌผ๋ก  Context Switch๊ฐ€ ์—†์œผ๋ฉด ์•ˆ ๋˜์ง€๋งŒ, ๊ณผ๋„ํ•œ Context Switch๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. Context Switch๋Š” ๊ฒฐ์ฝ” ๊ฐ’ ์‹ผ ์—ฐ์‚ฐ์ด ์•„๋‹ˆ๋‹ค.
CISC ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์„œ์˜ ๊ฒฝ์šฐ์—๋Š” Instruction๋“ค์ด ๋ณต์žกํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์—ฐ์‚ฐ์ด ๋Œ€์ฒด์ ์œผ๋กœ ๋‹จ์ผ Instruction์œผ๋กœ ํ‘œํ˜„๋œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํšจ์œจ์€ ์ข‹์„ ์ˆ˜ ์žˆ์ง€๋งŒ Instruction์ด ๋ณต์žกํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ CPU ํด๋Ÿญ ์†๋„๋Š” ์ €ํ•˜๋œ๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ๋‹ค. ๋˜ํ•œ Instruction์ด ๋ณต์žกํ•˜๋‹ค๋Š” ์–˜๊ธฐ๋Š” ๊ณง ํšŒ๋กœ๊ฐ€ ๋ณต์žกํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฌผ๋ฆฌ์ ์ธ ๊ณต๊ฐ„์„ ์ƒ๋Œ€์ ์œผ๋กœ ๋” ๋งŽ์ด ์ฐจ์ง€ํ•จ์œผ๋กœ์จ Register ์šฉ๋Ÿ‰๋„ ์ €ํ•˜๋œ๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ Context Switch ์ธก๋ฉด์—์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, State๋ฅผ ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” Instruction ๋ฌถ์Œ์ด Compact ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— RISC์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ์€ ์–‘์˜ Instruction์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋‹ค.
RISC ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์„œ์˜ ๊ฒฝ์šฐ์—๋Š” Instruction๋“ค์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์—ฐ์‚ฐ์ด ๋Œ€์ฒด์ ์œผ๋กœ Instruction์˜ ์กฐํ•ฉ์œผ๋กœ ํ‘œํ˜„๋œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋น„๋ก ๋ฐ˜๋ณต์ ์ธ Instruction์ด ์žˆ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, Instruction์ด ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ CPU ํด๋Ÿญ ์†๋„๊ฐ€ ๋†’์•„์„œ ๋น ๋ฅธ ์ˆ˜ํ–‰ ์†๋„๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ๋‹ค. ์ด๋Š” Register์— ๋Œ€ํ•ด์„œ๋„ ์ƒ๋Œ€์ ์œผ๋กœ ์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์„ฑ๊ณผ ์ง๊ฒฐ๋œ๋‹ค. ํ•˜์ง€๋งŒ Context Switch ์ธก๋ฉด์—์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, State๋ฅผ ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” Instruction ๋ฌถ์Œ์ด ๋ฌด๊ฑฐ์›Œ์ง์— ๋”ฐ๋ผ CISC์— ๋น„ํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.
Context Switch์˜ ์—ฐ์‚ฐ ์†Œ๋ชจ๋Ÿ‰์ด ํ”„๋กœ์„ธ์„œ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ”„๋กœ์„ธ์„œ์˜ ๊ตฌ๋ถ„ ์—†์ด ๋ถ„๋ช…ํ•œ ๊ฒƒ์€ Context Switch๋Š” ๊ฒฐ๊ณ  ๊ฐ€๋ณ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ํ”„๋กœ์„ธ์„œ์˜ ๊ตฌ๋ถ„ ์—†์ด ๋ถ„๋ช…ํ•œ ์‚ฌํ•ญ์ด ์žˆ๋Š”๋ฐ, ์‹œ์Šคํ…œ ์ฝœ ๋„์ค‘์—๋Š” Context Switch๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” Context Switch์˜ PCB์— ๋Œ€ํ•œ ์ž‘์—…์„ ํ•˜๋Š” ๋„์ค‘์—๋Š” Context Switch๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ๋„ ํฌํ•จ๋œ๋‹ค.
์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœ ๋„์ค‘์— Context Switch๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด Interrupt๋ฅผ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ž.
Context Switch์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค ๋งฅ๋ฝ์˜ ์ž‘์—…์ธ์ง€ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๊ฒ ์ง€๋งŒ, ์‹œ์Šคํ…œ ์ฝœ ๋ฐ Interrupt ๋“ฑ ๋ถ€์ˆ˜์ ์ธ ์šฉ์–ด๋“ค์ด ๋งŽ์ด ๋‚˜์™”์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

2) CPU ์‹คํ–‰ ๋ชจ๋“œ

1. User Mode & Kernel Mode

๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค์—์„œ Instruction์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด CPU๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ User Mode์ธ์ง€ Kernel Mode์ธ์ง€์— ๋”ฐ๋ผ CPU์˜ ์‹คํ–‰์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์ด๋Š” I/O ํ˜น์€ ํ”„๋กœ์„ธ์Šค์™€ ๊ด€๋ จ๋œ ์‹œ์Šคํ…œ ๋‹จ์˜ ์—ฐ์‚ฐ๋“ค์„ User Mode์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ œ์–ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋„๋ก, ์‹œ์Šคํ…œ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด CPU์˜ ์‹คํ–‰ ๋ชจ๋“œ๊ฐ€ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ตฌ๋ถ„๋œ Mode๋ฅผ ํ•˜๋“œ์›จ์–ด ๋‹จ์—์„œ ์ธ์‹ํ•˜๊ณ , ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” Instruction์ด ์ ์ ˆํ•œ Mode์—์„œ ์ด๋ค„์ง€๋Š”์ง€์— ๋”ฐ๋ผ ์‹คํ–‰ ์—ฌ๋ถ€๊ฐ€ ๊ฐˆ๋ฆฌ๊ฒŒ ๋œ๋‹ค.
์‹œ์Šคํ…œ ์ƒ์—์„œ ์ด๋ค„์ง€๋Š” Kernel ๋‹จ์œ„์˜ ์—ฐ์‚ฐ๋“ค์€ File I/O, Device I/O, ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ๋“ฑ์ด ์žˆ๋‹ค.
Kernel Mode์˜ ํ”„๋กœ์„ธ์Šค๋Š” Instruction์— ๋Œ€ํ•ด์„œ ๋ชจ๋“  ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ์ด์— ํ•ด๋‹น๋œ๋‹ค. ์ฆ‰, ์šด์˜์ฒด์ œ๋Š” I/O ์žฅ์น˜ ์ œ์–ด ๋“ฑ ์‹œ์Šคํ…œ ์ƒ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  Instruction์„ ํ•˜๋“œ์›จ์–ด์—๊ฒŒ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
User Mode์˜ ํ”„๋กœ์„ธ์Šค๋Š” ๋Œ€์ฒด์ ์œผ๋กœ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๊ตฌ๋™๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ฉฐ, Instruction์— ๋Œ€ํ•ด ๋ฒ”์šฉ์ ์ธ ๊ถŒํ•œ์„ ๊ฐ–๊ณ ๋Š” ์žˆ์ง€๋งŒ Kernel Mode ๋งŒํผ์˜ ๊ถŒํ•œ์„ ๊ฐ–์ง€๋Š” ๋ชปํ•œ๋‹ค.

2. ์‹œ์Šคํ…œ ์ฝœ

๋”ฐ๋ผ์„œ User Mode์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ฑฐ๋‚˜, R/W ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๊ฑฐ๋‚˜, ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ซ๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ํ•ด๋‹น Mode๋กœ๋Š” ํ•˜๋“œ์›จ์–ด ๋‹จ์—์„œ ๊ฑฐ์ ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•ด๋‹น ์ž‘์—…๋“ค์€ Kernel Mode์˜ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€์ฒด์ ์œผ๋กœ ์šด์˜์ฒด์ œ์—๊ฒŒ ํ•ด๋‹น ์ž‘์—…์„ ์š”์ฒญํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต ๋ฐ›๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์‹คํ–‰ ๋ชจ๋“œ ์ „ํ™˜ (Execution Mode Switch)๋ผ ํ•œ๋‹ค.
Kernel Mode์—๊ฒŒ๋งŒ ์ œ๊ณต๋˜๋Š” Instruction๋“ค์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ์šด์˜์ฒด์ œ๋Š” ํ•ด๋‹น ์„œ๋น„์Šค๋“ค์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ํ†ต๋กœ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋“ค์ด ๊ณง ์‹œ์Šคํ…œ ์ฝœ์ด ๋œ๋‹ค. User Mode์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, User Mode์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์š”์ฒญํ•œ ๋Œ€๋กœ ์šด์˜์ฒด์ œ๊ฐ€ ์ˆ˜ํ–‰ํ•œ ๋’ค User Mode๋กœ ๋ณต๊ท€ํ•˜๋Š” ์‹์œผ๋กœ ์‹คํ–‰ ๋ชจ๋“œ ์ „ํ™˜์ด ์ด๋ค„์ง„๋‹ค. ์ด์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ์ฝœ์—๋Š” open, write, shm, fork ๋“ฑ์ด ์žˆ๋‹ค.
์ด์ „ ํ•ญ๋ชฉ์—์„œ Context Switch๋„ ์‹œ์Šคํ…œ ์ฝœ์— ์˜ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฅผ User Mode ๋ฐ Kernel Mode๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

3) Trap & Interrupt

Trap๊ณผ Interrupt๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•์ด๋ผ๋Š” ๊ณตํ†ต์ ์ด ์žˆ์ง€๋งŒ, ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์š”์ธ๊ณผ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค. Trap์€ ๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋ฉฐ, Interrupt๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•์ž„์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

1. Trap

Trap์€ ์ฃผ๋กœ ์‹œ์Šคํ…œ ์ฝœ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ด์šฉ๋œ๋‹ค. ์ฆ‰, Interrupt์™€๋Š” ๋‹ฌ๋ฆฌ ์ฃผ๋กœ ํ˜„์žฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด์„œ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋Š” Trap Handler์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค. Trap Handler์—์„œ๋Š” Interrupt Handler์™€ ๋น„์Šทํ•˜๊ฒŒ Trap Service Routine์ด ์กด์žฌํ•˜์ง€๋งŒ, Interrupt์™€ ๋‹ฌ๋ฆฌ ๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ํ˜„์žฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ Context๋ฅผ ์ €์žฅํ•  ํ•„์š”๋„ ์—†๊ณ  ๋ณต์›ํ•  ํ•„์š”๋„ ์—†๋‹ค. ๋”ฐ๋ผ์„œ Trap์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์–ด Trap Handler๊ฐ€ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด, SP (Stack Pointer)์™€ PC (Program Counter)๋งŒ์„ ์ด์šฉํ•˜์—ฌ ๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•˜๋˜ ๋™์ž‘์œผ๋กœ ๋ณต๊ท€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

2. Interrupt

Interrupt๋Š” ์ฃผ๋กœ ๋„คํŠธ์›Œํฌ์˜ Packet ๋„์ฐฉ ํ˜น์€ I/O์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ด์šฉ๋œ๋‹ค. Interrupt๋Š” Trap๊ณผ ๋‹ฌ๋ฆฌ ํ˜„์žฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน์ • ํ•˜๋“œ์›จ์–ด์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Interrupt๋Š” ํ•˜๋“œ์›จ์–ด์˜ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๊ณ , ํ•˜๋“œ์›จ์–ด๋“ค์ด ๋™์‹œ์— Interrupt๋ฅผ ๊ฑธ์–ด๋„ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋Š” Interrupt Handler์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค. Interrupt Handler์—์„œ๋Š” Interrupt Service Routine๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, Interrupt๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค ๋ณต๊ท€ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Interrupt Service Routine ์ง„์ž… ์ „์— ๋ฐ˜๋“œ์‹œ Context์— ๋Œ€ํ•œ ๊ธฐ๋ก์ด ์š”๊ตฌ๋œ๋‹ค. Interrupt์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋งˆ์น˜๋ฉด ์ €์žฅ๋œ Context๋ฅผ ๋ณต์›ํ•˜์—ฌ ์ค‘๋‹จ๋œ ์‹œ์ ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

3. ํŠน์ง•

Trap์˜ ๊ฒฝ์šฐ์—๋Š” Trap Service Routine ๋‚ด์—์„œ ์ฒ˜๋ฆฌ ๋„์ค‘์— Interrupt๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, Interrupt์˜ ๊ฒฝ์šฐ์—๋Š” Interrupt Service Routine ๋‚ด์—์„œ ์ฒ˜๋ฆฌ ๋„์ค‘์— Inetrrupt๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ์ด๋Š” Interrupt์˜ Depth๊ฐ€ ๊นŠ์–ด์ง์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ Interrupt๊ฐ€ ๋๋‚˜๋Š”๋ฐ ๊ธด ์‹œ๊ฐ„์ด ์š”๊ตฌ๋˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ Interrupt๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋‹ค๋ฅธ Interrupt๋“ค๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก Interrupt Serivce Routine์€ ์ตœ๋Œ€ํ•œ ์งง๊ฒŒ ์ˆ˜ํ–‰๋˜๋„๋ก ์„ค๊ณ„ ๋˜์–ด ์žˆ๋‹ค.
Trap์€ ํ”„๋กœ์„ธ์Šค์˜ Context๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๋ฉด์—์„œ Interrupt๋ณด๋‹ค ๊ฐ€๋ณ์ง€๋งŒ Trap์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ Block๋œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. Interrupt๋Š” Trap์˜ ๋ฐ˜๋Œ€์˜ ํŠน์ง•์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
๋งŒ์ผ Interrupt๊ฐ€ ๋™์‹œ์— ๋ฐœ์ƒํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋™์ผํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ Interrupt๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋ฉด ์šด์˜์ฒด์ œ์™€ ํ•˜๋“œ์›จ์–ด์— ์˜ํ•ด ํ•˜๋‚˜์˜ Interrupt๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚˜๋จธ์ง€ Interrupt๋Š” ์ €์žฅํ•ด๋‘๊ฑฐ๋‚˜ ๋ฌด์‹œํ•˜๊ฒŒ ๋œ๋‹ค.

4) ์“ฐ๋ ˆ๋“œ?

1. ์“ฐ๋ ˆ๋“œ์™€ ํ”„๋กœ์„ธ์Šค

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ์— ์˜ํ•œ ์Šค์ผ€์ค„๋ง์˜ ๋‹จ์œ„์˜€๋‹ค๋ฉด, ์‹ค์ œ๋กœ ์ด๋“ค์˜ ์ฒ˜๋ฆฌ ๋‹จ์œ„๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋œ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋“ค์€ Main Thread๋ผ๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ , ํ”„๋กœ์„ธ์Šค๋Š” ์“ฐ๋ ˆ๋“œ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„๋ผ๋Š” ์ ์ด ์ž˜ ์™€๋‹ฟ์ง€ ์•Š๋Š”๋‹ค๋ฉด, 1๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณง 1๊ฐœ์˜ ์‹คํ–‰ ํ๋ฆ„์ด๋ผ๊ณ  ์ดํ•ดํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ์ฆ‰, ์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ์ž‘์€ ๋‹จ์œ„์˜ ์‹คํ–‰ ํ๋ฆ„์ด๋‹ค.
ํ”„๋กœ์„ธ์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ ์œ ํ•˜๊ณ , ์ด๋“ค์€ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ Protection Domain์„ ์ง€์›๋ฐ›์Œ์œผ๋กœ์จ ๊ณต๊ฐ„์˜ ๋…๋ฆฝ์„ฑ์„ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ˜๋ฉด์— ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์“ฐ๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ฐ€์ง„ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด Protection Domain์„ ์ง€์›๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฝ๊ณ  ์“ฐ๋Š” ๋“ฑ์˜ ํ–‰์œ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์šด์˜์ฒด์ œ์— ์˜ํ•ด ํ•œ ๋ฒˆ์˜ ์ œ์–ด๋ฅผ ๋ฐ›์•„ ๋‹จ์ผ ํ๋ฆ„์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜์ง€๋งŒ, ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ฌ๋Ÿฌ ํ๋ฆ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋‹ค์ˆ˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๊ฒŒ ๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ณ‘๋ ฌ์„ฑ์„ ์ž˜ ๋ณด์žฅํ•˜๋„๋ก ํ”„๋กœ์„ธ์Šค ๋‚ด์— ์“ฐ๋ ˆ๋“œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด, Cooperative Process์™€ ๋‹ฌ๋ฆฌ ๊ฐ’ ๋น„์‹ผ IPC๊ฐ€ ์š”๊ตฌ๋˜์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ, ๊ฐ’ ๋น„์‹ผ Context Switch๊ฐ€ ์ž์ฃผ ์š”๊ตฌ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ฆ‰, ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž‘์—…ํ•˜๋„๋ก ๋งŒ๋“ฆ์œผ๋กœ์จ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ์ ์€ ๋น„์šฉ์œผ๋กœ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๊ณ  Protection Domain์ด ์ง€์›๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•œ ๋™๊ธฐํ™”์— ์‹ ๊ฒฝ ์จ์•ผํ•œ๋‹ค.

2. ํ”„๋กœ์„ธ์Šค ๋‹น ์“ฐ๋ ˆ๋“œ์˜ ์ˆ˜

๋™๊ธฐํ™” ์ด์ „์— ์ ์ ˆํ•œ ๋ณ‘๋ ฌ์„ฑ์„ ๋ณด์žฅ ๋ฐ›๊ธฐ ์œ„ํ•ด์„  ์–ผ๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๋Š”์ง€๋„ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ ์–ผ๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ๊ฒƒ์ผ๊นŒ? ๋ช‡ ๋ฌธ๋‹จ ์œ„์—์„œ ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ด๋Š” ๋จธ์‹ ์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ผ๋ฆฌ ์ฝ”์–ด์— ์˜์กด์ ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 8์ฝ”์–ด 16์“ฐ๋ ˆ๋“œ์˜ CPU๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, ํ•œ ๋ฒˆ์— 16๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฌผ๋ก  Kernel์—์„œ ์“ฐ๋ ˆ๋”ฉ์„ ์ง€์›ํ•ด์•ผ ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์ง€์›๋˜๋Š” ๊ฒƒ์ธ๋ฐ ์•„๋ž˜์˜ User-Level ์“ฐ๋ ˆ๋“œ์™€ Kernel-Level ์“ฐ๋ ˆ๋“œ์—์„œ ์ด์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.)
์—ฌ๊ธฐ์„œ CPU์˜ 8์ฝ”์–ด 16์“ฐ๋ ˆ๋“œ์˜ 16์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์“ฐ๋ ˆ๋“œ์™€ ๋ณ„๊ฐœ์ด๋‹ค. CPU ์ŠคํŽ™์˜ 8์ฝ”์–ด 16์“ฐ๋ ˆ๋“œ์—์„œ์˜ 16 ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณง ๋…ผ๋ฆฌ ์ฝ”์–ด๋กœ ์ž‘๋™ํ•œ๋‹ค.
์–ธ๊ธ‰๋œ๋Œ€๋กœ ๋‹จ์ˆœํžˆ ๋…ผ๋ฆฌ ์ฝ”์–ด ๊ฐœ์ˆ˜์— ๋งž๊ฒŒ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์ปดํ“จํ„ฐ์˜ ๋™์ž‘์—๋Š” CPU์—๋งŒ ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ ๋“ฑ ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ์„œ๋ฒ„ ์ž‘์—…์—์„œ DB๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋””์Šคํฌ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์‹์˜ ๋””๋ฐ”์ด์Šค ํƒ€์ž„์„ ๋งŽ์ด ์š”๊ตฌํ•˜๋Š” ์ž‘์—…์ด ๋‹ค์ˆ˜ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” CPU ์—ฐ์‚ฐ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น CPU๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋งŒ์ผ ์ •ํ™•ํžˆ ๋…ผ๋ฆฌ ์ฝ”์–ด๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ๋…ผ๋ฆฌ ์ฝ”์–ด๋Š” ๋””๋ฐ”์ด์Šค ํƒ€์ž„๋งŒํผ ์œ ํœด ์ƒํƒœ๋กœ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ๋””๋ฐ”์ด์Šค ํƒ€์ž„์„ ๊ณ ๋ คํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์ด ๋””๋ฐ”์ด์Šค ํƒ€์ž„์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋…ผ๋ฆฌ ์ฝ”์–ด์˜ ์ˆ˜๋งŒํผ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค. ๋ฐ˜๋ฉด์— ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์ด ๋””๋ฐ”์ด์Šค ํƒ€์ž„์„ ์š”๊ตฌํ•œ๋‹ค๋ฉด, ๋””๋ฐ”์ด์Šค ํƒ€์ž„์— ๋น„๋ก€ํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ 14\frac {1}{4}์ด ๋””๋ฐ”์ด์Šค ํƒ€์ž„์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์ด๊ณ  34\frac {3}{4}์ด ๋””๋ฐ”์ด์Šค ํƒ€์ž„์„ ์š”๊ตฌํ•˜๋Š” ์ž‘์—…๊ณผ ๊ฐ™์€ ์‹์ด๋ผ๋ฉด, ๋…ผ๋ฆฌ ์ฝ”์–ด์˜ 3๋ฐฐ๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค.
๋ฌผ๋ก  ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ Context Switch ๋ณด๋‹ค ์“ฐ๋ ˆ๋“œ ๊ฐ„์˜ Thread Switch๊ฐ€ ๋” ๊ฐ€๋ณ๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ, ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ผ๋ฆฌ ์ฝ”์–ด ์ˆ˜๋ณด๋‹ค ์“ฐ๋ ˆ๋“œ์˜ ์ˆ˜๊ฐ€ ๋” ๋งŽ์œผ๋ฉด ์“ฐ๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„๋ณด๋‹ค Thread Switch์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ CPU ์ฒ˜๋ฆฌ๋Ÿ‰์€ ๋‚ฎ์•„์ง€๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์“ฐ๋ ˆ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก CPU์˜ ํ™œ์šฉ๋Ÿ‰์ด ๋†’์•„์ง€๊ธด ํ•˜๋‚˜ ์ด๊ฒƒ์ด ๊ณง ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋†’์•„์ง€๋Š” ๊ฒƒ์ด ์•„๋‹˜์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค.
Thread Switch๊ฐ€ Context Switch ๋ณด๋‹ค ๋” ๊ฐ€๋ฒผ์šด ์ด์œ ๋Š” ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์“ฐ๋ ˆ๋“œ๋“ค์€ Code Segment, Data Segment ๋ฐ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์—ด์–ด๋‘” ํŒŒ์ผ ๋“ฑ์— ๋Œ€ํ•ด์„œ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ์“ฐ๋ ˆ๋“œ์˜ Stack์— ๋Œ€ํ•ด์„œ๋งŒ ๊ต์ฒดํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ Context Switch ๋ณด๋‹ค ๊ฐ€๋ณ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ๊ฐ ์“ฐ๋ ˆ๋“œ๋Š” ์„œ๋กœ ์‹คํ–‰ํ•  Instruction์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ PC (Program Counter)๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

3. ์“ฐ๋ ˆ๋“œ ์‹คํ–‰์— ํ•„์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ

โ€ข
์ƒ์„ฑ๋œ ์“ฐ๋ ˆ๋“œ๋“ค ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‹คํ–‰ํ• ์ง€์— ๋Œ€ํ•ด ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์“ฐ๋ ˆ๋“œ ID๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
โ€ข
์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์—ฌ๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ณต์œ ํ•˜์ง€๋งŒ, ๊ฐ ์“ฐ๋ ˆ๋“œ์˜ Stack์€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค.
โ€ข
์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์‹คํ–‰ํ๋ฆ„์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์“ฐ๋ ˆ๋“œ๋Š” ๋ณ„๋„์˜ PC๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
โ€ข
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ„๋„์˜ PC๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ์—ฐ์‚ฐ์€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋”ฐ๋ฅธ ๋ณ„๋„์˜ Register Set์ด ํ•„์š”ํ•˜๋‹ค.
๊ฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Register Set์˜ ๊ฐ’๋“ค์€ Context Switch ํ˜น์€ Thread Switch์— ๋”ฐ๋ผ ๊ทธ ๊ฐ’์ด ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ๋ณต์›๋˜์—ˆ๋‹ค๋ฅผ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋•Œ๋ฌธ์— ๋™์ผํ•œ Physical Register Set๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ Register Set์„ ์“ฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Physical Register Set์€ ์–ผ๋งŒํผ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ์‹ค์ œ๋กœ ํ”„๋กœ์„ธ์„œ๋“ค์€ ์ฝ”๋“œ ๋‹จ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Physical Register Set๋ณด๋‹ค ๋” ๋งŽ์€ Physical Register Set๋“ค์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์ด๋“ค์€ ์ฝ”์–ด ๋‹จ์œ„๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ ์ฝ”์–ด๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ, Physical Register Set ๋งˆ์ €๋„ ๋ณ„๋„๋กœ ์ ์œ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

5) User-Level & Kernel-Level

1. ํŠน์ง•

์“ฐ๋ ˆ๋“œ์—๋Š” User-Level ์“ฐ๋ ˆ๋“œ์™€ Kernel-Level ์“ฐ๋ ˆ๋“œ์™€ ๊ฐ™์ด 2๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋‰œ๋‹ค. ์‚ฌ์šฉ์ž๋“ค์ด ๋Œ€์ฒด์ ์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋Š” User-Level ์“ฐ๋ ˆ๋“œ์ด๋ฉฐ, ๋ณ„๋„๋กœ ์†์„ฑ์— ๋Œ€ํ•œ ์„ค์ •์„ ํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด User-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ์ฃผ์ฒด์— ๋”ฐ๋ผ์„œ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค.
์ด๋Š” CPU ์‹คํ–‰ ๋ชจ๋“œ์ธ User Mode ๋ฐ Kernel Mode์™€๋Š” ๋ณ„๊ฐœ๋ผ๋Š” ์ ์„ ์œ ์˜ํ•˜์ž.
User-Level ์“ฐ๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ์—๋Š” Kernel ์œ„์—์„œ ์ง€์›๋˜๋Š” ์“ฐ๋ ˆ๋“œ์ด๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ User-Level์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ์“ฐ๋ ˆ๋“œ๋Š” ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ณต์œ ํ•œ ์ฑ„๋กœ ์ƒ์„ฑ๋œ๋‹ค.
๋ฐ˜๋ฉด์— Kernel-Level ์“ฐ๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ์—๋Š” ์šด์˜์ฒด์ œ์—์„œ ์“ฐ๋ ˆ๋”ฉ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Kernel-Level ์“ฐ๋ ˆ๋“œ๋Š” ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด Kernel ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์“ฐ๋ ˆ๋“œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ฃผ๋กœ ์Šค์ผ€์ค„๋ง ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

2. ๋™์ž‘ ๋ฐฉ์‹

๋‘ ์ข…๋ฅ˜์˜ ์“ฐ๋ ˆ๋“œ๋Š” ์šฉ๋„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ์ž…์žฅ์—์„œ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค. User-Level ์“ฐ๋ ˆ๋“œ๋Š” ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ Kernel-Level ์“ฐ๋ ˆ๋“œ๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ํ•˜์ง€๋งŒ ์šด์˜์ฒด์ œ์—์„œ ์“ฐ๋ ˆ๋”ฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์•„ Kernel-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, Kernel์€ User-Level์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— User-Level ์“ฐ๋ ˆ๋“œ๋“ค ์ค‘ ํ•˜๋‚˜์—์„œ ์‹œ์Šคํ…œ ์ฝœ๊ณผ ๊ฐ™์€ Trap์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‚˜๋จธ์ง€ ์“ฐ๋ ˆ๋“œ๋“ค ์—ญ์‹œ Block๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
์šด์˜์ฒด์ œ์—์„œ ์“ฐ๋ ˆ๋”ฉ์„ ์ง€์›ํ•œ๋‹ค๋ฉด Kernel-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ , ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง์— ๊ด€์—ฌ๋˜๋Š” ๋งŒํผ User-Level ์“ฐ๋ ˆ๋“œ์˜ ์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœ์— ๋”ฐ๋ฅธ Block ์ƒํƒœ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋‹ค. User-Level ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜์—ฌ Block์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ Kernel ๋‚ด์—์„œ๋Š” ๋‹ค๋ฅธ Kernel-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ๋‹ค๋ฅธ User-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งก์œผ๋ฉด์„œ ์ „์ฒด์ ์œผ๋กœ๋Š” Block์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Kernel-Level ์“ฐ๋ ˆ๋“œ๋Š” ์Šค์ผ€์ค„๋ง์— ์ง์ ‘์ ์œผ๋กœ ๊ด€์—ฌ๋œ๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ, ํ”„๋กœ์„ธ์‹ฑ์— ์ด์šฉ๋  ์—ฌ๋Ÿฌ ์ฝ”์–ด๋“ค์ด ์žˆ๋‹ค๋ฉด ๊ฐ Kernel-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ์ฝ”์–ด๋“ค์—๊ฒŒ ํ• ๋‹น๋˜๋ฉด์„œ ์œ ํœด ์ฝ”์–ด๊ฐ€ ์—†๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, User-Level ์“ฐ๋ ˆ๋“œ์— ๋น„ํ•ด ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๊ฐ€ ๋Š๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
Running ์ƒํƒœ์˜ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฐ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์€ ์Šค์ผ€์ค„๋ง์„ ์œ„ํ•ด Kernel-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ฆ‰, ์šด์˜์ฒด์ œ์—์„œ๋Š” Kernel-Level ์“ฐ๋ ˆ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง์„ ์œ„ํ•œ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์ด๋ฉด์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ ๋‹จ์œ„์ด๊ธฐ ๋•Œ๋ฌธ์—, Kernel-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š๋ƒ๊ฐ€ ์„ฑ๋Šฅ๊ณผ ์ง๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์€ User-Level ์“ฐ๋ ˆ๋“œ์™€ Kernel-Level ์“ฐ๋ ˆ๋“œ์˜ ๊ตฌ์„ฑ์„ Model์ด๋ผ๊ณ  ํ•œ๋‹ค.
์œ„ ๋‚ด์šฉ์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ๋‘ ์ข…๋ฅ˜์˜ ์“ฐ๋ ˆ๋“œ๋Š” ํƒ์ผ๋กœ์จ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์šด์˜์ฒด์ œ๊ฐ€ ์“ฐ๋ ˆ๋”ฉ์„ ์ง€์›ํ•œ๋‹ค๋ฉด ๋‘ ์ข…๋ฅ˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๋งž๋ฌผ๋ฆฌ๋ฉฐ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์— ์กด์žฌํ•˜๋Š” ์—ฌ๋Ÿฌ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์€ Kernel-Level ์“ฐ๋ ˆ๋“œ๋“ค์— Mapping๋˜์–ด ๋™์ž‘ํ•œ๋‹ค. ์—ฌ๋Ÿฌ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์ด ํ•˜๋‚˜์˜ Kernel-Level ์“ฐ๋ ˆ๋“œ์— Mapping ๋  ์ˆ˜๋„ ์žˆ๊ณ , ์—ฌ๋Ÿฌ Kernel-Level ์“ฐ๋ ˆ๋“œ์— Mapping์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Š” ์šด์˜์ฒด์ œ์˜ Model์— ๋”ฐ๋ผ Mapping์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. Model์— ๋Œ€ํ•ด์„  ์•„๋ž˜์—์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

3. ์ฐธ๊ณ 

Kernel ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๊ฒ ๋‹ค๋Š” ๊ฒƒ์€ ๊ธฐ์กด์—๋Š” Interrupt๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌ๋งŒ ํ•˜๋˜ Kernel์ด Trap์— ๋”ฐ๋ฅธ Block์„ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด Interrupt๋ฅผ ๋ฐ›๋Š” ๊ฒƒ๋„ ํ—ˆ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์–˜๊ธฐ๊ฐ€ ๋œ๋‹ค. ์ด์— ๋”ฐ๋ฅธ ๋™๊ธฐํ™”๊ฐ€ ์š”๊ตฌ๋˜๋ฏ€๋กœ User-Level๋ณด๋‹ค ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. Kernel-Level ์“ฐ๋ ˆ๋“œ๋Š” ์Šค์ผ€์ค„๋ง์„ ์œ„ํ•ด ์ž‘์—…์˜ ์›์ž์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ Interrupt๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๊ตฌ๊ฐ„์„ ๋‘ฌ์•ผํ•˜๊ณ , ์ด๋Ÿฌํ•œ ๊ตฌ๊ฐ„์„ Preemption Point๋ผ ํ•œ๋‹ค. Preemption Point๋ฅผ ๋งŽ์ด๋‘๋ฉด ์ฆ‰๊ฐ์ ์œผ๋กœ Interrupt์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ๋งŒํผ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹œ๊ฐ„๊ณผ ์ž์›์„ ์š”๊ตฌ๋ฐ›๊ฒŒ ๋˜๊ณ , ๋ฐ˜๋Œ€๋กœ ๋“ฌ์„ฑ๋“ฌ์„ฑ ๋‘๋ฉด ์ฆ‰๊ฐ์ ์ธ Interrupt์˜ ๋ฐ˜์‘ ์•ˆ ๋˜์ง€๋งŒ ์ž‘์—…์— ๋Œ€ํ•œ ๋ฐฉํ•ด๋ฅผ ์ƒ๋Œ€์ ์œผ๋กœ ๋œ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์™€ ๊ฐ™์€ Preemption Point๋Š” ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๊ด€์ ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ˆ ์˜ ์˜์—ญ์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

6) Model

Model์€ User-Level ์“ฐ๋ ˆ๋“œ์™€ Kernel-Level ์“ฐ๋ ˆ๋“œ์˜ Mapping ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

1. Many-to-One

Many-to-One์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ User-Level ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ Kernel-Level ์“ฐ๋ ˆ๋“œ๋กœ Mapping ๋˜๋Š” Model์„ ์˜๋ฏธํ•œ๋‹ค. ์ฃผ๋กœ ์šด์˜์ฒด์ œ๊ฐ€ ์“ฐ๋ ˆ๋”ฉ์„ ์ง€์›ํ•˜์ง€ ๋ชปํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ํ•ด๋‹น Model์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ Kernel-Level ์“ฐ๋ ˆ๋“œ๋งŒ Kernel์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜๋ ค๋Š” User-Level ์“ฐ๋ ˆ๋“œ๊ฐ€ Kernel-Level ์“ฐ๋ ˆ๋“œ์— Mapping ๋˜๋ฉด ๋‚˜๋จธ์ง€ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์€ Block ๋˜๋ฏ€๋กœ ์ง„์ •ํ•œ Concurrency๋Š” ์ง€์›ํ•˜์ง€ ๋ชปํ•œ๋‹ค. Kernel์˜ ์ž…์žฅ์—์„œ๋Š” Mapping๋œ ์—ฌ๋Ÿฌ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์„ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ ํ™˜๊ฒฝ์ด๋”๋ผ๋„ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ ๋™์‹œ ์ฒ˜๋ฆฌ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

2. One-to-One

One-to-One์€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” User-Level ์“ฐ๋ ˆ๋“œ๋“ค์„ ๊ทธ๋Œ€๋กœ Kernel-Level ์“ฐ๋ ˆ๋“œ์— Mapping ํ•˜๋Š” Model์„ ์˜๋ฏธํ•œ๋‹ค. ํ•ด๋‹น Model์„ ์ด์šฉํ•˜๋ฉด Many-to-One์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์ด Block ๋˜๋Š” ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์ด Kernel-Level ์“ฐ๋ ˆ๋“œ๋กœ Mapping ๋จ์— ๋”ฐ๋ผ Kernel ์ž…์žฅ์—์„œ๋Š” ๊ฐ User-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ณ„๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœ์—๋„ Block ๋˜์ง€ ์•Š๊ณ  ๋™์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ One-to-One์€ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ ํ™˜๊ฒฝ์˜ ์ด์ ์„ ์ฑ™๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๊ทธ ์ด๋ฉด์—๋Š” User-Level ์“ฐ๋ ˆ๋“œ์˜ ์ˆ˜ ๋งŒํผ Kernel-Level ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘์–ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. Kernel-Level ์“ฐ๋ ˆ๋“œ๋„ ํ•œ์ •๋œ ์ž์›์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์ž‘์ • ์ƒ์„ฑํ•ด๋‘”๋‹ค๊ณ  ๋ชจ๋‘ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ, ๊ทธ ๊ฐœ์ˆ˜์— ๋Œ€ํ•œ ๊ณ ๋ ค๊ฐ€ ๋™๋ฐ˜๋œ Model์ด ํ•„์š”ํ•˜๋‹ค.

3. Many-to-Many

Many-to-Many๋Š” ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์„ Kernel์— ์กด์žฌํ•˜๋Š” ์—ฌ๋Ÿฌ Kernel-Level ์“ฐ๋ ˆ๋“œ๋กœ Mapping ํ•˜๋Š” Model์„ ์˜๋ฏธํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Many-to-Many์˜ Kernel-Level ์“ฐ๋ ˆ๋“œ๋Š” User-Level ์“ฐ๋ ˆ๋“œ์™€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ์ ์€ ์ˆ˜ ๋งŒํผ ์ƒ์„ฑ๋˜์–ด ์ ์ ˆํžˆ ์Šค์ผ€์ค„๋ง๋˜๋ฏ€๋กœ One-to-One๊ณผ ๊ฐ™์ด ์“ฐ๋ ˆ๋“œ ๊ฐœ์ˆ˜์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋˜ํ•œ User-Level ์“ฐ๋ ˆ๋“œ์—์„œ ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋‚˜๋จธ์ง€ User-Level ์“ฐ๋ ˆ๋“œ๋“ค์€ Block๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ Many-to-One์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋„ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น Model์„ ์ด์šฉํ•˜๋ฉด Many-to-One์˜ User-Level ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ Block ๋ฌธ์ œ์™€ One-to-One์˜ ํ•œ์ •๋œ ์ž์› ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์€ Model์€ ํ”„๋กœ์„ธ์Šค ๋‹น ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Kernel-Level ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•ด ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์ •ํ•ด๋‘ ์œผ๋กœ์จ ์šด์šฉ๋œ๋‹ค.

7) ์šด์˜์ฒด์ œ์˜ ๋ณ€ํ™”์™€ ์ด์Šˆ

์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์ •๋ฆฝ๋˜๊ธฐ ์ด์ „์˜ ์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์ •๋ฆฝ๋˜๋ฉด์„œ ๊ธฐ์กด์˜ ํ”„๋กœ์„ธ์Šค์™€ ๊ด€๋ จ๋œ ์‹œ์Šคํ…œ ์ฝœ์— ๋Œ€ํ•œ Semantics๋ฅผ ์žฌ๊ณ ํ•  ํ•„์š”์„ฑ์ด ์ƒ๊ฒผ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ์ฝœ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์“ฐ๋ ˆ๋“œ์˜ ์ข…๋ฃŒ์— ๋Œ€ํ•ด์„œ๋„ ์—ฌ๋Ÿฌ ๊ด€์ ์ด ๋™๋ฐ˜๋˜์—ˆ๋‹ค. ๋˜ํ•œ ์“ฐ๋ ˆ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋“ ๊ฐ€, ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์„ ์œ„ํ•ด ๊ฐ ์“ฐ๋ ˆ๋“œ๊ฐ„ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ ํ˜„์žฌ ์šด์˜์ฒด์ œ๋Š” ์—ฌ๋Ÿฌ ๋ถ€๋ถ„๋“ค์— ๋Œ€ํ•ด ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋ฉด์„œ ๋ฐœ์ „ํ•ด์™”๋‹ค. ์šด์˜์ฒด์ œ์˜ ๋ณ€ํ™”๋“ค์€ ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ์˜ ๋ฐฉํ–ฅ์„ฑ์— ๋”ฐ๋ผ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ๋ฐœ์ „ํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ๋ถ€๋ถ„๋“ค์„ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ์ •๋„๋ฅผ ์งš์–ด๋ณผ ๊ฒƒ์ด๋‹ค.

1. ์‹œ์Šคํ…œ ์ฝœ

์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ ์ฝœ ์ค‘์—์„œ๋„ ํŠนํžˆ fork์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์ฃผ์š”ํ•˜๋‹ค. fork์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ ์ƒ์—์„œ ํ˜ธ์ถœ ์‹œ์—๋Š” ๊ธฐ์กด fork์™€ ํฌ๊ฒŒ ๋‹ค๋ฅผ ๊ฒƒ ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ fork๊ฐ€ ํ˜ธ์ถœ๋œ ๊ฒฝ์šฐ, ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋“ค์„ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ธ์ง€ fork๋ฅผ ์š”์ฒญํ•œ ์“ฐ๋ ˆ๋“œ๋งŒ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์ˆ˜๋ฐ˜๋œ๋‹ค.
์œ„์™€ ๊ฐ™์ด fork์— ๋Œ€ํ•œ ๋‘ ๋ฐฉ๋ฒ•์˜ ๊ณ ๋ฏผ์ด ์ˆ˜๋ฐ˜๋˜๋Š” ์ด์œ ๋Š” exec ํ•จ์ˆ˜ ๋•Œ๋ฌธ์ด๋‹ค. exec์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋กœ ๊ต์ฒดํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, fork๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ์— exec์„ ํ˜ธ์ถœํ•˜๋ฉด ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋“ค์ด ๊ต์ฒด๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด์ฐจํ”ผ ๊ต์ฒด๋  ์“ฐ๋ ˆ๋“œ๋“ค์— ๋Œ€ํ•œ ๋ณต์‚ฌ๋Š” ๋ถˆํ•„์š”ํ•˜๋ฏ€๋กœ fork๋ฅผ ํ•˜๊ณ  exec์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” fork๋ฅผ ์š”์ฒญํ•œ ์“ฐ๋ ˆ๋“œ๋งŒ์ด ๋ณต์‚ฌ๋˜์–ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ๋ฐ˜๋Œ€๋กœ exec์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ์˜ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Linux ์ƒ์—์„œ๋Š” 2๊ฐ€์ง€ ๋ฒ„์ „์˜ fork๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

2. Cancellation

Cancellation์ด๋ผ๊ณ  ํ•จ์€ ์“ฐ๋ ˆ๋“œ์˜ ์ข…๋ฃŒ์ด๊ธด ํ•˜๋‚˜ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์“ฐ๋ ˆ๋“œ์˜ ์ž‘์—…์ด ์ค‘์ง€๋œ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ๊ตฌ๋™ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ Cancellation์˜ ๊ณ ๋ฏผ์ด๋ผ ํ•จ์€ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ์ค‘์ง€ ๋ช…๋ น์„ ๋‚ด๋ ธ์„ ๋•Œ, ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์˜ ์ž‘์—…์„ ๋ชจ๋‘ ์ค‘์ง€ ์‹œํ‚ฌ ๋•Œ ๋‚˜ํƒ€๋‚œ๋‹ค.
ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ค‘์ง€ ํ–ˆ์„ ๋•Œ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์ž‘์—…์„ ์ค‘์ง€์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋œ๋‹ค. ํ•ด๋‹น ์ƒํ™ฉ์—์„œ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋“ค์ด ์ค‘์ง€๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ, ์ด๋ฏธ์ง€๋ฅผ ์ฝ์–ด์˜ค๋Š” ์“ฐ๋ ˆ๋“œ ์™ธ์—๋„ ํ•ด๋‹น ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘์—… ์ค‘์ธ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋“ค์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด๋ฏธ์ง€๋ฅผ ์ฝ์–ด์˜ค๋Š” ์ž‘์—…์„ ์ค‘์ง€ํ–ˆ๋‹ค๊ณ  ํ•ด์„œ, ๊ด€๋ จ ์“ฐ๋ ˆ๋“œ๋“ค์„ ๋ชจ๋‘ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์— ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€๊ฐ€ ๊ณ ๋ฏผ์˜ ํฌ์ธํŠธ์ด๋‹ค.
ํ•ด๋‹น ์ƒํ™ฉ์—์„œ๋Š” ์ž์›์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์ผ ์ด๋ฏธ์ง€๋ฅผ ์ฝ์–ด์˜ค๋Š” ์“ฐ๋ ˆ๋“œ๋“ค์—๊ฒŒ ํ• ๋‹น๋œ ์–ด๋–ค ์ž์›์„ ๊ด€๋ จ ์“ฐ๋ ˆ๋“œ์™ธ์— ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋“ค์ด ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด, ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๋“ค์„ ๋ชจ๋‘ ์ข…๋ฃŒํ•˜๋Š” ํ–‰์œ„๊ฐ€ ์ข…๋ฃŒ์™€ ํ•จ๊ป˜ ์“ฐ๋ ˆ๋“œ ๋‚ด์˜ ๋ชจ๋“  ์ž์› ๋ฐ˜ํ™˜์„ ์•ผ๊ธฐํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ์ฝ์–ด์˜ค๋Š” ์“ฐ๋ ˆ๋“œ ์™ธ์˜ ๋‚˜๋จธ์ง€ ์“ฐ๋ ˆ๋“œ๋“ค์€ ์ด๋ฏธ ๋ฐ˜ํ™˜๋œ ์ž์›์— ๋Œ€ํ•ด์„œ ์ฐธ์กฐ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

3. Thread Pool

์“ฐ๋ ˆ๋“œ์˜ ์žฆ์€ ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ์ด ๋ฐ˜๋ณต๋˜๋Š” ์ƒํ™ฉ์—์„œ ์“ฐ๋ ˆ๋“œ์˜ ์ƒ์„ฑ์€ ์‹ค์ œ๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋™์ž‘ํ•˜๋Š” ์‹œ๊ฐ„๋ณด๋‹ค ๊ธด ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์“ฐ๋ ˆ๋“œ์˜ ์ƒ์„ฑ ์ž์ฒด๋Š” ์‹œ์Šคํ…œ ์ƒ์˜ ์ž์›์„ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹œ์Šคํ…œ์˜ ๋™์ž‘์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ๋Œ€ ์“ฐ๋ ˆ๋“œ ๊ฐœ์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ ์—ญ์‹œ ํ•„์š”ํ•˜๋‹ค.
์œ„ 2๊ฐ€์ง€์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์œผ๋กœ Thread Pool์ด ์ œ์‹œ๋˜์—ˆ๋‹ค. Thread Pool์„ ๋‘ ์œผ๋กœ์จ ์ •ํ•ด์ง„ ์ˆ˜๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋“ค์„ Pool์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ด๋‘๊ณ  ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด Pool์—์„œ ๊ฐ€์ ธ์˜ค๊ณ , ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ž‘์—…์ด ๋๋‚˜๋ฉด ๋ฐ”๋กœ ์†Œ๋ฉธ ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์‹œ Pool์— ๋„ฃ๋Š” ์‹์œผ๋กœ ์šด์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
Thread Pool์˜ ๋™์ž‘ ๋•๋ถ„์— ์ œํ•œ๋œ ์ˆ˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘๋ฉด์„œ ์‹œ์Šคํ…œ ์ƒ์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๋ฟ ์•„๋‹ˆ๋ผ, ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•ด ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์— ๋Œ€ํ•ด ๋“์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Thread Pool์— ์–ผ๋งŒํผ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘˜์ง€๋Š” ์‹œ์Šคํ…œ ํ˜น์€ ๋ฉ”๋ชจ๋ฆฌ ํ˜น์€ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์˜ ์ˆ˜ ๋“ฑ์„ ํ†ตํ•ด ์ถ”์ •์น˜๋กœ ๊ฒฐ์ •ํ•œ๋‹ค.

4. IPC

๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ ํ™˜๊ฒฝ์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์ด ํ•„์š”ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ๋„ ์“ฐ๋ ˆ๋“œ ๊ฐ„์˜ ํ†ต์‹ ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฒ• ํ˜น์€ ๋ฉ”์„ธ์ง€ ๊ตํ™˜ ๊ธฐ๋ฒ• ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ IPC๊ฐ€ ์ด์šฉ๋˜์—ˆ๋Š”๋ฐ, ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์—์„œ๋Š” ์“ฐ๋ ˆ๋“œ ๊ฐ„์˜ ํ†ต์‹ ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์„๊นŒ?
๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์“ฐ๋ ˆ๋“œ ๊ฐ„์˜ ํ†ต์‹ ์— ๋Œ€ํ•ด์„œ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฒ•์„ ์ฃผ๋กœ ์ด์šฉํ–ˆ๋Š”๋ฐ, ์ด๋Š” ๊ฐ ์“ฐ๋ ˆ๋“œ๋“ค๊ฐ„ ๊ณต์œ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์žˆ์–ด์„œ ๋ฉ”์„ธ์ง€ ๊ตํ™˜ ๊ธฐ๋ฒ•์— ๋น„ํ•ด ํ›จ์”ฌ ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์—์„œ ํ™œ์šฉํ•˜๋Š” ๋ฉ”์„ธ์ง€ ๊ตํ™˜ ๊ธฐ๋ฒ•์˜ IPC๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ตœ์†Œํ™” ๋˜์—ˆ๊ณ , ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์—์„œ์˜ IPC๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์— ๋น„ํ•ด ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์™”๋‹ค. ๋‹ค๋งŒ ์ด์™€ ๊ฐ™์ด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ณต์œ ๋˜๋Š” ์ž์›์— ๋Œ€ํ•œ ๋™๊ธฐํ™”๊ฐ€ ์š”๊ตฌ๋˜๋Š”๋ฐ, ์ด๋Š” Kernel์˜ ๋ชซ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์˜ ๋ชซ์ด๋‹ค.
๋™๊ธฐํ™”์˜ ์–ด๋ ค์›€ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์ˆ˜ํ•˜๊ณ  ์‹œ๊ทธ๋„, ํŒŒ์ดํ”„, ๋ฉ”์„ธ์ง€ ํ, ์†Œ์ผ“ ๋“ฑ์˜ ๋ฉ”์„ธ์ง€ ๊ตํ™˜ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์ธ ๋””์ž์ธ ์ด์Šˆ๊ฐ€ ์š”๊ตฌ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ๊ทธ๋„์„ ๋ณด๋ƒˆ์„ ๋•Œ, ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋“ค ์ค‘ ์–ด๋–ค ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฐ›์„ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋™๋ฐ˜๋œ๋‹ค. (์“ฐ๋ ˆ๋“œ๋ฅผ ํŠน์ •ํ•˜์—ฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ๋ฉ”์„ธ์ง€ ๊ตํ™˜ ๊ธฐ๋ฒ•์˜ IPC๋Š” ๋ชจ๋‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ํŠน์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.)
๋งŒ์ผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์“ฐ๋ ˆ๋“œ์™€ ํ†ต์‹ ์„ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์˜ IPC์™€ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํ†ต์‹ ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„์˜ˆ ์—†์ง€๋Š” ์•Š์ง€๋งŒ, ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์˜ ์žฅ์ ์„ ์‚ด๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค๊ณ„๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

3. Synchronization

Philosophers๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋„ ๋งˆ์ณค๊ณ , ์—ฌ๊ธฐ์„œ ๋‚˜์˜ค๋Š” ๋Œ€๋žต์ ์ธ ๊ฐœ๋…๋“ค๋„ ์‚ดํŽด๋ณด์•˜๋‹ค. ๊ฒฐ๊ตญ์—๋Š” ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ๊ฐœ๋…๋“ค์— ๋ถˆ๊ณผํ•œ๋ฐ, (์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ฝ”๋“œ๋“ค์ด ์˜์‚ฌ ์ฝ”๋“œ์ด๊ธฐ๋„ ํ–ˆ๊ณ ) ์ •ํ™•ํ•˜๊ฒŒ ์™œ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ์ง€ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์šฉ์–ด ๋ช‡ ๊ฐœ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด์„œ ๊ทธ ๋‚ด์šฉ๋“ค์„ ์•Œ์•„๋ณด์ž.

1) Data Race

๋™๊ธฐํ™”๋ผ ํ•จ์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ (Data Consistency)๋ฅผ ๋ณด์žฅํ•˜๋Š” ํ–‰์œ„์ด๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด ๊ณต์œ ๋˜๊ณ  ์ด๋ฅผ ์กฐ์ž‘ํ•˜๋ ค๋Š” ํ–‰์œ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ์–ด์ง„ ์ƒํ™ฉ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒฝ์Ÿ ์ƒํƒœ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„Data Race๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋™๊ธฐํ™” ๋˜์ง€ ์•Š์œผ๋ฉด Data Race ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ์œ ์ง€๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.
/* ** Shared Data Balance */ Balance = 100; /* ** This is A Process (Balance is Shared) */ Balance += 200; /* ** This is B Process (Balance is Shared) */ Balance += 300; /* ** Where to Branch? */ if (isBalanceEqual(600)) return (CONSISTENT); else return (INCONSISTENT);
C
Balance๋ฅผ ์กฐ์ •ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” AA์™€ BB๊ฐ€ ์žˆ๋‹ค. ๋งŒ์ผ Balance๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ตฌ๋ฌธ์ด ์ฃผ์–ด์ง„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ”„๋กœ์„ธ์Šค ๋ณ„๋กœ ๋‚˜๋‰˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฃผ์–ด์ ธ ์žˆ๋‹ค๋ฉด, ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ž๋ช…ํ•˜๋‹ค. Balance๊ฐ€ ์ผ๊ด€์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” Context Switch๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
๋‹จ์ˆœํžˆ ์ฃผ์–ด์ง„ ์ฝ”๋“œ๋ฅผ ๋ณด์•˜์„ ๋•Œ๋Š” Context Switch๋ฅผ ๊ณ ๋ คํ•œ๋‹ค ํ•˜๋”๋ผ๋„ ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ํ•œ ์ค„์˜ ์ฝ”๋“œ๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค. ํ”„๋กœ์„ธ์Šค AA์—์„œ ๋จผ์ € Balance๋ฅผ ์กฐ์ •ํ•œ ํ›„ Context Switch๊ฐ€ ์ผ์–ด๋‚˜์„œ ํ”„๋กœ์„ธ์Šค BB๋ฅผ ์ฒ˜๋ฆฌํ•˜๋“ , ๋ฐ˜๋Œ€๋กœ ํ”„๋กœ์„ธ์Šค BB์—์„œ ๋จผ์ € Balance๋ฅผ ์กฐ์ •ํ•œ ํ›„ Context Switch๊ฐ€ ์ผ์–ด๋‚˜์„œ ํ”„๋กœ์„ธ์Šค AA๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋“  ๊ทธ ๊ฒฐ๊ณผ๋Š” 600์œผ๋กœ ๋™์ผํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” Context Switch์˜ ๋ฐœ์ƒ์„ ์ฝ”๋“œ ํ•œ ์ค„ ๋‹จ์œ„๋กœ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ฝ”๋“œ ํ•œ ์ค„์€ ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ Instruction์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ ํ•œ ์ค„์€ ๊ฒฐ์ฝ” Atomicํ•˜์ง€ ์•Š๋‹ค.
Atomic? ์›์ž์„ฑ์„ ์˜๋ฏธํ•˜๋Š” Atomic์ด๋ผ๋Š” ์„ฑ์งˆ์€ ์›์ž๋ผ๋Š” ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์—†๋Š” ์„ฑ์งˆ์„ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์›์ž์„ฑ ์กฐ์ž‘ (Atomic Operation)์ด๋ผ ํ•จ์€ Atomic ์„ฑ์งˆ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์˜๋„์ ์ธ ์กฐ์ž‘์„ ์˜๋ฏธํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ Atomicํ•˜์—ฌ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์˜ ํŒ๋‹จ ๊ธฐ์ค€์€ Interruptible์ด๋‹ค. ์›์ž์„ฑ์ด ๋ณด์žฅ๋œ ์ฝ”๋“œ๋“ค์€ Interrupt๋ฅผ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. Instruction์€ Atomicํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ์ˆ˜ํ–‰ ์ค‘์—๋Š” Interrupt๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐ˜๋ฉด์— ์ฝ”๋“œ ํ•œ ์ค„์€ ์—ฌ๋Ÿฌ Instruction์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— Atomicํ•˜์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ ํ•œ ์ค„์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ Interrupt๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Context Switch๋Š” Dispatcher์˜ Interrupt์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ์ฝ”๋“œ ํ•œ ์ค„ ์ˆ˜ํ–‰ ์ค‘์—๋„ Context Switch๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
/* ** This is A Process */ Register1 = Balance; Register1 = Register1 + 200; Balance = Register1; /* ** This is B Process */ Register2 = Balance; Register2 = Register2 + 300; Balance = Register2;
C
Context Switch๋Š” ์šด์˜์ฒด์ œ์˜ Dispatcher ํ˜ธ์ถœ์— ๋”ฐ๋ฅธ Interrupt์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, Instruction์€ Atomic ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Instruction ๋„์ค‘์—๋Š” Interrupt๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Context Switch๋Š” Instruction ๋‹จ์œ„๋กœ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด์˜ Balance์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์œ„ ์ฝ”๋“œ ๋ธ”๋Ÿญ๊ณผ ๊ฐ™์ด ์น˜ํ™˜๋˜์–ด ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ํ”„๋กœ์„ธ์Šค AA ํ˜น์€ BB์˜ ์–ด๋–ค Instruction ์‚ฌ์ด์—๋„ Context Switch๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์œ„ Instruction๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ Context Switch๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋ฅผ ๊ฐ€์ •ํ•ด๋ณด์ž.
/* ** Ti : Time Quantum i ** ** T0 : Process A / Register1 = Balance / [Register1 = 100] ** ** T1 : Process A / Register1 = Register1 + 200 / [Register1 = 300] ** ** T2 : Process B / Register2 = Balance / [Register2 = 100] ** ** T3 : Process B / Register2 = Register2 + 300 / [Register2 = 400] ** ** T4 : Process A / Balance = Register1 / [Balance = 300] ** ** T5 : Process B / Balance = Register2 / [Balance = 400] */
C
์ฃผ์–ด์ง„ ์ฝ”๋“œ ๋ธ”๋Ÿญ์—์„œ ๋ณด์ด๋Š” ๋Œ€๋กœ ์Šค์ผ€์ค„๋ง ๋˜์—ˆ์„ ๋•Œ, ํ”„๋กœ์„ธ์Šค AA์˜ Balance๋Š” 300์ด๊ณ  ํ”„๋กœ์„ธ์Šค BB์˜ Balance๋Š” 400์ด ๋˜์–ด ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฒƒ์ด Critical Section์ด๋‹ค.

2) Critical Section

/* ** Entry Section ** Critical Section ** ** Exit Section ** Remainder Section */
C
Critical Section์ด๋ผ ํ•จ์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋“ค์ด ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ์žˆ์„ ๋•Œ, ์ด๋ฅผ ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ์˜์—ญ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด์ „ ํ•ญ๋ชฉ์—์„œ ๋ณด์•˜๋“ฏ, Critical Section์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง„์ž…ํ–ˆ์„ ๋•Œ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง„์ž…ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. Critical Section์— ๋Œ€ํ•œ ์˜์‚ฌ ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™๋‹ค. Critical Section์„ ์ด์šฉํ•˜์—ฌ ์˜ˆ์‹œ์—์„œ ๋“ค์—ˆ๋˜ Balance์™€ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ๋™๊ธฐํ™”๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜ ์ œ์‹œ๋œ 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด๋“ค ์ค‘์—์„œ๋„ ํŠนํžˆ Mutual Exclusion๊ณผ Progress๋Š” ํ•„์ˆ˜์ ์ด๋‹ค.

1. Mutual Exclusion

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ Critical Section์— ์ง„์ž…ํ•ด์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์€ Critical Section์— ์ง„์ž…ํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค.

2. Progress

Critical Section์ด ์–ด๋–ค ํ”„๋กœ์„ธ์Šค์—๊ฒŒ๋„ ์ ์œ ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  Critical Section์— ์ง„์ž…ํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ทธ ์ค‘ ํ•œ ํ”„๋กœ์„ธ์Šค๋Š” Critical Section์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

3. Bounded Waiting

์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ Critical Section์— ์ง„์ž…ํ•˜๊ณ ์ž ํ•  ๋•Œ, ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฌดํ•œํžˆ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋„๋ก ๋Œ€๊ธฐ ์‹œ๊ฐ„์— ์ ์ ˆํ•œ ์ œํ•œ์ด ํ•„์š”ํ•˜๋‹ค.

3) Synchronization

1. ๋‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

/* ** Shared Variables ** int turn; ** turn = 0; ** turn == 0 ์ด๋ผ๋ฉด, ํ”„๋กœ์„ธ์Šค A๊ฐ€ Critical Section์— ์ง„์ž… ** turn == 1 ์ด๋ผ๋ฉด, ํ”„๋กœ์„ธ์Šค B๊ฐ€ Critical Section์— ์ง„์ž… */ /* ** ํ”„๋กœ์„ธ์Šค A */ while (turn != 0) ; Critical Section turn = 1; Remainder Section /* ** ํ”„๋กœ์„ธ์Šค B */ while (turn != 1) ; Critical Section turn = 0; Remainder Section
C
๋‘ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์œ„์™€ ๊ฐ™์ด turn ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ ๊ฒฝ์šฐ์—๋Š” Mutual Exclusion์ด๋ผ๋Š” ์กฐ๊ฑด์€ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜๋จธ์ง€ ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง„ ์•Š๋Š”๋‹ค. ํ”„๋กœ์„ธ์Šค AA, ํ”„๋กœ์„ธ์Šค AA, ํ”„๋กœ์„ธ์Šค AA ์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์Šค์ผ€์ค„๋ง ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‘ ๋ฒˆ์งธ ํ”„๋กœ์„ธ์Šค AA์—์„œ turn ๊ฐ’์ด 0์ด ๋  ์ผ์ด ์—†์–ด Progress๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

2. ๊ฐœ์„ ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

/* ** Shared Variables ** bool flag[2]; ** flag[0] = flag[1] = false; ** flag[0] == true ๋ผ๋ฉด, ํ”„๋กœ์„ธ์Šค A๊ฐ€ Critical Section์— ์ง„์ž… ** flag[1] == true ๋ผ๋ฉด, ํ”„๋กœ์„ธ์Šค B๊ฐ€ Critical Section์— ์ง„์ž… */ /* ** ํ”„๋กœ์„ธ์Šค A */ flag[0] = true; while (flag[1]) ; Critical Section flag[0] = false; Remainter Section /* ** ํ”„๋กœ์„ธ์Šค B */ flag[1] = true; while (flag[0]) ; Critical Section flag[1] = false; Remainder Section
C
๊ธฐ์กด์— turn์„ ์ด์šฉํ–ˆ๋˜ ๋ฐฉ์‹์„ ๊ฐœ์„ ํ•˜์—ฌ ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” flag ๋ฐฐ์—ด์„ ๋‘์—ˆ๋‹ค. ์œ„ ์˜ˆ์‹œ๋Š” ์ด์ „ ์˜ˆ์‹œ์™€ ๊ตฌ์กฐ๊ฐ€ ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์— Mutual Exclusion์„ ๋งŒ์กฑํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋‚˜๋จธ์ง€ ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•ด๋‹น ์˜ˆ์‹œ์—์„œ๋Š” ์ด์ „ ์˜ˆ์‹œ์˜ ๋ฐ˜๋ก€์ธ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์—ฐ์†์ ์ธ ์Šค์ผ€์ค„๋ง์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค AA์™€ BB๊ฐ€ ๋™์‹œ์— flag๋ฅผ true๋กœ ๋ฐ”๊พธ๊ฒŒ ๋˜๋ฉด ์„œ๋กœ while์—์„œ ์ •์ฒด๋˜์–ด ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋„ Critical Section์— ์ง„์ž…ํ•˜์ง€ ๋ชปํ•˜์—ฌ Progress๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

3. Perterson Solution

/* ** Shared Variables ** int turn; ** bool flag[2]; ** turn = 0; ** flag[0] = flag[1] = false; ** turn == 1 ์ด๊ณ  flag[1] == true ๋ผ๋ฉด, ํ”„๋กœ์„ธ์Šค A๊ฐ€ ๋Œ€๊ธฐ ** turn == 0 ์ด๊ณ  flag[0] == true ๋ผ๋ฉด, ํ”„๋กœ์„ธ์Šค B๊ฐ€ ๋Œ€๊ธฐ */ /* ** ํ”„๋กœ์„ธ์Šค A */ flag[0] = true; turn = 1; while (flag[1] && turn == 1) ; Critical Section flag[0] = false; Remainder Section /* ** ํ”„๋กœ์„ธ์Šค B */ flag[1] = true; turn = 0; while (flag[0] && turn == 0) ; Critical Section flag[1] = false; Remainder Section
C
Peterson Solution์€ ๊ธฐ์กด ๋‘ ๋ฐฉ๋ฒ•์—์„œ ์ œ์‹œํ•œ turn๊ณผ flag ๋ฐฐ์—ด์„ ๋ชจ๋‘ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์šฐ์„  ์ด์ „ ๋ฐฉ๋ฒ•๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Mutual Exclusion์€ ๋งŒ์กฑํ•œ๋‹ค. ๋˜ํ•œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์Šค์ผ€์ค„๋ง ๋˜๋”๋ผ๋„ flag ๋ฐฐ์—ด ๋•๋ถ„์— ํ•ด๋‹น ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” Progress์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ์ด์ „ ๋ฐฉ์•ˆ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— flag๋ฅผ true๋กœ ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋„, ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” turn์ด๋ผ๋Š” ๋ณ€์ˆ˜ ๋•๋ถ„์— turn ๊ฐ’์„ 0 ๋˜๋Š” 1 ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ๋งŒ ์œ ์ง€ํ•˜์—ฌ while์—์„œ ์ •์ฒด๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Progress๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. Progress๋ฅผ ๋งŒ์กฑํ•˜๋ฏ€๋กœ Bounded Waiting์€ ์ ์ ˆํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
/* ** ํ”„๋กœ์„ธ์Šค A */ do { flag[0] = true; turn = 1; while (flag[1] == ture && turn == 1) ; Critical Section flag[0] = false; Remainder Section } while (1); /* ** ํ”„๋กœ์„ธ์Šค B */ do { flag[1] = true; turn = 2; while (flag[2] == true && turn == 2) ; Critical Section flag[1] = false; Remainder Section } while (1); /* ** ํ”„๋กœ์„ธ์Šค C */ do { flag[2] = true; turn = 0; while (flag[0] == true && turn == 0) ; Critical Section flag[2] = false; Remainder Section } while (1);
C
Peterson Solution์ด ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑ์‹œํ‚ด์—๋„ ํ™•์žฅ์„ฑ์— ์žˆ์–ด์„œ ํ•œ๊ณ„์ ์ด ์กด์žฌํ•œ๋‹ค. ์œ„ ์ฝ”๋“œ์— ๊ธฐ์žฌ๋œ ๊ฒƒ์ฒ˜๋Ÿผ 3๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ Peterson Solution์€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์œ„ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„  ๋Œ€ํ‘œ์ ์œผ๋กœ turn ๊ฐ’ ๋งŒ์œผ๋กœ ๋ฐ˜๋ก€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. turn ๊ฐ’์—๋Š” 0 ํ˜น์€ 1 ์™ธ์—๋„ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ ๋น„ํ•ด, turn ๊ฐ’์— ๋Œ€ํ•œ ๊ณ ๋ ค ์ž์ฒด๋Š” ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ด๋ค„์ง€๋ฏ€๋กœ 2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ Critical Section์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Mutual Exclusion์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.
๋งŒ์ผ Peterson Solution์—์„œ ์š”๊ตฌ๋˜๋Š” ์ž๋ฃŒ๋“ค์„ ์ˆ˜์ •ํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜์—ฌ๋„, 2๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ๋™๊ธฐํ™”๊ฐ€ ์•„๋‹Œ ๊ทธ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด์„œ ์™„๋ฒฝํžˆ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์–ด๋ ค์šด ์ผ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด Peterson Solution๊ณผ ๊ฐ™์ด ์ฝ”๋“œ ์ƒ์˜ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ์™ธ์— ๋‹ค๋ฅธ ๊ฐˆ๋ž˜์˜ ํ•ด๊ฒฐ์ฑ…์ด ํ•„์š”ํ•˜๋‹ค.

4. Instruction Solution

Peterson Solution ์ดํ›„์— ์ œ์‹œ๋œ ๋™๊ธฐํ™” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” Critical Section์„ Atomic Operation์œผ๋กœ ๋‘์–ด Critical Section์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” Interrupt๋ฅผ ๋ฐ›์ง€ ์•Š๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ํ•ด๊ฒฐ์ฑ…์€ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ Interrupt๋ผ๋Š” Kernel ๋‹จ์œ„์˜ ์ž‘์—…์„ User ๋‹จ์œ„์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์ œ์–ดํ•˜๋Š” ํ–‰์œ„๊ฐ€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœ์„ธ์Šค ๋‚ด์— Critical Section์œผ๋กœ ์ง€์ •ํ•œ ์˜์—ญ์ด ๋ฐฉ๋Œ€ํ•˜๋‹ค๋ฉด ์ด๋Š” ๊ณง ํ”„๋กœ์„ธ์Šค๋“ค์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์˜ ์ฆ๊ฐ€๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์Šค์ผ€์ค„๋ง์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋˜ํ•œ Kernel-Level ์“ฐ๋ ˆ๋“œ ๋„์ž…์— ๋”ฐ๋ฅธ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ ๊ฐ ์ฝ”์–ด๋งˆ๋‹ค Atomic Operation์„ ์ˆ˜ํ–‰ํ•˜๋ฉด Critical Section์— ๋Œ€ํ•œ ๋™์‹œ ์ ‘๊ทผ์„ ๋ง‰์„ ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.
/* ** Acquire LOCK ** Critical Section ** ** Release LOCK ** Remainder Section */
C
๊ฒฐ๊ณผ์ ์œผ๋กœ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์€ Atomic์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์ด์ „๊ณผ ๊ฐ™์€ Atomic ๋ณด์žฅ์„ ์œ„ํ•œ ์ง์ ‘์ ์ธ Interrupt ์กฐ์ž‘๋ณด๋‹ค๋Š” ์กฐ๊ธˆ ๋” ์›์ดˆ์ ์ธ ๋ฐฉ๋ฒ•์ด ์ œ์‹œ๋˜์—ˆ๋‹ค. Critical Section ์ง„์ž…์— ๋Œ€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์ „ ๋ฐฉ๋ฒ•๋“ค์ฒ˜๋Ÿผ ์†Œํ”„ํŠธ์›จ์–ด ์ƒ์—์„œ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ณต์žกํ•ด์ง€์ง€๋งŒ, ํ•˜๋“œ์›จ์–ด ์ƒ์—์„œ ํ•ด๊ฒฐํ•  ๊ฒฝ์šฐ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ์ฐฉ์•ˆํ•˜์—ฌ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ Instruction Solution์ด ์ œ์‹œ๋˜์—ˆ๋‹ค. ์œ„ ์˜์‚ฌ ์ฝ”๋“œ์—์„œ Acquire์™€ Release์— ํ•ด๋‹นํ•˜๋Š” ์ž‘์—…์„ Instruction์œผ๋กœ ๋‘์–ด ๋ง ๊ทธ๋Œ€๋กœ Atomic ํ•˜๊ฒŒ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.
Critical Section์— ์ง„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒํ•œ์„ ํš๋“ํ•˜๋Š” ํ–‰์œ„ (Acquire)๋ฅผ LOCK, ๋ฐ˜๋Œ€๋กœ Critical Section์—์„œ ๋‚˜๊ฐˆ ๋•Œ ๊ถŒํ•œ์„ ๋„˜๊ธฐ๋Š” ํ–‰์œ„ (Release)๋ฅผ UNLOCK์ด๋ผ ํ•œ๋‹ค.
๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ Atomicํ•œ Instruction์€ ํฌ๊ฒŒ 2์ข…๋ฅ˜๋กœ, Test-and-Set๊ณผ Swap์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ๊ฐ Instruction์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ด๋“ค์„ ์ž˜ ์‚ดํŽด๋ณด๋ฉด, LOCK์„ ์žก๋Š” ๊ณผ์ •์—์„œ๋Š” Context Switch๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋‚˜ LOCK์„ ์žก๊ณ  ๋‚œ ํ›„์— ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ Critical Section์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” Context Switch๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Context Switch ๋œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” LOCK์„ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Critical Section์— ์ง„์ž…ํ•˜์ง€ ๋ชปํ•œ ์ฑ„๋กœ Busy Waiting์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, Instruction Solution์ด ํ›Œ๋ฅญํ•˜๊ฒŒ Mutual Exclusion๊ณผ Progress์— ๋Œ€ํ•œ ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ, Bounded Waiting๊นŒ์ง€ ํ•ด๊ฒฐํ•ด์ฃผ์ง€๋Š” ๋ชป ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
Test-and-Set
Swap
Instruction Solution์˜ ํ•œ๊ณ„์ ์€ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ์„๊นŒ? Bounded Waiting์˜ ๊ฒฝ์šฐ ๋™๊ธฐํ™” ๋ฌธ์ œ์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋“ค์„ Instruction์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช… ์–ด๋ ค์›€์ด ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์™€ ๊ฐ™์€ ํ•ด๊ฒฐ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งก๊ฒจ์•ผ ํ•˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์„ ๊ธฐ๋Œ€ํ•˜๊ธฐ์—๋„ ์–ด๋ ค์›€์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™๊ธฐํ™”์— ๋Œ€ํ•ด ๋ณด๋‹ค Primitiveํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์š”๊ตฌ๋œ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์•Œ๊ณ  ์žˆ๋Š” mutex์™€ semaphore ์—ญ์‹œ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋˜๋Š” Primitive ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
๋ฌผ๋ก  ์˜๋„์ ์œผ๋กœ Bounded Waiting์— ๋Œ€ํ•ด์„œ Busy Waiting์„ ํ—ˆ์šฉํ•˜๋Š” ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•œ๋‹ค. mutex ํ˜น์€ semaphore์™€ ๊ฐ™์€ Primitive์— ๋Œ€ํ•ด์„  LOCK์„ ์žก์ง€ ๋ชปํ•œ ํ”„๋กœ์„ธ์Šค๋Š” Sleep ์ƒํƒœ๋กœ ๋งŒ๋“  ๋’ค์— Context Switch๋ฅผ ํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋‘๋Š”๋ฐ ๋ฐ˜ํ•ด, spinlock๊ณผ ๊ฐ™์€ Primitive๋Š” Sleep ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด Context Switch๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Busy Waiting์„ ํ•˜๋ฉฐ LOCK์„ ๊พธ์ค€ํžˆ ์žก์œผ๋ ค ํ•œ๋‹ค. spinlock๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์€ Context Switch๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๋งŒํผ ์—ฐ์‚ฐ์— ๋“์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด์™€ ๊ฐ™์€ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„  Critical Section์ด ์•„์ฃผ ์งง์•„์•ผ ํ•œ๋‹ค. (์ฆ‰, Busy Waiting์ด ๋ฌด์กฐ๊ฑด ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ์ƒํ™ฉ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. spinlock์˜ ๊ฒฝ์šฐ์—” Busy Waiting์ด ์•„์ฃผ ์งง๋‹ค๋Š” ๊ทผ๊ฑฐ๋ฅผ ํ†ตํ•ด Bounded Waiting ์กฐ๊ฑด์ด ๋งŒ์กฑ๋œ๋‹ค.)

4. Synchronization Primitive & Deadlock

mutex์™€ semaphore์˜ ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜ External Functions์— <pthread.h>์™€ <semaphore.h>์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ ๋งํฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” mutex์™€ semaphore์™€ ๊ฐ™์€ Primitive๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…๋งŒ ๋‹ค๋ฃฌ๋‹ค.

1) Synchronization Primitive

์šฐ์„  Primitive์˜ ์ •์˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. Synchronization Primitive๋ฅผ ์˜๋ฏธํ•˜๋Š” Primitive๋Š” ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ฃผ๋กœ ์šด์˜์ฒด์ œ ๋‹จ์œ„์—์„œ ์ œ๊ณต๋˜๋Š” ์„œ๋น„์Šค์ด๋‹ค. Primitive๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ฉฐ, ๋Œ€์ฒด์ ์œผ๋กœ Instruction Solution์—์„œ ๋‚˜์™”๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Atomic Operation์„ ํฌํ•จํ•œ Memory Barriers, Context Switch ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ๋‚ฎ์€ ๋ ˆ๋ฒจ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์กŒ๋‹ค.
mutex, event, condional variables, semaphore ๋“ฑ์ด Primitive์— ํ•ด๋‹น๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธ€์—์„œ ์„ค๋ช…๋œ Critical Section ์ž์ฒด๋Š” ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•œ ๊ฒฝ๋กœ์— ๋ถˆ๊ณผํ•˜๊ณ  ๋™๊ธฐํ™”์˜ ๋Œ€์ƒ์ด๊ธฐ ๋•Œ๋ฌธ์— Primitive๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ์ด์ „์— ์ œ์‹œ๋œ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋“ค ๋Œ€์‹ ์— mutex, semaphore์™€ ๊ฐ™์ด ์ œ์‹œ๋œ Primitve๋ฅผ ์ด์šฉํ•˜์—ฌ Critical Section์„ ๋ณดํ˜ธํ•˜๋ฉด ๋œ๋‹ค.
monitor ๊ธฐ๋ฒ•์€ ์กฐ๊ธˆ ๋” ๋†’์€ ๋ ˆ๋ฒจ์˜ ๋™๊ธฐํ™” ๋„๊ตฌ์ด์ง€๋งŒ, ์ƒํ™ฉ์— ๋”ฐ๋ผ Primitive๋กœ ์ทจ๊ธ‰๋˜๊ธฐ๋„ ํ•œ๋‹ค. monitor์˜ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๋กœ๋Š” Java์˜ synchronized์™€ DB์˜ transaction ๋“ฑ์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜์—ญ์„ ์˜๋ฏธํ•˜๋Š” Critical Section๊ฐ€ ์•„๋‹Œ, ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ Primitive๋กœ์จ Critical Section์ด๋ผ๋Š” ๊ฒƒ๋„ ์กด์žฌํ•œ๋‹ค.
/* ** Busy Waiting */ while (Until Acquire LOCK) ; Critical Section Release LOCK; Remainder Section
C
์œ„์—์„œ ๋ช…์‹œ๋œ ๊ฒƒ์„ ํฌํ•จํ•œ ๋Œ€๋ถ€๋ถ„์˜ Primitive๋“ค์€ LOCK์„ ์ทจ๋“ํ•˜์ง€ ๋ชปํ•œ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•˜์—ฌ ๋Œ€์ฒด์ ์œผ๋กœ ๋ฌด์ž‘์ • Busy Waiting์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Sleep ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด Sleep Queue์— ๋ณด๊ด€ํ•œ๋‹ค. ์ด์— ๋”ฐ๋ผ Context Switch๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ Busy Waiting์„ ํ†ตํ•ด ๋‚ญ๋น„๋˜๋Š” CPU ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.
๋ฌผ๋ก  Busy Waiting์ด ๋ฌด์กฐ๊ฑด ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์•„์ฃผ ์งง์€ ์‹œ๊ฐ„๋งŒ Busy Waiting์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๋Š” Critical Section ์ด๋ผ๋ฉด Context Switch๋ฅผ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” Busy Waiting์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” spinlock๊ณผ ๊ฐ™์€ Primitive๋„ ์žˆ๋‹ค.
์ด ๋•Œ Sleep ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ, ์ด ๋•Œ Primitive๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Sleep Queue๋Š” ์Šค์ผ€์ค„๋Ÿฌ์˜ Sleep Queue์™€ ๋ณ„๊ฐœ๋ผ๋Š” ์ ์„ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด Sleep ์ƒํƒœ๊ฐ€ ๋œ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ์Šค์ผ€์ค„๋ง์„ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค๋“ค๊ณผ ์—ฎ์–ด๋ฒ„๋ฆฌ๋ฉด ๊ด€๋ฆฌ๊ฐ€ ๊ธ‰๊ฒฉํžˆ ๋ณต์žกํ•ด์ง€๋Š” ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์Šค์ผ€์ค„๋ง๊ณผ ๋™๊ธฐํ™”๋Š” ์„œ๋กœ ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š” ์ชฝ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด LOCK์„ ์ทจ๋“ํ•˜์ง€ ๋ชปํ•˜์—ฌ Primitive์˜ Sleep Queue์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋“ค์€ ์–ธ์ œ ๊นจ์–ด๋‚  ์ˆ˜ ์žˆ์„๊นŒ? LOCK์„ ์ทจ๋“ํ–ˆ๋˜ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ LOCK์„ ํ•ด์ œํ•˜๋ฉด์„œ Primitive์˜ Sleep Queue์— ์žˆ๋˜ ๋ชจ๋“  ์ž‘์—…๋“ค์„ ๋ชจ๋‘ ๊นจ์›Œ๋ฒ„๋ฆผ์œผ๋กœ์จ ์Šค์ผ€์ค„๋ง ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ํŠน์ • ์ž‘์—…์„ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๊บ ์šฐ์ง€ ์•Š๊ณ  Sleep Queue์˜ ๋ชจ๋“  ์ž‘์—…์„ ๊นจ์šฐ๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด LOCK์„ ์ทจ๋“ํ–ˆ๋˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง์ ‘ ํ•˜๋‚˜์˜ ์ž‘์—…์„ ๊ณจ๋ผ ๊นจ์šฐ๊ฒŒ ๋˜๋ฉด, ๋Œ€์ƒ์ด ๋˜๋Š” ์ž‘์—…์ด ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ ธ๋‹ค ํ•˜๋”๋ผ๋„ Low Priority์ผ ์ˆ˜๋„ ์žˆ๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•ด ์œ ์—ฐํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋ฏ€๋กœ ์Šค์ผ€์ค„๋Ÿฌ์˜ ์ฑ…์ž„์œผ๋กœ ๋‘์–ด ์ ์ ˆํžˆ ์Šค์ผ€์ค„๋ง์ด ๋˜๋„๋ก ๋งŒ๋“ ๋‹ค.

2) Mutex

mutex๋ผ ํ•จ์€ Mutual Exclusion์˜ ์•ฝ์–ด๋กœ mut + ex๋ฅผ ํ•ฉ์นœ ๋ง์ด๋‹ค. mutex์˜ ๋ฒ”์œ„ ์ž์ฒด๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด๋กœ ํ•œ์ •๋˜์–ด ์“ฐ๋ ˆ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ๋•Œ ์“ฐ๋ ˆ๋“œ๋“ค์€ ๋™์ผ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์“ฐ๋ ˆ๋“œ์ผ ์ˆ˜ ์žˆ๊ณ , Cooperative Process์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์“ฐ๋ ˆ๋“œ ์ผ ์ˆ˜ ์žˆ๋‹ค.
mutex์—์„œ LOCK์„ ์ทจ๋“ํ•˜๋Š” ํ–‰์œ„๋ฅผ lock, LOCK์„ ํ•ด์ œํ•˜๋Š” ํ–‰์œ„๋ฅผ unlock์ด๋ผ๊ณ  ํ•œ๋‹ค. mutex๋„ ๊ตฌํ˜„์— ๋”ฐ๋ผ ์ฒœ์ฐจ๋งŒ๋ณ„์ด๊ณ  ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๋“ค์ด ์žˆ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ mutex๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ LOCK์„ ์ทจ๋“ํ–ˆ์„ ๋•Œ ์“ฐ๋ ˆ๋“œ์— ๊ท€์†๋˜๋Š” Locking ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ทผ๊ฑฐํ•˜์—ฌ ๋™์ž‘ํ•œ๋‹ค. ์ด์— ๋”ฐ๋ผ ์˜ค์ง LOCK์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋งŒ์ด LOCK์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
mutex์— ๋Œ€ํ•ด ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹๋‹น ๋‚ด์— ํ™”์žฅ์‹ค์ด ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉฐ, ํ™”์žฅ์‹ค์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์—ด์‡ ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ด๋ณด์ž. ์—ฌ๊ธฐ์„œ ํ™”์žฅ์‹ค ๋‚ด์˜ ์ž‘์—…๋“ค์ด Critical Section์ด๊ณ , ํ™”์žฅ์‹ค์˜ ์—ด์‡ ๊ฐ€ LOCK์ด๋ฉฐ, ํ™”์žฅ์‹ค์„ ์ด์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์ด ์“ฐ๋ ˆ๋“œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ™”์žฅ์‹ค์„ ์ด์šฉํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์€ ์—ด์‡ ๊ฐ€ ์žˆ์–ด์•ผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ™”์žฅ์‹ค ์—ด์‡ ๊ฐ€ ์“ฐ์ด๊ณ  ์žˆ๋‹ค๋ฉด ์—ด์‡ ๋ฅผ ์–ป์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.

3) Semaphore

semaphore์˜ ๋ฒ”์œ„ ์ž์ฒด๋Š” ์‹œ์Šคํ…œ์— ๊ฑธ์ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ์‹œ์Šคํ…œ ์ƒ์˜ ํŒŒ์ผ๋กœ์จ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. semaphore๋Š” ํฌ๊ฒŒ Binary Semaphore์™€ Couting Semaphore๋กœ ๋‚˜๋‰˜๋ฉฐ ์ด๋Š” LOCK์˜ ์ˆ˜๊ฐ€ ๋‹จ์ผ์ธ์ง€ ์—ฌ๋Ÿฟ์ธ์ง€์— ๋”ฐ๋ผ ๋‚˜๋‰œ๋‹ค. Binary Semaphore๋Š” LOCK์˜ ์ˆ˜๊ฐ€ ๋‹จ์ผ์ด๋ฏ€๋กœ mutex์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
mutex์ฒ˜๋Ÿผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด mutex์™€ ๋™์ผํ•˜๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ๋‹ค.
semaphore์—์„œ LOCK์„ ์ทจ๋“ํ•˜๋Š” ํ–‰์œ„๋ฅผ wait, LOCK์„ ํ•ด์ œํ•˜๋Š” ํ–‰์œ„๋ฅผ signal์ด๋ผ ํ•œ๋‹ค. mutex๊ฐ€ Locking ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ•ด ๋™์ž‘ํ–ˆ๋‹ค๋ฉด, semaphore๋Š” Signaling ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ทผ๊ฑฐํ•˜์—ฌ ๋™์ž‘ํ•œ๋‹ค. ์ด๋Š” LOCK์„ ์ทจ๋“ํ–ˆ์„ ๋•Œ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ์— ๊ท€์†๋˜์–ด ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, LOCK ์ž์ฒด๋ฅผ ์ผ์ข…์˜ ๊ณต์œ ๋˜๋Š” ์ž์›์œผ๋กœ์จ ์‚ฌ์šฉํ•˜์—ฌ, LOCK์„ ์ทจ๋“ํ•˜์ง€ ์•Š์€ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋„ LOCK์„ ํ•ด์ œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
Signaling ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ์˜ ํ”ํžˆ wait์€ P, signal์€ V๋ผ๊ณ  ํ•œ๋‹ค. P๋Š” LOCK์˜ ์ˆ˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋Š” decrement ์—ฐ์‚ฐ์ด๋˜๊ณ , V๋Š” LOCK์˜ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” increment ์—ฐ์‚ฐ์ด๋‹ค. P์™€ V ์ž์ฒด๋Š” Instruction Solution์— ๊ธฐ๋ฐ˜ํ•˜์ง€๋งŒ, ์ด๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋™์ž‘์‹œํ‚ค๋Š” ๋ถ€๋ถ„์€ ์‹œ์Šคํ…œ ์ฝœ๋กœ์จ ์ด๋ค„์ง„๋‹ค.
semaphore ์—ญ์‹œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹๋‹น ๋‚ด์— ํ™”์žฅ์‹ค์ด ์ •ํ•ด์ง„ ์ˆ˜ ๋งŒํผ ์กด์žฌํ•˜๋ฉฐ, ํ™”์žฅ์‹ค์„ ์ด์šฉํ•  ๋•Œ๋Š” ๋ณ„๋„์˜ ์—ด์‡ ๋Š” ํ•„์š” ์—†์ง€๋งŒ ์–ผ๋งŒํผ์˜ ํ™”์žฅ์‹ค์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํŒจ๋„์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์‚ฌ๋žŒ๋“ค์ด ํ™”์žฅ์‹ค์„ ์ด์šฉํ•˜๋ ค ํ•ด์„œ ํ™”์žฅ์‹ค์„ ์ ์œ ํ–ˆ๋‹ค๋ฉด ํŒจ๋„์˜ ๊ฐ’์€ ์ค„์–ด๋“ค ๊ฒƒ์ด๊ณ , ํ™”์žฅ์‹ค์„ ๋‹ค ์ด์šฉํ•˜๊ณ  ๋‚˜์˜จ๋‹ค๋ฉด ํŒจ๋„์˜ ๊ฐ’์€ ๋‹ค์‹œ ๋Š˜์–ด๋‚  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ํ™”์žฅ์‹ค ๋‚ด์˜ ์ž‘์—…๋“ค์ด Critical Section์ด ๋˜๊ณ , ํ™”์žฅ์‹ค์˜ ์ ์œ  ์—ฌ๋ถ€๊ฐ€ LOCK์ด๋ฉฐ, ํ™”์žฅ์‹ค์„ ์ด์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์ด ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋œ๋‹ค. ํ™”์žฅ์‹ค์„ ์ด์šฉํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์€ ํ™”์žฅ์‹ค์ด ๋น„์–ด์žˆ๋Š”์ง€ ํŒจ๋„์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ํŒจ๋„์„ ํ™•์ธํ–ˆ์„ ๋•Œ ํ™”์žฅ์‹ค์„ ์ด์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ํ™”์žฅ์‹ค์ด ๋น„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.
์˜ˆ์‹œ์—์„œ ํ™”์žฅ์‹ค์ด ํ•˜๋‚˜๋ผ๋ฉด Binary Semaphore, 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด Counting Semaphore๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

1. Binary Semaphore

do { /* ** P ์—ฐ์‚ฐ */ while (test_and_set(&LOCK)) ; Critical Section /* ** V ์—ฐ์‚ฐ */ LOCK = 0; Remainder Section } while (1);
C
์ด์ „ ํ•ญ๋ชฉ์—์„œ ์ œ์‹œ๋˜์—ˆ๋˜ Instruction Solution์˜ Test-and-Set์„ ํ†ตํ•ด Binary Semaphore๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. Binary Semaphore์˜ ๊ฒฝ์šฐ์—๋Š” LOCK์„ ๊ณต์œ  ์ž์›์œผ๋กœ ๋ณด๋˜, ๊ทธ ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ์ด๋ฏ€๋กœ P์— ๋Œ€ํ•ด์„  1 (true)๊ฐ€ ๋˜๊ณ  V์— ๋Œ€ํ•ด์„  0 (false)๊ฐ€ ๋˜๋Š” ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. LOCK์„ ๊ฐœ์ˆ˜๋กœ ์ทจ๊ธ‰ํ•˜๋ฉด P์™€ V ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๊ฐ’์ด ๊ฐ๊ฐ 0๊ณผ 1๋กœ ์ฆ๊ฐ์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ํ˜„์žฌ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š” Binary Semaphore๋Š” Test-and-Set์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ „์ œํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ LOCK์„ ์ž์›์˜ ์ˆ˜๊ฐ€ ์•„๋‹Œ Critical Section ์ง„์ž…์„ ์œ„ํ•œ ๋Œ€๊ธฐ ์œ ๋ฌด๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— P์™€ V ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๊ฐ’์ด ๊ฐ๊ฐ 1, 0์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค.
๋น„๋ก mutex๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด semaphore์™€ ๋‹ฌ๋ผ LOCK์„ ์ด์šฉํ•˜๋Š” ๊ฐœ๋…์— ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ๋Š” ํ•˜๋‚˜, mutex ์—ญ์‹œ ์œ„์˜ Binary Semaphore์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.

2. Couting Semaphore

wait_operation() { P(&LOCK1); --C; if (C < 0) { V(&LOCK1); P(&LOCK2); } else V(&LOCK1); } signal_operation() { P(&LOCK1); ++C; if (C <= 0) V(&LOCK2); V(&LOCK1); } do { wait_operation(); Critical Section signal_operation(); Remainder Section } while (1);
C
Counting Semaphore๋Š” 2๊ฐœ์˜ Binary Semaphore๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. Critical Section ์ง„์ž…์„ ์œ„ํ•œ Binary Semaphore 1๊ฐœ์™€ ์ž์›์˜ ์ˆ˜๋ฅผ ๋™๊ธฐํ™” ํ•˜๊ธฐ ์œ„ํ•œ Binary Semaphore 1๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ž์›์˜ ์ˆ˜๋Š” C๋กœ ํ‘œํ˜„๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Binary Semaphore์—์„œ์˜ P ์—ฐ์‚ฐ๊ณผ V ์—ฐ์‚ฐ์€ ๊ฐ๊ฐ P์™€ V๋กœ ํ‘œํ˜„ํ–ˆ๊ณ , ๋‘ Binary Semaphore์—์„œ ์‚ฌ์šฉํ•˜๋Š” LOCK์€ LOCK1๊ณผ LOCK2๋กœ ๊ตฌ๋ถ„์ง€์–ด ํ‘œํ˜„ํ–ˆ๋‹ค.
Counting Semaphore๋Š” Atmoicํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ Atomicํ•œ ๊ฒƒ์€ ๋‚ด๋ถ€์˜ P์™€ V์ด๋ฏ€๋กœ ์ด๋“ค์„ ์ œ์™ธํ•œ ๊ตฌ๋ฌธ๋“ค์—์„œ ์–ผ๋งˆ๋“ ์ง€ Interrupt๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ์ฃผ์˜ํ•  ์ 

Counting Semaphore์—์„œ ์ฃผ์–ด์ง„ ์ฝ”๋“œ์˜ wait_operation์„ ์ž˜ ์‚ดํŽด๋ณด๋ฉด if์™€ else ๊ตฌ๋ฌธ ๋ชจ๋‘ V(&LOCK1)์„ ์ˆ˜ํ–‰ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐ๊ฐ V(&LOCK1)์„ ๊ธฐ์žฌํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ†ตํ•ฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ๊ธฐ์žฌํ•œ ์ด์œ ๋Š” LOCK์„ ์กฐ์ž‘ํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด์™€ ๊ฐ™์€ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด Deadlock์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ P์™€ V๊ฐ€ ๊ฐ๊ฐ ๋‚˜๋‰˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๊ต‰์žฅํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. P์™€ V์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์‚ฌ์šฉ์€ Deadlock ๋ฌธ์ œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋™๊ธฐํ™” ์ž์ฒด์— ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
Pโ†’ Critical Section โ†’ P์™€ ๊ฐ™์ด LOCK์„ ํ’€์–ด์ฃผ๋Š” V๊ฐ€ ์—†์œผ๋ฉด, Critical Section ์ง„์ž… ํ›„ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ Critical Section ์ง„์ž…์ด ๋ง‰ํžˆ๋Š” Deadlock์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
Vโ†’ Critical Section โ†’ P์™€ ๊ฐ™์ด Critical Section ์ด์ „์— LOCK์„ ๊ฑฐ๋Š” ํ–‰์œ„๊ฐ€ ์ƒ๋žต๋˜์–ด ์žˆ์œผ๋ฉด, ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— Critical Section์— ์ง„์ž… ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด Mutual Exclusion ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
์ฝ”๋“œ๋Š” ์‚ฌ๋žŒ์ด ์งœ๋Š” ๊ฒƒ์ด๊ธฐ์— ์–ผ๋งˆ๋“ ์ง€ P์™€ V์— ๋Œ€ํ•œ ์‹ค์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค. ์ด์— ๋”ฐ๋ผ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด monitor ๊ธฐ๋ฒ•์ฒ˜๋Ÿผ ๋” ๋†’์€ ์ฐจ์›์˜ ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์„ ์–ธ์–ด ๋‹จ์œ„์—์„œ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

4) Deadlock

๊ต์ฐฉ ์ƒํƒœ (Deadlock)์€ 2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๋“ค์ด LOCK์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ณ„์†ํ•ด์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•œ๋‹ค. semaphore๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ Deadlock ๋ฐœ์ƒ์˜ ์˜ˆ์‹œ๋ฅผ ํ•œ ๋ฒˆ ์•Œ์•„๋ณด์ž.
/* ** This is Process A */ do { wait(&LOCK1); wait(&LOCK2); ... Critical Section; ... signal(&LCOK1); signal(&LOCK2); ... Remainder Section ... } while (1); /* ** This is Process B */ do { wait(&LOCK2); wait(&LOCK1); ... Critical Section ... signal(&LOCK2); signal(&LOCK1); ... Remainder Section ... } while (1);
C
์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ LOCK์„ ์žก๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์šด์ด ์ข‹๋‹ค๋ฉด Deadlock์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šค์ผ€์ค„๋ง ์ˆœ์„œ ๋ฐ Context Switch์— ๋”ฐ๋ผ ์–ผ๋งˆ๋“ ์ง€ Deadlock์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Deadlock ๋ฐœ์ƒ์€ ์ž˜๋ชป๋œ wait, signal์˜ ์ด์šฉ ๋“ฑ LOCK์„ ์žก๋Š” ์ˆœ์„œ์— ์˜์กด์ ์ด๊ธฐ ๋•Œ๋ฌธ์—, Deadlock์ด ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•ด ์ˆ˜ํ•™์ ์ธ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฒ€์ฆ ์ž์ฒด๋Š” LOCK์„ ์žก๋Š” ์ˆœ์„œ๊ฐ€ Partial Order๋ฅผ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ค„์ง„๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์—๊ฒŒ๋Š” ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด LOCK์„ ์‚ฌ์šฉํ•˜๋Š” ํ–‰์œ„๊ฐ€ Partial Order๋ฅผ ์ถฉ๋ถ„ํžˆ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์ด ์š”๊ตฌ๋˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•œ LOCK์˜ ์ˆœ์„œ์— ๋Œ€ํ•ด ์‚ฌ์ „์— ์ •์˜ํ•˜๋Š” ํ–‰์œ„๊ฐ€ ์š”๊ตฌ๋œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, Aโ†’Bโ†’C ์ˆœ์„œ๋กœ LOCK์„ ์žก์•„์•ผ ํ•œ๋‹ค๊ณ  ์ •์˜ํ•ด๋ณด์ž. ์–ด๋–ค ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” Aโ†’C์˜ ์ˆœ์„œ๋กœ LOCK์„ ์žก์•˜์„ ๋•Œ, ์ด๋Š” Partial Order๋ฅผ ๋งŒ์กฑํ•˜๋ฏ€๋กœ Deadlock์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ Cโ†’A์˜ ์ˆœ์„œ๋กœ LOCK์„ ์žก๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด๋Š” Partial Order์— ์œ„๋ฐฐ๋จ์— ๋”ฐ๋ผ Deadlock์„ ์ผ์œผํ‚ค๋Š” ์š”์ธ์ด ๋œ๋‹ค.
Partial Order?
๊ทธ๋ ‡๋‹ค๋ฉด Deadlock์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ? Deadlock ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ์˜ˆ๋ฐฉ (Prevention), ํšŒํ”ผ (Avoidance), ํƒ์ง€ ๋ฐ ํšŒ๋ณต (Detection and Recovery)์œผ๋กœ ๋‚˜๋‰œ๋‹ค. ์ด๋“ค์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

1. ์˜ˆ๋ฐฉ (Prevention) โ†’ Deadlock์„ ์ผ์ ˆ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ

์˜ˆ๋ฐฉ์€ Deadlock์ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด๋“ค๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ๋‹ค. Deadlock์€ ์ƒํ˜ธ ๋ฐฐ์ œ (Mutual Exclusion), ์ ์œ  ๋Œ€๊ธฐ (Hold and Wait), ๋น„์„ ์  (Non-Preemption), ์ˆœํ™˜ ๋Œ€๊ธฐ (Circular Wait)์ด ๋ชจ๋‘ ๋งŒ์กฑ๋˜์–ด์•ผ ๋ฐœ์ƒํ•œ๋‹ค. ์˜ˆ๋ฐฉ์ด๋ผ๋Š” ํ–‰์œ„๋Š” ์œ„ 4๊ฐ€์ง€ ์กฐ๊ฑด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์œ„๋ฐ˜ํ•˜์—ฌ ์ด๋ค„์ง„๋‹ค. ์šฐ์„  ๊ฐ ์กฐ๊ฑด๋“ค์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์œ„๋ฐ˜ํ•˜์—ฌ ์˜ˆ๋ฐฉ์ด ์ด๋ค„์ง€๋Š”์ง€ ์•Œ์•„๋ณด์ž.
Mutual Exclusion
์กฐ๊ฑด : ํ•œ ๋ฒˆ์˜ ํ•˜๋‚˜์˜ ์ž‘์—…์—์„œ๋งŒ LOCK์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ ์ค‘์ธ LOCK์— ๋Œ€ํ•ด ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  LOCK์ด ํ•ด์ œ๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค.
์œ„๋ฐ˜ : ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ด LOCK์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค. ๋‹จ, ๋™๊ธฐํ™”์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
Hold and Wait
์กฐ๊ฑด : ์ ์–ด๋„ ํ•˜๋‚˜์˜ LOCK์„ ๋ณด์œ ํ•œ ์ฑ„๋กœ ๋‹ค๋ฅธ ์ž‘์—…์—์„œ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” LOCK์„ ์ทจ๋“ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋‹ค.
์œ„๋ฐ˜ : ์ž‘์—… ์ง„ํ–‰์— ํ•„์š”ํ•œ LOCK๋“ค์„ ํ•œ ๋ฒˆ์— ์–ป์„ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ ํ›„์— ์ทจ๋“ํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.
Non-Preemption
์กฐ๊ฑด : ๋‹ค๋ฅธ ์ž‘์—…์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” LOCK์„ ๊ฐ•์ œ๋กœ ํƒˆ์ทจํ•  ์ˆ˜ ์—†๋‹ค.
์œ„๋ฐ˜ : ๋‹ค๋ฅธ ์ž‘์—…์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” LOCK์„ ์ทจ๋“ํ•˜๋ ค ํ•  ๋•Œ๋Š” ํ˜„์žฌ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” LOCK์„ ๋ฐ˜ํ™˜ํ•œ ํ›„ ๋Œ€๊ธฐํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค. ๋‹จ, ๋‹ค๋ฅธ ์ž‘์—…์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” LOCK์„ ๊ฐ•์ œ ์ทจ๋“ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์กฐ๊ฑด์€ ์—ฌ์ „ํžˆ ์œ ์ง€๋œ๋‹ค.
Circular Wait
์กฐ๊ฑด : LOCK์„ ์–ป๊ธฐ ์œ„ํ•œ ์ž‘์—…๋“ค์ด ์ˆœํ™˜ ํ˜•ํƒœ๋กœ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์—…๋“ค์ด P0,P1,P2,...,PnP_{0}, P_{1}, P_{2}, ... , P_{n}๊ณผ ๊ฐ™์ด ์žˆ์„ ๋•Œ, P0P_{0}๋Š” P1P_{1}์˜ LOCK์„, P1P_{1}์€ P2P_{2}์˜ LOCK์„, ..., PnP_{n}์€ P0P_{0}์˜ LOCK์„ ์š”๊ตฌํ•˜๋Š” ์ƒํƒœ๊ฐ€ Circular Wait์ด๋‹ค. Hold and Wait ์กฐ๊ฑด์ด ๋งŒ์กฑ์ด ๋˜์–ด์•ผ Circular Wait์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
์œ„๋ฐ˜ : LOCK์— ๊ณ ์œ  ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•œ ๋’ค, LOCK์˜ ๋ฒˆํ˜ธ๋Œ€๋กœ ์š”๊ตฌ๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค.
Deadlock์„ ์˜ˆ๋ฐฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์ข‹์€ ์ผ์ด์ง€๋งŒ, ์ด์™€ ๊ฐ™์€ ์ž‘์—…๋“ค์€ ์ปดํ“จํŒ… ์ž์›์„ ๋งŽ์ด ์†Œ๋ชจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ ์ƒ์— ๋งŽ์€ ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฐฉ์˜ ์ผ๋ถ€ ๋‹จ์ ๋“ค์€ ํšŒํ”ผ๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.

2. ํšŒํ”ผ (Avoidance) โ†’ Deadlock์„ ์ผ์ ˆ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ

ํšŒํ”ผ๋Š” Deadlock์— ๋น ์งˆ ๊ฐ€๋Šฅ์„ฑ์„ ์‚ฌ์ „์— ํ™•์ธํ•œ ๋’ค, Deadlock์— ๋น ์ง€์ง€ ์•Š๋Š” ์•ˆ์ „ ์ˆœ์„œ (Safe Sequence)๋ฅผ ์ฐพ์•„๋‚ด์–ด ์•ˆ์ „ ์ƒํƒœ (Safe State)๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ํ–‰์œ„์ด๋‹ค. ์˜ˆ๋ฐฉ์—์„œ ์•ผ๊ธฐ๋˜๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰์˜ ๊ฐ์†Œ๋Š” ํšŒํ”ผ์—์„œ LOCK๋“ค์˜ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ํ†ตํ•ด์„œ ๋ณด์™„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋•Œ Allocation, Need, Available๊ณผ ๊ฐ™์€ LOCK์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์ด ์š”๊ตฌ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ •๋ณด๋“ค์„ ์ด์šฉํ•˜๋Š” ํšŒํ”ผ์˜ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•˜์ง€๋งŒ, ๊ทธ ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Banker's Algorithm)์ด๋‹ค.
์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Dijkstra๊ฐ€ ๋งŒ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
Safe State & Safe Sequence? ์‹œ์Šคํ…œ์ด ์•ˆ์ „ (Safe)ํ•˜๋‹ค๋Š” ์˜๋ฏธ๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ์ž‘์—…๋“ค์ด LOCK์„ ์š”์ฒญํ•˜์—ฌ๋„ Deadlock์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ฐจ๋ก€๋กœ LOCK๋“ค์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ฅผ Safe State๋ผ ํ•œ๋‹ค. ์ด ๋•Œ Safe State๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ LOCK์˜ ํ• ๋‹น ์ˆœ์„œ๋ฅผ ๊ณง Safe Sequence๋ผ ํ•œ๋‹ค. Safe State๋ผ๋ฉด Deadlock์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค. Deadlock์ด ๋ฐœ์ƒํ•œ ์‹œ์Šคํ…œ์€ Unsafe State์ด์ง€๋งŒ, Unsafe State์— ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ˜๋“œ์‹œ Deadlock์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค.
์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ์ž‘์—…์ด ์š”๊ตฌํ•˜๋Š” ์—ฌ๋Ÿฌ LOCK๋“ค์˜ ์ตœ๋Œ€ ์ˆ˜ (Max)๋ฅผ ์„ ์–ธํ•จ์œผ๋กœ์จ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  LOCK์— ๋Œ€ํ•œ ํ• ๋‹น ์ƒํƒœ์˜ ํ™•์ธ์„ ํ†ตํ•ด Circular Wait์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•จ์œผ๋กœ์จ Deadlock ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ด์— ๋”ฐ๋ผ Deadlock์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” Safe Sequence๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋”ฐ๋ผ LOCK์˜ ํ• ๋‹น์ด ์ด๋ค„์ง€๋”๋ผ๋„ Safe State์— ์žˆ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ด์šฉ๋˜๋Š” ์ƒํ™ฉ์€ ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ๊ณต๋ฃก ์ฑ… ๋“ฑ์—์„œ ์ง์ ‘ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์„ ๊ถŒํ•œ๋‹ค.
์‹œ์Šคํ…œ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ LOCK์˜ ์ˆ˜๋Š” 12๊ฐœ์ด๊ณ  ํ˜„์žฌ ๊ฐ ์ž‘์—…๋“ค์—๊ฒŒ ํ• ๋‹น๋œ ๋ชจ๋“  LOCK์€ 9๊ฐœ์ผ ๋•Œ, ํ•ด๋‹น ์‹œ์ ์„ t0t_{0}๋ผ ํ•ด๋ณด์ž. t0t_{0}์—์„œ ์‹œ์Šคํ…œ์€ Safe State์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„  Safe Sequence๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. <T1,T0,T2><T_{1}, T_{0}, T_{2}>์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ–ˆ์„ ๋•Œ๋Š” ๋ฌธ์ œ ์—†์ด ์ž‘์—…์—์„œ ์š”๊ตฌํ•˜๋Š” LOCK๋“ค์„ ๋ถ„๋ฐฐํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” Safe Sequence๊ฐ€ ๋œ๋‹ค.
T1T_{1}์ด ์š”๊ตฌํ•˜๋Š” ์ถ”๊ฐ€ LOCK์€ 4โˆ’2=24 - 2 = 2์ด๊ณ , ๊ฐ€์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›์€ ์ตœ๋Œ€ LOCK 12๊ฐœ์—์„œ ํ˜„์žฌ ํ• ๋‹น๋œ ๋ชจ๋“  LOCK์ธ 9๊ฐœ๋ฅผ ๋บ€ 3์ด๋‹ค. ์ฆ‰, T1T_{1}์˜ ์ž‘์—…์„ ๋๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. T1T_{1}์˜ ์ž‘์—…์„ ๋๋‚ด๊ณ  ๋‚˜๋ฉด ์‹œ์Šคํ…œ์—์„œ๋Š” 5๊ฐœ์˜ LOCK์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์ด๋Š” T0T_{0}์˜ ๋ชจ์ž๋ž€ LOCK์„ ์ฑ„์šฐ๊ธฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค. T0T_{0}๋ฅผ ๋๋‚ธ ํ›„์—๋Š” ์ด 10๊ฐœ์˜ LOCK์„ ๊ฐ€์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ T2T_{2} ์—ญ์‹œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
์œ„์™€ ๊ฐ™์€ ์˜ˆ์‹œ์—์„œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ์ „์ด (State Transition)์ด๋‹ค. ์‹œ์Šคํ…œ์€ Safe State์— ์žˆ๋‹ค๊ฐ€๋„ ์–ผ๋งˆ๋“ ์ง€ ์ž‘์—… ์ง„ํ–‰์— ๋”ฐ๋ผ Unsafe State๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค. t0t_{0}์—์„œ์˜ Safe Sequence๊ฐ€ ์กด์žฌํ–ˆ์—ˆ์ง€๋งŒ, ๋‹ค์Œ ์‹œ์ ์ธ t1t_{1}์—์„œ์˜ LOCK ์š”๊ตฌ์˜ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ์–ผ๋งˆ๋“ ์ง€ Unsafe State๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
t1t_{1}์—์„œ ์ž‘์—… T2T_{2}๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ LOCK์„ ํ•˜๋‚˜ ๋” ์š”๊ตฌํ•˜์—ฌ ์ด๋ฅผ ํ• ๋‹นํ•ด์คฌ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ฐ€์šฉํ•  ์ˆ˜ ์žˆ๋Š” LOCK์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ LOCK 12๊ฐœ์—์„œ ํ˜„์žฌ ํ• ๋‹น๋œ ๋ชจ๋“  LOCK์ธ 10๊ฐœ๋ฅผ ๋บ€ 2์ด๋‹ค. ์ด์— ๋”ฐ๋ผ T1T_{1}์€ ์ถ”๊ฐ€์ ์œผ๋กœ 2๊ฐœ์˜ LOCK์„ ์š”๊ตฌํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ T1T_{1}์„ ๋๋‚ผ ์ˆ˜ ์žˆ๊ณ , ์‹œ์Šคํ…œ ์ƒ์— ์œ ์ง€๋˜๋Š” LOCK์€ ์ด 4๊ฐœ์ด๋‹ค. ๋”ฐ๋ผ์„œ T0T_{0}, T2T_{2} ๊ทธ ์–ด๋Š ๊ฒƒ๋„ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋˜์–ด Unsafe State๊ฐ€ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์€ T2T_{2}์—๊ฒŒ LOCK์„ ์ฆ‰์‹œ ํ• ๋‹นํ•จ์œผ๋กœ์จ ๋ฒŒ์–ด์ง„ ์ผ์ด๋‹ค. ํ•ด๋‹น ์ƒํ™ฉ์„ ๋ฏธ๋ฆฌ ํŒŒ์•…ํ•˜์—ฌ T2T_{2}๋Š” ๋Œ€๊ธฐํ•˜๊ฒŒ ํ•˜๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์—๊ฒŒ ๋จผ์ € LOCK์„ ํ• ๋‹นํ•œ ํ›„์— ๋ฐ˜ํ™˜๋œ LOCK์„ T2T_{2}๊ฐ€ ์ด์šฉํ•˜๋„๋ก ํ–ˆ๋‹ค๋ฉด Deadlock์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค.
๋”ฐ๋ผ์„œ ์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ™์€ ํšŒํ”ผ๋“ค์€ ์ž‘์—…๋“ค์ด LOCK์„ ์š”๊ตฌํ–ˆ์„ ๋•Œ ์ฆ‰์‹œ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋Œ€๊ธฐ๋ฅผ ํ•ด์•ผํ•˜๋Š”์ง€๋„ ํŒ๋ณ„ํ•จ์œผ๋กœ์จ Safe State๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.
LOCK์˜ ์ฆ‰์‹œ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” Safe State์—์„œ Safe State๊ฐ€ ๋  ๋•Œ๋งŒ ํ•ด๋‹น๋œ๋‹ค.
์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ™์€ ํšŒํ”ผ๋Š” ์˜ˆ๋ฐฉ์˜ ๋‹จ์ ์„ ์ผ๋ถ€ ๋ณด์™„ํ–ˆ๋‹ค๊ณ ๋Š” ํ•˜๋‚˜, ๋ช‡๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ ๋ฐ ๋‹จ์ ์ด์ด ๋”ฐ๋ฅธ๋‹ค. ๋ฏธ๋ฆฌ ์•Œ์•„์•ผ ํ•˜๋Š” ์ •๋ณด๋“ค์ด ๋งŽ๊ณ , ์ด๋“ค์„ ์–ป์–ด๋‚ด๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฐ ํŽธ์ด๋ผ ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
1.
ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” LOCK์˜ ์ˆ˜๋ฅผ ์‚ฌ์ „์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ์ˆ˜๊ฐ€ ์ผ์ •ํ•ด์•ผ ํ•œ๋‹ค
2.
LOCK์„ ์ด์šฉํ•˜๋Š” ์ž‘์—… ์ˆ˜๋“ค๋„ ์ผ์ •ํ•ด์•ผ ํ•œ๋‹ค.
3.
Unsafe State๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Safe Sequence๋ฅผ ์ง€์ผœ์•ผ ํ•˜๋ฏ€๋กœ, LOCK์˜ ์ด์šฉ๋„๊ฐ€ ๋‚ฎ๋‹ค.

3. ํƒ์ง€ ๋ฐ ํšŒ๋ณต (Detection and Recovery) โ†’ Deadlock์„ ํ—ˆ์šฉํ•จ

๋ณ„๋„์˜ ์˜ˆ๋ฐฉ์ด๋‚˜ ํšŒํ”ผ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” Deadlock์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์ƒํ™ฉ์—์„œ๋Š” Deadlock์„ ํƒ์ง€ํ•˜๊ณ  ํšŒ๋ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋œ๋‹ค. ํƒ์ง€ ๋ฐ ํšŒ๋ณต์€ ๋‹จ์ ์ด ๊ฝค๋‚˜ ๊ทน๋ช…ํ•œ ํŽธ์ด์–ด์„œ ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
ํƒ์ง€
ํƒ์ง€๋Š” ํšŒํ”ผ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ LOCK์— ๋Œ€ํ•œ ํ• ๋‹น ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ Deadlock์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ํŒ๋ณ„ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํšŒํ”ผ์—์„œ ์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด Allocation, Need, Available ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ด์šฉํ–ˆ๋‹ค๋ฉด, ํƒ์ง€์—์„œ๋Š” Allocation, Request, Available ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋‘ ๋ฐฉ๋ฒ•์˜ ๋‹ค๋ฅธ ์ ์ด๋ผ ํ•˜๋ฉด Need์™€ Request์— ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํšŒํ”ผ์—์„œ Need๋Š” ํ˜„์žฌ ์ƒํƒœ์—์„œ LOCK์„ ์ทจ๋“ํ•˜๋ ค ํ•˜์ง€ ์•Š์•„๋„ ์ตœ์ข…์ ์œผ๋กœ ์ž‘์—… ์ž์ฒด๋ฅผ ๋๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ LOCK์˜ ์–‘์„ ์˜๋ฏธํ•˜๋Š”๋ฐ ๋ฐ˜ํ•ด, Request๋Š” ํ˜„ํƒœ ์ƒํƒœ์—์„œ ํ•„์š”ํ•œ ๋งŒํผ์˜ LOCK์„ ์š”์ฒญํ•œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋™์ผํ•˜์ง€๋งŒ, ์œ„์—์„œ ์ œ์‹œ๋œ ๋ถ€๋ถ„์„ ํฌํ•จํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ƒ์— ์กฐ๊ธˆ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ํƒ์ง€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ณต๋ฃก ์ฑ… ๋“ฑ์—์„œ ์ง์ ‘ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์„ ๊ถŒํ•œ๋‹ค.
ํƒ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” Resource-Allocation Graph์™€ Wait-For Graph๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Resource-Allocation Graph์˜ ๊ฒฝ์šฐ LOCK์— ๋Œ€ํ•ด ์†Œ์œ ๋˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์„ ํ‘œํ˜„ํ•œ ๊ทธ๋ž˜ํ”„๋ผ๋ฉด, Wait-For Graph๋Š” LOCK์„ ์ œ์™ธํ•˜๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์ž‘์—…๊ณผ ์ž‘์—… ์‚ฌ์ด ๋Œ€๊ธฐ ์ƒํ™ฉ๋งŒ์„ ํ‘œํ˜„ํ•œ ๊ทธ๋ž˜ํ”„์ด๋‹ค. ๋”ฐ๋ผ์„œ Resource-Allocation Graph๋Š” LOCK์˜ ํ• ๋‹น ์ด์ „์— Deadlock ๋ฐœ์ƒ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜์—ฌ LOCK์˜ ํ• ๋‹น ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ • ์ง“๋Š” ๋ฐ˜๋ฉด, Wait-For Graph๋Š” LOCK์„ ํ• ๋‹นํ•ด์ค€ ํ›„์— Deadlock์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒŒ ๋œ๋‹ค. ๋‘ ๊ทธ๋ž˜ํ”„์˜ Deadlock ์œ ๋ฌด ํŒ๋ณ„ ๊ธฐ์ค€์€ ๊ทธ๋ž˜ํ”„ ๋‚ด์˜ Cycle ์œ ๋ฌด์ธ๋ฐ, ๋‘ ๊ทธ๋ž˜ํ”„์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
Resource-Allocation Graph๋Š” Cycle์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด Deadlock์ด ์—†๋Š” ๊ฒƒ์ด์ง€๋งŒ, Cycle์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ•ด์„œ Deadlock์ด ๋ฌด์กฐ๊ฑด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ทธ๋ž˜ํ”„์—์„œ๋Š” Deadlock์˜ ์œ ๋ฌด ํŒ๋ณ„์„ ์œ„ํ•ด ๊ทธ๋ž˜ํ”„ ๋‚ด์˜ Edge๋ฅผ Assignment-Edge์™€ Request-Edge๋ผ๋Š” LOCK์˜ ํ• ๋‹น๊ณผ ์š”์ฒญ์— ๋Œ€ํ•œ Edge๋กœ ๊ตฌ๋ถ„์ง€์–ด ์ถ”๊ฐ€์ ์œผ๋กœ ํŒ๋ณ„์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ํŒ๋ณ„์ด ์š”๊ตฌ๋˜๋Š” ์ด์œ ๋Š” Resource-Allocation Graph์—์„œ ๊ฐ ์ž‘์—…์ด ์š”๊ตฌํ•˜๋Š” LOCK์ด ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
Assignment-Edge๋Š” LOCK์—์„œ ์ž‘์—…์œผ๋กœ ํ• ๋‹น๋˜๋Š” Edge๋ฅผ ๋งํ•˜๊ณ , Request-Edge๋Š” ์ž‘์—…์—์„œ LOCK์œผ๋กœ ์š”์ฒญ๋˜๋Š” Edge๋ฅผ ๋งํ•œ๋‹ค.
์œ ํ˜• ๋ณ„ ํŒ๋ณ„
Wait-For Graph์—๋Š” LOCK์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฐ„๋‹จํ•œ ๊ทธ๋ž˜ํ”„์ด๋‹ค. ๋”ฐ๋ผ์„œ Assignment-Edge ๋ฐ Request-Edge์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ค๋กœ์ง€ Cycle ์กด์žฌ๋งŒ์œผ๋กœ Deadlock ๋ฐœ์ƒ ์œ ๋ฌด๋ฅผ ํŒ๋ณ„ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ์ด์œ  ๋•Œ๋ฌธ์— Wait-For Graph๋Š” ์ž‘์—…๋“ค ์‚ฌ์ด์— Cycle์ด ์กด์žฌํ•  ๋•Œ Deadlock์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋‹จ์ˆœํžˆ Cycle์˜ ์กด์žฌ๋งŒ์œผ๋กœ Deadlock ํŒ๋ณ„์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” Wait-For Graph์—์„œ ๊ฐ ์ž‘์—…์ด ์š”๊ตฌํ•˜๋Š” LOCK์ด ํ•œ ๋ฒˆ์— ์˜ค๋กœ์ง€ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
Wait-For Graph์˜ Edge๋Š” Assignment-Edge์™€ Request-Edge๊ฐ€ ์•„๋‹Œ Claim-Edge์ด๋‹ค.
ํƒ์ง€๋Š” Cylcle์„ ํ™•์ธํ•˜๋Š”๋ฐ์—์„œ O(n2)O(n^2)์˜ ์—ฐ์‚ฐ์ด ์š”๊ตฌ๋˜๋Š” ์ƒ๋‹นํžˆ ์ปดํ“จํŒ… ์ž์›์„ ๋งŽ์ด ์†Œ๋ชจํ•˜๋Š” ์ž‘์—…์ด๋‹ค.
ํšŒ๋ณต
ํšŒ๋ณต์€ Deadlock์— ๋น ์ง„ ์ž‘์—…๋“ค์„ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•๊ณผ LOCK์„ ์„ ์ ํ•  ์ˆ˜ ์žˆ๋„๋ก Preemption์„ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.
Deadlock์— ๋น ์ง„ ์ž‘์—…๋“ค์„ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ Deadlock์— ๋น ์ง„ ๋ชจ๋“  ์ž‘์—…๋“ค์„ ํ•œ ๋ฒˆ์— ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜ ์ž‘์—…์„ ํ•˜๋‚˜์”ฉ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด์ด ์žˆ๋‹ค. ์ „์ž์˜ ๊ฒฝ์šฐ์—๋Š” ์—ฐ์‚ฐ ์ค‘์ด๋˜ ์ž‘์—…๋“ค์˜ ์ค‘๋‹จ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฐ๊ณผ ๊ฐ’์ด ํ๊ธฐ๋  ์ˆ˜๋„ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ์—๋Š” ์ž‘์—…์„ ํ•˜๋‚˜ ์ค‘๋‹จ์‹œํ‚ฌ ๋•Œ๋งˆ๋‹ค Deadlock์ด ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํƒ์ง€๋ฅผ ๋งค ๋ฒˆ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋ฏ€๋กœ ๊ฝค๋‚˜ ํฐ ์ปดํ“จํŒ… ์ž์›์„ ์†Œ๋ชจํ•˜๋Š” ํŽธ์ด๋‹ค.
Preemption์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ž‘์—…์— ํ• ๋‹น๋œ LOCK์„ ํƒˆ์ทจํ•œ ๋’ค, Deadlock์ด ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น LOCK์„ ๋‹ค๋ฅธ ์ž‘์—…๋“ค์—๊ฒŒ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํƒˆ์ทจํ•˜๋ ค๋Š” ๋Œ€์ƒ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌํ•ญ๋“ค์ด ๊ณ ๋ ค๋˜์–ด์•ผ ํ•œ๋‹ค.
1.
Selection of Victim (ํฌ์ƒ ์ž‘์—… ์„ ํƒ)
โ†’ ์ตœ์†Œ์˜ ํ”ผํ•ด๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์ž‘์—…์„ ์„ ํƒํ•œ๋‹ค.
2.
Rollback (๋˜๋Œ๋ฆฌ๊ธฐ)
โ†’ LOCK์„ ํƒˆ์ทจํ•œ ์ž‘์—…์„ ๋ฌธ์ œ ์—†๋˜ ์‹œ์ ์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
3.
Starvation (๊ธฐ์•„ ์ƒํƒœ)
โ†’ ํ•œ ์ž‘์—…์ด ๊ณ„์†ํ•ด์„œ ํƒˆ์ทจํ•˜์—ฌ ๋‹ค๋ฅธ ์ž‘์—…์—์„œ ๊ธฐ์•„ ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค.

4. ๋ฌด์‹œ (Ignorance) โ†’ Deadlock์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •

๋ฌด์‹œ๋Š” ๋ง ๊ทธ๋Œ€๋กœ Deadlock์„ ๋ฌด์‹œํ•˜๊ณ  ๋„˜๊ธฐ๋Š” ํ–‰์œ„๋ฅผ ๋œปํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Deadlock ์ž์ฒด๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ํ–‰์œ„์ด๋‹ค. Deadlock ์ž์ฒด๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์ •์€ ๊ณง Deadlock ๋ฐœ์ƒ์ด ์ •์ƒ์ ์ธ ๋™์ž‘์ด ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, Deadlock ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ์จ ์ด์šฉ๋œ๋‹ค. ๋ฌด์‹œ์— ํ•ด๋‹นํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํƒ€์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Ostrich Algorithm)์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” Deadlock์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹œ์Šคํ…œ์„ ์žฌ์‹œ์ž‘ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
Deadlock์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” Deadlock์„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค. ๋นˆ๋ฒˆํ•œ Deadlock ๋ฐœ์ƒ์—์„œ๋Š” Ostrich Algorithm์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค. Ostrich Algorithm์€ ๋™์‹œ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ 10๋…„์— ํ•œ ๋ฒˆ์ฒ˜๋Ÿผ ์–ด์ฉŒ๋‹ค๊ฐ€ ์šฐ์—ฐํžˆ Deadlock์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‹œ์Šคํ…œ์„ ์žฌ์‹œ์ž‘์„ ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ ๋•Œ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋ฌด์‹œ๋Š” ํ˜„์žฌ ๋งŽ์€ ์šด์˜์ฒด์ œ๋“ค๊ณผ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Deadlock์„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜๋Š” ๊ฒƒ์ด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ๋Š˜ LOCK์„ ์–ป๋Š” ์ˆœ์„œ๋ฅผ ์ž˜ ์ค€์ˆ˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์ด ํ•„์š”ํ•˜๋‹ค.

5. External Functions

Philosophers์˜ Mandatory ๋ฐ Bonus ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ํ—ˆ์šฉ๋œ ํ•จ์ˆ˜๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
โ€ข
memset
โ€ข
printf
โ€ข
malloc
โ€ข
free
โ€ข
write
โ€ข
fork
โ€ข
waitpid
โ€ข
usleep
โ€ข
gettimeofday
โ€ข
kill
โ€ข
pthread_create
โ€ข
pthread_detach
โ€ข
pthread_join
โ€ข
pthread_mutex_init
โ€ข
pthread_mutex_destroy
โ€ข
pthread_mutex_lock
โ€ข
pthread_mutex_unlock
โ€ข
sem_open
โ€ข
sem_close
โ€ข
sem_post
โ€ข
sem_unlink
malloc, free, write๋Š” ์†Œ๊ฐœ๋ฅผ ์ƒ๋žตํ•œ๋‹ค.
memset์€ ์ฒซ ๋ฒˆ์งธ ๋งํฌ์—์„œ, printf๋Š” ๋‘ ๋ฒˆ์งธ ๋งํฌ์—์„œ ํ™•์ธํ•˜์ž.
fork ๋ฐ waitpid์— ๋Œ€ํ•ด์„œ๋Š” pipex์—์„œ ๋‹ค๋ฃจ์—ˆ์œผ๋ฏ€๋กœ ์„ธ ๋ฒˆ์งธ ๋งํฌ์—์„œ ํ™•์ธํ•˜์ž.
pthread๋Š” ๋„ค ๋ฒˆ์งธ ๋งํฌ์—์„œ, semaphore๋Š” ๋‹ค์„ฏ ๋ฒˆ์งธ ๋งํฌ์—์„œ ํ™•์ธํ•˜์ž.
์—ฌ๊ธฐ์„œ๋Š” usleep, gettimeofday, kill ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„ ๋ณผ ๊ฒƒ์ด๋‹ค.

1) usleep

1. ์˜์กด์„ฑ

#include <unistd.h>
C

2. ํ•จ์ˆ˜ ์›ํ˜•

int usleep(useconds_t);
C

3. ํ•จ์ˆ˜ ์„ค๋ช…

์ธ์ž๋กœ ๋ฐ›๋Š” useconds_t๋Š” Mac OS X ์ƒ์—์„œ __darwin_usecond_t๋กœ ํƒ€์ž… ์ •์˜ ๋˜์–ด ์žˆ๋‹ค. ์ด๋Š” <_types.h>์— __uint32_t๋กœ ํƒ€์ž… ์ •์˜ ๋˜์–ด ์žˆ์œผ๋ฉฐ, microseconds๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ํ”„๋กœ์„ธ์Šค๋ฅผ ์–ผ๋งŒํผ ์žฌ์šธ์ง€ microseconds ๋‹จ์œ„๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. ์˜ˆ์ „ ๋ฒ„์ „์˜ BSD ๊ณ„์—ด์—์„œ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์ด void ์˜€์ง€๋งŒ, POSIX์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด int๋กœ ์ˆ˜์ • ๋˜์—ˆ๋‹ค. ์ด๋Š” ์ •์ƒ์ ์ธ ํ•จ์ˆ˜ ์ˆ˜ํ–‰์ด ๋˜์—ˆ๋‹ค๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๋น„์Šทํ•œ ํ•จ์ˆ˜๋กœ๋Š” sleep์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ sleep์˜ ์ž…๋ ฅ ์ธ์ž๋Š” seconds ๋‹จ์œ„์ด๋ฏ€๋กœ, usleep์€ ์กฐ๊ธˆ ๋” ์ •๊ตํ•œ ๋‹จ์œ„๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์šฐ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
sleep์˜ ๊ฒฝ์šฐ์—๋Š” ์ž…๋ ฅ ๋ฐ›๋Š” ์ธ์ž๊ฐ€ unsigned int์ด๋ฏ€๋กœ ์†Œ์ˆ˜์ ์— ๋Œ€ํ•œ ์ด์šฉ์ด ์–ด๋ ค์›Œ seconds ๋‹จ์œ„๋กœ๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์šด๋‹ค๋Š” ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค๋“ค์€ New, Ready, Sleep, Running, Terminated์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋“ค์€ ๊ฐ๊ฐ์˜ Queue๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋œ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ๋Š” New, ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ๋Š” Terminated์˜ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์Šค์ผ€์ค„๋ง๋  ์ค€๋น„๊ฐ€ ๋˜๋ฉด Ready ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ, ์ด๋“ค์€ ์Šค์ผ€์ค„๋Ÿฌ์˜ Dispatcher์— ์˜ํ•ด Running ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž ๋“ ๋‹ค๋Š” ์˜๋ฏธ๋Š” Sleep ์ƒํƒœ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋“ค์€ Context Switch ๋ฐœ์ƒ ๋Œ€์ƒ์—์„œ ์ž๋™์œผ๋กœ ์ œ์™ธ๋œ๋‹ค. Sleep ์ƒํƒœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊นจ์–ด๋‚˜๋ฉด ๋ฐ”๋กœ Running ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Ready ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ, Dispatcher์— ์˜ํ•ด ๋‹ค์‹œ Running ์ƒํƒœ์˜ Queue์— ์ถ”๊ฐ€๋˜์–ด ์Šค์ผ€์ค„๋ง ๋œ๋‹ค.

4. ์˜ˆ์‹œ

#include <stdio.h> #include <unistd.h> int main(void) { int i; i = 5; while (i--) { printf("%d seconds left\n", i + 1); if (usleep(1000000) == -1) return (1); } return (0); }
C

2) gettimeofday

1. ์˜์กด์„ฑ

#include <sys/time.h>
C

2. ํ•จ์ˆ˜ ์›ํ˜•

int gettimeofday(struct timeval * __restrict, void * __restrict);
C

3. ํ•จ์ˆ˜ ์„ค๋ช…

gettimeofday ํ•จ์ˆ˜๋Š” Unix Time์„ ์–ป์Œ์œผ๋กœ์จ ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๊ณ ์ž ํ•  ๋•Œ ์ฃผ๋กœ ์ด์šฉ๋œ๋‹ค. gettimeofday๋Š” settimeofday์™€ ์Œ์œผ๋กœ ๋งŽ์ด ์ด์šฉ๋˜๋ฉฐ, ์ด๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  timeval๊ณผ timezone ๊ตฌ์กฐ์ฒด๊ฐ€ ์š”๊ตฌ๋œ๋‹ค. ์ด ๋•Œ timezone์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋Š” ๋‚ด๋ถ€์— ์ •์˜๋œ ๋งคํฌ๋กœ ๊ฐ’์œผ๋กœ ์‹œ๊ฐ„๋Œ€ ์ง€์—ญ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์„ธ๊ณ„ ์—ฌ๋Ÿฌ ๊ตญ๊ฐ€์— ๋”ฐ๋ผ ์‹œํ–‰๋˜๋Š” ์„œ๋จธ ํƒ€์ž„์€ ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ์ง€์ •ํ•  ์ˆ˜ ์—†๊ณ  ์ •์น˜์ ์ธ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›์œผ๋ฏ€๋กœ timezone ๊ตฌ์กฐ์ฒด๋Š” obsolete๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ timezone์— ๋Œ€ํ•ด์„œ๋Š” NULL ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ๊ทน ๊ถŒ์žฅ๋จ์— ๋”ฐ๋ผ ๋‘ ํ•จ์ˆ˜๊ฐ€ ์ด์šฉํ•˜๋Š” ์ธ์ž๋Š” ์ฃผ๋กœ timeval์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ๋œ๋‹ค.
Unix Time์€ ์ฃผ๋กœ POSIX Time ํ˜น์€ Epoch Time์ด๋ผ๊ณ ๋„ ๋งŽ์ด ๋ถˆ๋ฆฌ๋ฉฐ, ์ด๋Š” 1970-01-01 00:00:00 ์„ ๊ธฐ์ค€์œผ๋กœ ํ˜๋Ÿฌ๊ฐ„ seconds๋ฅผ ์˜๋ฏธํ•œ๋‹ค. time_t๋ผ๋Š” unsigned long ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๋Š” time ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด seconds๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ •๊ตํ•œ ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” time ํ•จ์ˆ˜ ๋Œ€์‹ ์— timeval์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค๋กœ๋Š” gettimeofday์™€ settimeofday๊ฐ€ ์žˆ๋‹ค. ํŠนํžˆ gettimeofday ํ•จ์ˆ˜์˜ ์—ญํ• ์€ time ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, time ํ•จ์ˆ˜ ๋Œ€์‹ ์— gettimeofday ํ•จ์ˆ˜๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
_STRUCT_TIMEVAL { __darwin_time_t tv_sec; /* seconds */ __darwin_suseconds_t tv_usec; /* and microseconds */ }; struct timezone { int tz_minuteswest; /* minutes west of Greenwich */ int tz_dsttime; /* type of dst correction */ };
C
Mac OS X์—์„œ timeval๊ณผ timezone ๊ตฌ์กฐ์ฒด๋Š” ์œ„์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค. gettimeofday๋ฅผ ์ด์šฉํ•  ๋•Œ๋Š” timeval ๊ตฌ์กฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ๋„˜๊น€์œผ๋กœ์จ Unix Time์— ๋Œ€ํ•ด microseconds ๋‹จ์œ„๊นŒ์ง€ ๊ธฐ๋กํ•˜๊ฒŒ ๋œ๋‹ค. Unix Time์— ๋Œ€ํ•œ ๊ธฐ๋ก์ด ์„ฑ๊ณตํ•˜๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
__darwin_time_t๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ long์œผ๋กœ ํƒ€์ž… ์ •์˜๋˜์–ด ์žˆ๊ณ , __darwin_suseconds_t๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ __int32_t๋กœ ํƒ€์ž… ์ •์˜๋˜์–ด ์žˆ๋‹ค.

4. ์˜ˆ์‹œ

#include <stdio.h> #include <sys/time.h> #include <time.h> int main(void) { const char *wday[] = {"์ผ", "์›”", "ํ™”", "์ˆ˜", "๋ชฉ", "๊ธˆ", "ํ† "}; struct timeval unix; struct tm *date; if (gettimeofday(&unix, NULL) == -1) return (1); printf("Unix Time: %ld\t%d\n", unix.tv_sec, unix.tv_usec); date = localtime(&(unix.tv_sec)); if (!date) return (1); printf("Date Time: %d๋…„ %d์›” %d์ผ %s์š”์ผ %02d์‹œ %02d๋ถ„ %02d์ดˆ %s\n", date->tm_year + 1900, date->tm_mon + 1, date->tm_mday, wday[date->tm_wday], date->tm_hour, date->tm_min, date->tm_sec, date->tm_zone); printf("%d days passed from Jan 1st\n", date->tm_yday); return (0); }
C
<time.h> ๋‚ด์— ์žˆ๋Š” localtime์ด๋ผ๋Š” ํ•จ์ˆ˜์™€ tm ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋ฉด Unix Time์„ ์‰ฝ๊ฒŒ Date Time์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. localtime ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํฌ์ธํ„ฐ๋ฅผ ํ•ด์ œ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•ด๋‹น ํฌ์ธํ„ฐ๋Š” localtime ํ•จ์ˆ˜ ๋‚ด์— ์กด์žฌํ•˜๋Š” ์ •์  ๋ณ€์ˆ˜ ํ˜น์€ ๋Ÿฐ ํƒ€์ž„ ์‹œ์Šคํ…œ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๋ฏ€๋กœ ํ•ด์ œํ•  ํ•„์š”๋„ ์—†๊ณ  ํ•ด์ œ๋ฅผ ํ•ด์„œ๋„ ์•ˆ ๋œ๋‹ค. ๋‹จ, localtime ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋‚ด๋ถ€ ๋™์ž‘์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ ์‹œ NULL์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ๊ฒ€์ฆ์€ ์š”๊ตฌ๋œ๋‹ค. Unix Time์€ ์„œ๋ถ€ ์œ ๋Ÿฝ ํ‘œ์ค€์‹œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•จ์—๋„ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง€์—ญ๊ณผ ์‹œ๊ฐ„์ด ์ž˜ ๋‚˜์˜ค๋Š” ์ด์œ ๋Š” /etc/localtime์ด๋ผ๋Š” ํŒŒ์ผ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ ์–ป์Œ์œผ๋กœ์จ ์ง€์—ญ๊ณผ ์ด์— ๋”ฐ๋ฅธ Unix Time ๊ธฐ์ค€์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3) kill

1. ์˜์กด์„ฑ

#include <signal.h>
C

2. ํ•จ์ˆ˜ ์›ํ˜•

int kill(pid_t pid, int sig);
C

3. ํ•จ์ˆ˜ ์„ค๋ช…

kill ํ•จ์ˆ˜๋Š” ์ด๋ฆ„๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋‹จ์ˆœํžˆ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด์ฃผ๋Š” ํ•จ์ˆ˜์— ๋ถˆ๊ณผํ•˜๋‹ค. ๊ทธ๋Ÿผ์—๋„ ์ด๋ฆ„์ด kill๋กœ ๋ถ™์€ ์ด์œ ๋Š” ์‹œ๊ทธ๋„์„ ๋ณด๋ƒ„์œผ๋กœ์จ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃฝ์ด๋Š”๋ฐ ํ”ํžˆ ์‚ฌ์šฉ๋˜์–ด์™”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์‹œ๊ทธ๋„์— ๋”ฐ๋ฅธ ๋™์ž‘์€ ์ •์˜ํ•˜๊ธฐ ๋‚˜๋ฆ„์ด์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค.
pipex์—์„œ๋„ fork ๋ฐ wait, waitpid ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ์‹œ๊ทธ๋„์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์ด์šฉํ–ˆ์—ˆ๊ณ , ์‹œ๊ทธ๋„์˜ ์ข…๋ฅ˜์™€ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜์— ๋”ฐ๋ฅธ ๋™์ž‘ ๋“ฑ์„ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ–ˆ์—ˆ๋‹ค. ๋‹น์‹œ ์˜ˆ์‹œ์—์„œ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ผ ๋•Œ๋Š” ํ„ฐ๋ฏธ๋„ ์ƒ์—์„œ ์‚ฌ์šฉ์ž์˜ ํ‚ค ์ž…๋ ฅ์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜, ํ„ฐ๋ฏธ๋„ ์ƒ์˜ kill ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋ชจ๋‘ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋‹ฌ๋ ค์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ ์‹œ๊ทธ๋„์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ๋ถ€์ ํ•ฉํ•˜๋‹ค. ์ด ๋•Œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด kill ํ•จ์ˆ˜์ด๋‹ค.
kill ํ•จ์ˆ˜๋Š” ํŠน์ • ํ”„๋กœ์„ธ์Šค์— ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด์ฃผ๋Š” kill ๋ช…๋ น์–ด์˜ ์—ญํ• ๊ณผ ์ผ์น˜ํ•œ๋‹ค.
์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ID๋ฅผ pid๋กœ ์ฃผ๊ณ , sig์—๋Š” ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ์‹œ๊ทธ๋„์„ ํ• ๋‹นํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค. ํŠน์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ๋ฒ•๊ณผ ๋‹ฌ๋ฆฌ, kill ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ์ด์šฉํ•˜๋ฉด ๊ทธ๋ฃน์—๊ฒŒ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
pid๋ฅผ 0์œผ๋กœ ์ฃผ๋ฉด ํ˜„์žฌ ๊ตฌ๋™ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.
pid๋ฅผ -1๋กœ ์ฃผ๋ฉด pid๊ฐ€ 1์ธ init ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ , ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.
pid๊ฐ€ -1๋ณด๋‹ค ์ž‘๋‹ค๋ฉด -pid์— ํ•ด๋‹นํ•˜๋Š” ๊ทธ๋ฃน์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.
sig๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ์‹œ์Šคํ…œ ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์ „์— ์ž˜ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋ฉฐ, ๊ทธ ๊ฐ’์ด 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋”๋ผ๋„ sig ๊ฐ’์œผ๋กœ 0์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. sig ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ์—๋Š” ์‹ค์ œ๋กœ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด์ง€๋Š” ์•Š์ง€๋งŒ, pid๋กœ ์ž…๋ ฅํ•œ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ๊ทธ๋ฃน์— ๋Œ€ํ•ด ์กด์žฌ ์œ ๋ฌด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๋“ค์—๊ฒŒ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” kill ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ํ†ตํ•ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. kill ํ•จ์ˆ˜๋Š” ์„ฑ๊ณต์ ์ธ ์ˆ˜ํ–‰์ด ๋˜์—ˆ๋‹ค๋ฉด 0์ด ๋ฐ˜ํ™˜๋˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.
์œ„ ๊ฒฝ์šฐ์—์„œ pid์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ํ˜น์€ ๊ทธ๋ฃน์ด ์—†๋‹ค๋ฉด ESRCH, ํ”„๋กœ์„ธ์Šค ํ˜น์€ ๊ทธ๋ฃน์ด ์กด์žฌ๋Š” ํ•˜์ง€๋งŒ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด EPERM ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ฒŒ ๋œ๋‹ค.

4. ์˜ˆ์‹œ

#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> void child_signal(int sig) { if (sig == SIGTERM) { printf("Child: I got SIGTERM\n"); exit(0); } else { printf("Child: I got other signal\n"); exit(1); } } void parent_signal(int sig) { pid_t ret; if (sig != SIGCHLD) exit(1); ret = waitpid(-1, NULL, WNOHANG); printf("Parent: Child successfully terminated\n"); exit(0); } int main(void) { int i; pid_t pid; pid = fork(); if (pid == -1) return (1); else if (!pid) { signal(SIGTERM, child_signal); while (1) ; } else { signal(SIGCHLD, parent_signal); i = 5; while (i--) { printf("Parent: Signal will be sent in %d seconds\n", i + 1); usleep(1000 * 1000); } if (kill(pid, SIGTERM) == -1) return (1); while (1) ; } return (0); }
C
์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” SIGTERM์„ ์ž์‹ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋ณด๋ƒˆ๊ณ , ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” SIGTERM์„ ๋ฐ›์•˜์„ ๋•Œ child_signal์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ–ˆ๋‹ค. child_signal ์ดํ›„์—๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ์ปค๋„์€ SIGCHLD๋ฅผ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋ณด๋‚ด๋ฉด์„œ parent_signal์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์™€ ๊ฐ™์ด ์‹œ๊ทธ๋„์— ๋”ฐ๋ฅธ ๋™์ž‘ ์ •์˜๋Š” signal ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ด๋ค„์ง€๋ฉฐ, SIGSTOP, SIGKILL์— ๋Œ€ํ•ด์„œ๋Š” ๋™์ž‘ ์ •์˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

6. Approach

1) Error Handling

๋Œ€์ฒด์ ์œผ๋กœ usleep, kill, gettimeofday์™€ ๊ฐ™์€ ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„  Error์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๋งŽ์ด ๋ณด์•˜๋‹ค. ์–ธ๊ธ‰ํ•œ ํ•จ์ˆ˜๋“ค ์—ญ์‹œ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜์˜€์„ ๊ฒฝ์šฐ์—” Error๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
๋˜ํ•œ pthread_create, pthread_detach, pthread_join์— ๋Œ€ํ•ด์„œ๋Š” Error์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ•ด๋‘์—ˆ์ง€๋งŒ, pthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_unlock์— ๋Œ€ํ•ด์„  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋„ ๋งŽ์ด ๋ณด์•˜๋‹ค. pthread์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋“ค์€ Error๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค. ๋ฌผ๋ก  ์ •์˜๋œ ์†์„ฑ ๊ฐ’ ์ค‘์— Robust์ธ์ง€ ์•„๋‹Œ์ง€๊ฐ€ ์˜ํ–ฅ์„ ๋งŽ์ด ๋ผ์น˜๊ฒ ์ง€๋งŒ, ์ด๋Š” ๊ตฌ์ฒด์ ์ธ Error์— ๋Œ€ํ•œ ๋™์ž‘์ด ๋‹ค๋ฅผ ๋ฟ์ด๊ณ  Error๋ฅผ ๋‚ด๊ณ  ์•ˆ ๋‚ด๊ณ ์˜ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ pthread ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ๋„ Error๋ฅผ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
๋‹ค๋งŒ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด์„  exit, pthread_exit, pthread_cancel, pthread_kill ๋ฐ ์ข…๋ฃŒ ์‹œ ์ž์› ์ •๋ฆฌ๋ฅผ ์œ„ํ•œ Handler ๋“ฑ๋ก์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋“ค์˜ ์ด์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์™„๋ฒฝํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜๋Š” ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ข…๋ฃŒ ํ๋ฆ„์— ์žˆ๋Š” pthread์— ๋Œ€ํ•œ Destroy, Unlock๊ณผ ๊ฐ™์€ ํ–‰์œ„์— ๋Œ€ํ•ด์„  Error ์ฒ˜๋ฆฌ๋ฅผ ๋ฌด์‹œํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์™ธ์˜ pthread ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ Error Handling์„ ํ•ด์•ผํ•˜๊ณ , ํ˜น์—ฌ๋‚˜ ์ด๋ฅผ ํ’€์–ด๋‚ด๋Š” ๊ณผ์ •์—์„œ Deadlock์ด ๊ฑฑ์ •๋œ๋‹ค๋ฉด ์ด๋Š” Architecture๋ฅผ ํ†ตํ•ด ์–ด๋Š ์ •๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” mutex๋กœ pthread_mutex_lock์„ ํ•ด๋‘์–ด ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ณ , ๋‚˜๋จธ์ง€ ์ž‘์—…์šฉ ์“ฐ๋ ˆ๋“œ์—์„œ๋Š” Error ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น mutex๋ฅผ pthread_mutex_unlockํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ข…๋ฃŒ ํ๋ฆ„์„ ํƒ€๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด์— ๋”ฐ๋ผ pthread ํ•จ์ˆ˜๋“ค์˜ Error Handling๋„ ๊ฐ€๋Šฅํ•˜๊ณ , ๊ธฐ์กด์— ์ƒ์„ฑ๋˜์—ˆ๋˜ ์“ฐ๋ ˆ๋“œ๋“ค ์—ญ์‹œ ๋ฌธ์ œ ์—†์ด ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
fork์™€ semaphore๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ๋„ mutex๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ์™€ ๋™์ผํ•œ Architecture๋กœ ์ข…๋ฃŒ ํ๋ฆ„์— ์žˆ๋Š” semaphore์— ๋Œ€ํ•œ ์ž‘์—… ์™ธ์— ๋ชจ๋“  semaphore์˜ ์ž‘์—…์— ๋Œ€ํ•ด์„œ Error Handling์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ fork๋ฅผ ์ด์šฉํ•˜๋Š” Bonus์—์„œ๋Š” kill ํ•จ์ˆ˜๊ฐ€ ํ—ˆ์šฉ๋˜๋ฏ€๋กœ, ์ข…๋ฃŒ ํ๋ฆ„์„ ํƒ€๊ณ  ์žˆ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ kill ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

2) Scheduling

์ฒ ํ•™์ž๋“ค์—๊ฒŒ ์‹์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ํ–‰์œ„๋Š” ์ปดํ“จํŒ… ์ž์› ์ค‘ ํŠนํžˆ ๋…ผ๋ฆฌ ์ฝ”์–ด์˜ ์ˆ˜์— ์˜์กด์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ก ์ƒ ์ฃฝ์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ./philo 1000 410 200 200๊ณผ ๊ฐ™์€ ์ž‘์—…๋“ค์€ ๋งŽ์€ Context Switch ๋•Œ๋ฌธ์— ์•ผ๊ธˆ ์•ผ๊ธˆ ๋”œ๋ ˆ์ด๊ฐ€ ๋ˆ„์ ๋˜๋ฉด์„œ ์–ด์ฉ” ์ˆ˜ ์—†์ด ์ฃฝ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๋ก ์ƒ ์ฃฝ์ง€ ์•Š๋Š” ์ผ€์ด์Šค์™€ ์‹ค์ œ๋กœ ์ฃฝ์ง€ ์•Š๋Š” ์ผ€์ด์Šค๋ฅผ ๊ตฌ๋ถ„ ์ง€์„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์‹ค์ œ๋กœ ์ฃฝ์ง€ ์•Š๋Š” ์ผ€์ด์Šค๋Š” ๋จธ์‹ ์ด๋ผ๋Š” ์กฐ๊ฑด์ด ๊ณ ๋ ค๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๋‹ค๋งŒ ์ด๋ฅผ ํ‰๊ฐ€์—์„œ ์•…์šฉํ•˜์—ฌ ํ‰๊ฐ€์ง€์— ๊ธฐ์žฌ๋œ ์ผ€์ด์Šค๋“ค ๋งˆ์ €๋„ Context Switch ๋•Œ๋ฌธ์— ๋”œ๋ ˆ์ด๊ฐ€ ์Œ“์—ฌ ์ฒ ํ•™์ž๊ฐ€ ์ฃฝ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋””ํŽœ์Šค๋ฅผ ํ•˜๋Š” ํ–‰์œ„๋Š” ์˜ณ์ง€ ์•Š๋‹ค. ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์€ ํ‰๊ฐ€์ง€์— ๊ธฐ์žฌ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ˆ˜์šฉํ•˜๊ธฐ์— ๋„‰๋„‰ํ•œ ๋…ผ๋ฆฌ ์ฝ”์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‰๊ฐ€์ง€์— ๊ธฐ์žฌ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ๋Š” ๋”œ๋ ˆ์ด๊ฐ€ ์Œ“์—ฌ ์ฃฝ๋Š” ํ–‰์œ„๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
๋งŒ์ผ ํ‰๊ฐ€์ง€์— ๊ธฐ์žฌ๋œ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ๋„ ์ฒ ํ•™์ž๊ฐ€ ์ฃฝ์–ด๋ฒ„๋ฆฐ๋‹ค๋ฉด, ์ด๋Š” ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ์˜ Scheduling์„ ์ „ํ˜€ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. usleep ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฒ ํ•™์ž๊ฐ€ ๋ฐฅ์„ ๋จน๋Š” ์‹œ๊ฐ„์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ์— ๊ทธ ๊ฐ’์„ ๊ธฐ์žฌํ•˜๊ณ , ์ฒ ํ•™์ž๊ฐ€ ์ž์•ผํ•˜๋Š” ์‹œ๊ฐ„์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ์— ๊ทธ ๊ฐ’์„ ๊ธฐ์žฌํ•˜๋Š” ํ–‰์œ„๋Š” ์ฒ ํ•™์ž๊ฐ€ ์ฃฝ์„ ์ˆ˜ ๋ฐ–์— ์—†๋Š” ์ƒํ™ฉ์— ๋†“์ด๊ฒŒ ํ•œ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ usleep์„ ํ†ตํ•ด์„œ ์ธ์ž๋กœ ๋ฐ›์€ ์‹œ๊ฐ„ ๋งŒํผ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋ฅผ Sleep ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด, ์ด๋ฅผ ๊นจ์šฐ๋Š” ๊ฒƒ์€ ์ตœ์†Œํ•œ ์ธ์ž ๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์ง€๋‚œ ๋’ค์ผ ๋ฟ์ด๊ณ  ์ •ํ™•ํžˆ ์ธ์ž ๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์— ๊นจ์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด Sleep ์ƒํƒœ์—์„œ ๊นจ์–ด๋‚˜๋”๋ผ๋„ ๊นจ์–ด๋‚œ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋Š” ๊ณง ๋ฐ”๋กœ Running ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. Sleep ์ƒํƒœ์—์„œ ๊นจ์–ด๋‚œ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ๋Š” Ready Queue์— ๋“ค์–ด๊ฐ€์„œ Ready ์ƒํƒœ๋กœ Kernel์˜ Dispatcher์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋„๋ก ๊ธฐ๋‹ค๋ฆฐ ํ›„, Dispatcher๊ฐ€ Ready Queue๋ฅผ ์ˆ˜๊ฑฐํ•ด์•ผ๋งŒ ๋น„๋กœ์†Œ Running ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ž๋กœ ๋ฐ›์€ ์‹œ๊ฐ„ ๋งŒํผ์„ usleep์„ ๋„ฃ๋Š” ํ–‰์œ„๋Š” ๊ฝค๋‚˜ ํฐ ๋”œ๋ ˆ์ด๋ฅผ ๋ˆ„์ ์‹œํ‚ค๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ฃผ์–ด์ง„ ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๋ฉด, ./philo 4 410 200 200๊ณผ ๊ฐ™์ด ์ฃฝ์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์ผ€์ด์Šค ์ž„์—๋„ ์•ฝ 50์ดˆ ๊ฒฝ๊ณผ ํ›„์— ์ฒ ํ•™์ž๊ฐ€ ์ฃฝ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ฒ ํ•™์ž๊ฐ€ ์ฃฝ๋Š” ์‹œ๊ฐ„์€ ์ƒํ™ฉ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋”œ๋ ˆ์ด๊ฐ€ ์œ„์ฒ˜๋Ÿผ ์Œ“์ธ๋‹ค๋ฉด ์–ธ์  ๊ฐ€ ์ฃฝ๋Š”๋‹ค.
์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์€ usleep์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์‹œ๊ฐ„์„ EPSILON๊ณผ ๊ฐ™์€ ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ์‹œ๊ฐ„์„ ๋ฐ˜๋ณตํ•˜๋Š” ์‹์œผ๋กœ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ 2000ms ๋งŒํผ ์ž์•ผํ•œ๋‹ค๋ฉด, 1ms๋งŒํผ ์žฌ์šฐ๋Š” ํ–‰์œ„๋ฅผ 2000๋ฒˆ ๋ฐ˜๋ณตํ•ด๊ฐ€๋ฉด์„œ ์›ํ•˜๋Š” ์‹œ๊ฐ„๋งŒํผ์„ ์žค๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 1ms์™€ ๊ฐ™์€ ๋‹จ์œ„๋ฅผ EPSILON์ด๋ผ๊ณ  ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋ณด๋‹ค ๋” ์ž‘์€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์€ ๋‚ฎ์•„์ง€๊ฒ ์ง€๋งŒ ์กฐ๊ธˆ์€ ๋” ์ •ํ™•ํ•œ ์‹œ๊ฐ„ ํŒ๋‹จ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ./philo 4 410 200 200์„ ์ˆ˜ํ–‰ํ•ด๋ณด๋ฉด ์ด์ „๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์‹ค์ œ๋กœ ์ฃฝ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰, ์—ฌ์œ ๋กœ์šด ๋…ผ๋ฆฌ ์ฝ”์–ด๊ฐ€ ๋ณด์žฅ๋˜์—ˆ์„ ๋•Œ๋Š” ์ ์–ด๋„ ํ‰๊ฐ€์ง€์— ๊ธฐ์žฌ๋œ ํ•ญ๋ชฉ๋“ค์— ๋Œ€ํ•ด์„  ์ฒ ํ•™์ž๋“ค์ด ์ฃฝ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚˜์„œ๋Š” ์•ˆ ๋œ๋‹ค. ์ž์‹ ์˜ ๋…ผ๋ฆฌ ์ฝ”์–ด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜์˜ ์ฒ ํ•™์ž๊ฐ€ ์กด์žฌํ•  ๋•Œ์— ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ถฉ๋ถ„ํžˆ ๋ณด์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ˆ Context Switch๋ฅผ ์–ธ๊ธ‰ํ•˜์—ฌ ๋””ํŽœ์Šค๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•˜๋„๋ก ํ•˜์ž.

3) Compiling Option

๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋Š” ๋ˆ„์ˆ˜ ํ™•์ธ์„ ์œ„ํ•œ leaks ๋ช…๋ น์–ด ๋ง๊ณ ๋„ Buffer Overflow๋“ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ Compiling Option์œผ๋กœ fsanitize๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ์ด ์ค‘์—์„œ๋„ fsanitize=address ์˜ต์…˜์„ ๊ธฐ์žฌํ•œ ์ฑ„๋กœ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด, fork ํ•จ์ˆ˜์™€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๊ด€๋ จ ํ•จ์ˆ˜๋“ค์—๊ฒŒ ๊ฝค๋‚˜ ํฐ ์‹œ๊ฐ„ ๋”œ๋ ˆ์ด๋ฅผ ์•ผ๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ์‹ค์ œ๋กœ fsanitize ์˜ต์…˜์„ ์ด์šฉํ•œ ์ฑ„๋กœ fork ์ด์ „๊ณผ ์ดํ›„๋กœ gettimeofday๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฐจ์ด๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, ๋‘ gettimeofday ์‚ฌ์ด์— fork ๋ฐ–์— ์—†์—ˆ์Œ์—๋„ ๋ฌด๋ ค 20ms ~ 30ms์˜ ๋”œ๋ ˆ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒ ํ•™์ž๋“ค์ด ์ฃฝ์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„  ๋”œ๋ ˆ์ด๋ฅผ ์ตœ์†Œํ™” ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”๋ฐ, fsanitize ์˜ต์…˜ ๊ธฐ์žฌ๋Š” ํ”„๋กœ์ ํŠธ ์™„์ˆ˜์— ์น˜๋ช…์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์ œ์ถœ ์ „์—๋Š” fsanitize์™€ ๊ฐ™์€ ๋””๋ฒ„๊น… ์˜ต์…˜์„ ์ง€์šฐ๊ฒŒ ๋˜์ง€๋งŒ, ๋””๋ฒ„๊น… ์˜ต์…˜์„ ๊ธฐ์žฌํ•œ ์ฑ„๋กœ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์—์„œ fsanitize์˜ ๋”œ๋ ˆ์ด๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ๊ฝค๋‚˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋งˆ์ณค๋‹ค๋ฉด ํ•ด๋‹น ์˜ต์…˜์„ ์ง€์šด ๋’ค์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

7. Reference

๊ณ ๋ ค๋Œ€ํ•™๊ต COSE341 ์šด์˜์ฒด์ œ by ์œ ํ˜ ๊ต์ˆ˜๋‹˜

8. Code of Jseo