๐ OS์์์ Race Condition (1/3)

์ฌ๋ผ์ด๋๋ ์ด์์ฒด์ ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋
์ธ Race Condition (๊ฒฝ์ ์กฐ๊ฑด),
๊ทธ ์ค์์๋ ์ปค๋ ๋ชจ๋์์ interrupt๊ฐ ๋ฐ์ํ์ ๋์ ์ํ์ฑ์ ์ค๋ช
ํ๊ณ ์์ด.
"Interrupt handler vs. kernel" ์ํฉ์ ์๊ฐํํ ๊ทธ๋ฆผ๊ณผ ํจ๊ป, ์ค์ต์ฒ๋ผ ๋ ์ง์คํฐ ๊ฐ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ค๋ช
ํ๋ ๊ตฌ์กฐ์ผ.
interrupt handler vs. kernel
๐ง ํต์ฌ ๊ฐ๋ ์์ฝ
Race Condition:
๋ ์ด์์ ํ๋ก์ธ์ค(๋๋ interrupt)๊ฐ **๊ณต์ ์์(์: count ๋ณ์)**์ ๋์ ์ ๊ทผํ๋ฉด์
์๋ํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ .
๐ ๋ฐ์ ์ํฉ ์๋๋ฆฌ์ค
- count++ ์ํ ์ ๋ด๋ถ์ ์ผ๋ก ๋ค์ ์์๋ก ์ฒ๋ฆฌ๋จ:
- load count โ ๋ ์ง์คํฐ R1 โ count (์: 10)
- inc R1 โ R1 โ 11
- store R1 โ count
๐จ ์ํ ์ํฉ
- ์ฌ์ฉ์๊ฐ count++ ์คํ ์ค (Kernel mode์์ ์คํ ์ค)
- ์ด ๋ ์ธํฐ๋ฝํธ ๋ฐ์
- โ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ๋ ๊ฐ์ count++ ์ํ
- ๋ ๊ณณ ๋ชจ๋ ๊ฐ์ count ์ฃผ์ ์ฐธ์กฐ (๊ณต์ ๋ณ์)
โ ๊ฐ์ด ๊ผฌ์ (Race ๋ฐ์)
๐ ๋ฌธ์ ์ ํต์ฌ
- 10 โ 11๋ก ์ฌ๋ผ๊ฐ์ผ ํ๋๋ฐ,
๋ ๋ค load ์์ ์์ 10์ ์ฝ์ โ ๋ ๋ค 11๋ก ๋ง๋ค๊ณ ์ ์ฅ
โ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๋ฒ ์ฆ๊ฐํด์ผ ํ ๊ฐ์ด ํ ๋ฒ๋ง ์ฆ๊ฐ๋จ
โ๏ธ ์ฌ๋ผ์ด๋ ํ๊ธฐ ์ ๋ฆฌ
- โ๋ ๋ค 10์์ ์์ํด์ 11๋ก ์ ์ฅํจ โ ํ๋๋ง ๋ฐ์๋จโ
- โCPU์ ์ ์ฅ๋ register ๊ฐ ๋ณต๊ตฌ๋จ โ ์ด์ ๊ฐ์ด ๋ฎ์ด์จ์งโ
- โ์ปค๋ ๋ชจ๋ ์ค ์ธํฐ๋ฝํธ ๊ฑธ๋ฆฌ๋ฉด ์ํโ
- โcontext switch ๋ฐ์ โ count ๊ฐ ์ ์ค ๊ฐ๋ฅโ
- โkernel ๋ชจ๋ ์คํ ์ค disable interrupt ํ์โ
- ์๋์ชฝ ์ค๋ช : if you preempt CPU while in kernel mode โฆ โ ๋ฌธ์ ๋ฐ์ ์กฐ๊ฑด ์์ฝ
โ ์๊ธฐ ํฌ์ธํธ
- Race Condition์ ๊ณต์ ์์๊ณผ ๋น๋๊ธฐ ์ ๊ทผ์ด ๋์์ ์ผ์ด๋ ๋ ๋ฐ์
- ํนํ **count++, count--**๋ ๋ด๋ถ์ ์ผ๋ก 3๋จ๊ณ โ ์ค๊ฐ์ ๋ผ์ด๋ค๋ฉด ๋ฌธ์ ๋ฐ์
- ํด๊ฒฐ ๋ฐฉ๋ฒ:
- Interrupt disable/enable๋ก ๋ณดํธ
- Lock, Mutex, Semaphore๋ก ๋๊ธฐํ
- ์ปค๋ ๋ชจ๋ ์ค preemption/interruption ๊ธ์ง๊ฐ ํต์ฌ
โ๏ธ ์ ๋ฆฌ ๋ฌธ์ฅ
"Kernel ๋ชจ๋์์ ๊ณต์ ๋ณ์ ์ ๊ทผ ์ค interrupt๊ฐ ๋ฐ์ํ๋ฉด
Interrupt handler๋ ๋์ผ ์์์ ์์ ํ๊ฒ ๋์ด race condition์ด ๋ฐ์ํ๋ค."
์ด๊ฑด Race Condition์ ๊ตฌ์กฐ์ ๋ฐ์ ์ด์ ์ ๋ฐฉ์ง ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ ๊ฐ์ฅ ์ ํ์ ์ธ ์ฌ๋ผ์ด๋์ผ.
๐ If you preempt CPU while in kernel mode โฆ

์ด๋ฒ ์ฌ๋ผ์ด๋๋ ์์ ๋ด์ฉ๊ณผ ์ฐ๊ด๋ Race Condition์ ์ค์ง์ ์ธ ์์ ์ํฉ์ ๋ค๋ฃจ๊ณ ์์ด.
ํนํ, "์ปค๋ ๋ชจ๋ ์ค preemption(์ ์ )์ด ๋ฐ์ํ ๊ฒฝ์ฐ" ์ด๋ค ์ผ์ด ์๊ธฐ๋์ง๋ฅผ ์๊ฐ์ ์ผ๋ก ์ค๋ช
ํ๊ณ ์์ด.
๐ ์ฌ๋ผ์ด๋์ ๊ทธ๋ ค์ง ํ์๋ผ์ธ, ์์คํ
์ฝ ํ๋ฆ, count ๊ฐ ๋ณํ, ๊ทธ๋ฆฌ๊ณ ๋นจ๊ฐ ํ๊ธฐ๊น์ง ํฌํจํด์ ์ ๋ฆฌํ ๊ฒ!
๐ If you preempt CPU while in kernel mode โฆ
๐ง ๋ฐฐ๊ฒฝ ์ค๋ช
**์ปค๋ ๋ชจ๋(kernel mode)**๋ ์ด์์ฒด์ ์ ํต์ฌ ๊ธฐ๋ฅ์ด ์คํ๋๋ ํน์ ๊ถํ ๋ชจ๋์ผ.
๋ง์ฝ ์ด ์ํ์์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ **CPU๋ฅผ ์ ์ (preempt)**ํ๋ค๋ฉดโฆ
โ Race Condition์ด ๋ฐ์ํ ์ ์์ โ ๏ธ
๐งต ์๋๋ฆฌ์ค ์์ฝ
(1) ํ๋ก์ธ์ค A (Pโ)
- ์ฌ์ฉ์ ๋ชจ๋ โ ์์คํ ์ฝ read() ํธ์ถ โ ์ปค๋ ๋ชจ๋ ์ง์
- ์ปค๋์์ count++ ์ํ ์ค์ด์์ (์์ง ์๋ฃ๋์ง ์์!)
(2) ํ์ํํ ์ข ๋ฃ & ํ๋ก์ธ์ค B (P_b)๊ฐ CPU ์๊ตฌ
- Pโ๋ ์ปค๋ ๋ชจ๋ ์ํ์์ preempt ๋นํจ
- P_b๊ฐ ์ปค๋์ ์ง์ ํด count ๋ณ์ ์ฌ์ฉ
- P_b๊ฐ count ์์ ํ ๋ค โ ๋ค์ Pโ ๋ณต๊ท โ Pโ๊ฐ ์ด์ register ๊ฐ์ผ๋ก count ๋ฎ์ด์!
โ ๐ฅ ๊ฒฐ๊ตญ count = 10 โ 9 โ 11๋ก ์ค์ผ๋จ (์ฌ๋ฐ๋ฅธ ๊ฐ ์๋)
๐ ์ฌ๋ผ์ด๋ ํ๊ธฐ ์์ฝ
- โcount๊ฐ์ด 10โ9โ11 ์ด์ํ๊ฒ ๋ฐ๋โ
- โCPU ๋๋๋ ค ๋ฐ์ โ ์ด์ ๊ฐ์ผ๋ก ๋ฎ์ด์ฐ๊ธฐโ
- โINC/STORE โ LOAD/DEC/STORE ์ฌ์ดํด ์ถฉ๋โ
- "ํด๊ฒฐ์ฑ ์ด ์๋ 'ํํผ์ฑ ' = ์ปค๋ ๋ชจ๋์์๋ preemptํ์ง ์๋๋ก"
โ ํด๊ฒฐ/ํํผ ๋ฐฉ์
๐ ํด๊ฒฐ์ฑ | Critical Section ๋ณดํธ (์: Mutex, Semaphore, Spinlock ๋ฑ) |
โ ๏ธ ํํผ์ฑ | ์ปค๋ ๋ชจ๋์์๋ CPU๋ฅผ preemptํ์ง ์์ |
๐ง ์ค์ ์ ์ฉ | Linux๋ preempt ๊ฐ๋ฅํ๋ **preempt_disable/enable()**๋ก ๊ตฌ๊ฐ ๋ณดํธ |
ํต์ฌ ๋ฌธ์ฅ ์ ๋ฆฌ
โ์ปค๋ ๋ชจ๋์์ count๋ฅผ ์์ ํ๋ ์ค๊ฐ์ preempt๊ฐ ๋ฐ์ํ๋ฉด,
์ด์ ๊ฐ์ด ๋ฎ์ด์์์ ธ Race Condition์ด ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ์ปค๋ ๋ชจ๋์์๋ preemption์ ๋ง๊ฑฐ๋, ๋๊ธฐํ๋ฅผ ํตํด ๋ณดํธํด์ผ ํ๋ค.โ
๐ก ์ํ ๋๋น ํ
- count++๋ฅผ ๋ด๋ถ์ ์ผ๋ก๋ load โ inc โ store ํํ๋ก ์ฒ๋ฆฌํจ์ ๋ฐ๋์ ๊ธฐ์ต!
- ์ฌ์ฉ์ ๋ชจ๋ <-> ์ปค๋ ๋ชจ๋ ์ ํ ์ interrupt/preempt๊ฐ ๋ฐ์ํ๋ฉด Race ๋ฐ์ ๊ฐ๋ฅ
- ํด๊ฒฐ์ฑ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ํ ์ ์์ด์ผ ํจ (preempt ๋ง๊ธฐ, lock ์ฌ์ฉ ๋ฑ)
์ด ์ฌ๋ผ์ด๋๋ ์ด์์ฒด์ ์ ์ค์ context switching๊ณผ interrupt/preemption ํ์ด๋ฐ์ด ์ผ๋ง๋ ์ํํ ์ ์๋์ง๋ฅผ ์ค๋ช
ํ๋ ํต์ฌ ์์์ผ.
๐ OS์์์ Race Condition (2/3)

๐งฉ Preempt a process running in kernel?
๐ง ํต์ฌ ๊ฐ๋
Race Condition์ด ๋ฐ์ํ๋ ๊ฑด ๋จ์ํ preemption ๋๋ฌธ์ด ์๋๋ผ,
"**๊ณต์ ์์(Shared Data)**์ ๋์์ ์ ๊ทผํ๋ฉด์๋ Critical Section์ด ๋ณดํธ๋์ง ์์ ๊ฒฝ์ฐ"์๋ง ํด๋น๋ผ.
๐งต ์๋๋ฆฌ์ค ์์ฝ
โฆ ํ๋ก์ธ์ค Pโ
- ์ฌ์ฉ์ ๋ชจ๋ โ ์ปค๋ ๋ชจ๋ ์ง์
- ์ปค๋์์ ๊ณต์ ์์(count++) ์ํ ์ค
โฆ ๊ทธ ์๊ฐ, ํ๋ก์ธ์ค P_b๊ฐ system call ์์ฒญ
- CPU๋ฅผ ์ ์ ๋ฐ์ ์ปค๋ ์ง์
- ์ญ์ ๊ณต์ ์์(count--) ์ํ
- ๋ ์ปค๋ ๋ชจ๋๊ฐ ๋์์ ์ปค๋ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์
โ ์ด๋ Race Condition ๋ฐ์ ์ํ ์์
๐ ํ๊ธฐ ๋ด์ฉ ์ ๋ฆฌ
- "์ฌ๊ธฐ์ c.s(Critical Section) ์ผ์ด๋ ๋ ๋ฌธ์ "
- "PA๋ count++, PB๋ count-- ์ค โ ๋ ๋ค count ์ ๊ทผ"
- "์ฌ๊ธฐ์๋ context switch ์ผ์ด๋๋ ๋ฌธ์ X"
โ โ user mode ์ค์๋ address space๊ฐ ๋ถ๋ฆฌ๋์ด ์์ด ๋ฌธ์ ์์
โญ ํต์ฌ ์์ ๋น๊ต
PA ์ปค๋ ๋ชจ๋ ์ค preempt ๋จ | count++ ์ค๊ฐ์ ๋ผ์ด๋ค๋ฉด โ PB๊ฐ count ์์ | โ ๋ฐ์ ์ํ |
PA user mode์ผ ๋ preempt | ๊ฐ์ ๋ค๋ฅธ address space โ ๊ณต์ ์์ | โ ์์ |
๐ ์ฌ๋ผ์ด๋ ํ๋จ ์ค๋ช ์ ๋ฆฌ
- * ์ฌ์ฉ์ address space๋ ๊ณต์ ๋์ง ์์
- ** ํ์ง๋ง system call ์ค์๋ kernel address space๋ฅผ ๊ณต์ ํ๊ฒ ๋จ (๊ณต์ ์์ ์กด์ฌ)
- *** โ ๊ทธ ์ํ์์ preempt๊ฐ ๋ฐ์ํ๋ฉด Race ๋ฐ์ ๊ฐ๋ฅ์ฑ ์์
โ ์๊ธฐ ํฌ์ธํธ
- Race Condition์ ๊ณต์ ๋ ์์์ ๋ํด ๋น๋๊ธฐ ์ ๊ทผ์ด ์์ ๋ ๋ฐ์
- ์ปค๋ ๋ชจ๋๋ผ๋ฆฌ๋ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํจ โ ์ํํจ
- user mode์์๋ ๊ฐ์์ ๊ณต๊ฐ์ ์ฌ์ฉ โ ์์ ํจ
- ํด๊ฒฐ๋ฒ: critical section ๋ณดํธ / ์ปค๋ ๋ชจ๋ ์ค preempt ๋ฐฉ์ง
โ๏ธ ์ ๋ฆฌ ๋ฌธ์ฅ
โ์ปค๋ ๋ชจ๋์์ system call ์ํ ์ค preempt๊ฐ ๋ฐ์ํ๋ฉด,
๋ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ปค๋ ์์(count ๋ฑ)์ ์ ๊ทผํ์ฌ Race Condition์ด ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ฉด user mode์์๋ ์ฃผ์ ๊ณต๊ฐ์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฏ๋ก ์์ ํ๋ค.โ
๐ OS์์์ Race Condition (3/3)

๐ Multiprocessor ํ๊ฒฝ์์์ ๊ฒฝ์ ์กฐ๊ฑด
๐ ํต์ฌ ๊ฐ๋
Multiprocessor ์์คํ ์์๋ ์ฌ๋ฌ CPU๊ฐ ๋์์ **๊ณต์ ๋ฉ๋ชจ๋ฆฌ(์: count ๋ณ์)**์ ์ ๊ทผํ ์ ์์.
โ ํ CPU๊ฐ count++ ์ค์ผ ๋, ๋ค๋ฅธ CPU๊ฐ ๋์์ count--๋ฅผ ์ํํ๋ฉด Race Condition ๋ฐ์.
๐งต ์ํฉ ํ๋ฆ ์์ฝ
CPU โ
- count++ ์ํ ์ค
- ๋ด๋ถ ๋์: LOAD(10) โ INC(11) โ STORE(11)
๋์์ CPU โก
- count-- ์ํ
- ๋ด๋ถ ๋์: LOAD(10) โ DEC(9) โ STORE(9)
๐งจ ๊ฒฐ๊ณผ: ๋ ๋ค ๋์ผํ ์ด๊ธฐ ๊ฐ 10์ ์ฝ๊ณ , ๊ฐ๊ฐ ๋ฎ์ด์ฐ๊ธฐ โ ๊ฒฐ๊ณผ๊ฐ ๊ผฌ์
๐ฅ ๋ฌธ์ ํต์ฌ
โ ์ด๋ค CPU๊ฐ ๋ง์ง๋ง์ STORE๋ฅผ ํ๋๊ฐ์ ๋ฐ๋ผ count ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง
โ interrupt disable/enable๋ง์ผ๋ก ํด๊ฒฐ ๋ถ๊ฐ
(์๋ํ๋ฉด CPU๋ง๋ค ๋ณ๋ interrupt controller๊ฐ ์์)
โ ์ฌ๋ผ์ด๋ ํ๊ธฐ ์์ฝ
- โ์ด๋ค CPU๊ฐ ๋ง์ง๋ง์ผ๋ก store ํ๋๊ฐ โ Race ๋ฐ์ ์์ธโ
- โMultiprocessor๋ interrupt ์ ์ด๋ง์ผ๋ก๋ ํด๊ฒฐ ๋ถ๊ฐ๋ฅโ
- ๋ฐฉ๋ฒ โ : โ1๊ฐ๋ง ์ปค๋ ์ง์ ํ์ฉ โ ๋นํจ์จ์ โ
- ๋ฐฉ๋ฒ โก: โ๊ณต์ ๋ฐ์ดํฐ๋ง๋ค lock/unlock ์ ์ฉ โ ์ ์์ ํด๊ฒฐโ
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ 2๊ฐ์ง
๋ฐฉ๋ฒ โ | ํ๋ฒ์ 1๊ฐ์ CPU๋ง ์ปค๋ ์ง์ ํ์ฉ | ์ปค๋ ์ ๊ทผ ์๋ ๋๋ฆผ, ๋ณ๋ ฌ์ฑ ์ ํ |
๋ฐฉ๋ฒ โก | ๊ณต์ ์์์ ๋ํด lock/unlock ์ฌ์ฉ | lock ์ค๊ณ ์๋ชปํ๋ฉด deadlock, starvation ๊ฐ๋ฅ |
โ โ ํ๊ธฐ: โlock ์์ฒด๊ฐ ๋ฌธ์ ์ฑ Oโ
๐ก ์ ๋ฆฌ ๋ฌธ์ฅ
โMultiprocessor ํ๊ฒฝ์์๋ ๊ณต์ ์์์ ๋ํ ๋๊ธฐํ ์์ด ์ฌ๋ฌ CPU๊ฐ ์ ๊ทผํ ๊ฒฝ์ฐ
Race Condition์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ lock/unlock์ ํตํ ๋ณดํธ๊ฐ ํ์์ ์ด๋ค.โ
โ ์๊ธฐ ํฌ์ธํธ
- count++, count--๋ atomic operation์ด ์๋!
- Multiprocessor ํ๊ฒฝ์์๋ disable interrupt๋ก๋ ๋ณดํธ ๋ถ๊ฐ
- ๋ฐ๋์ lock ๋๋ atomic ์ฐ์ฐ ์ง์ ๊ธฐ๋ฒ ํ์ (e.g., test-and-set, compare-and-swap ๋ฑ)
- ์ค์ต/์ด๋ก /์ฝ๋ ๊ตฌํ ์ ๋ถ์์ ๋์ฌ ์ ์๋ ์ฃผ์
์ด ์ฌ๋ผ์ด๋๋ ๋๊ธฐํ์ ํ์์ฑ, ํนํ Multiprocessor ํ๊ฒฝ์์์ ๊ตฌ์กฐ์ Race Condition์ ์๊ฐ์ ์ผ๋ก ์ค๋ช
ํ๋ ๋ง๋ฌด๋ฆฌ ์ฅ๋ฉด์ด์ผ.
"๋์ ์ ๊ทผ + ๋ฏธ๋ณดํธ โ ๊ผฌ์ ๋ฐ์" ๊ณต์์ฒ๋ผ ์ธ์๋ฌ๋ ์ข์!
๐ Example of a Race Condition

(๊ณต์ ์์์ ๋ํ ๋น๋๊ธฐ ์ ๊ทผ ๋ฌธ์ )
๐ง ํต์ฌ ๊ฐ๋
์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ํ๋์ ๊ณต์ ๋ณ์ X์ ์ ๊ทผํด์ ๊ฐ์ ์์ ํ๋๋ฐ,
์์ ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ์ํฉ์ด ๋ฐ๋ก Race Condition!
๐ ์ฌ๋ผ์ด๋ ๊ตฌ์ฑ
๐งฑ ๊ณต์ ๋ณ์
- X = 2 (์ด๊ธฐ๊ฐ)
๐ ์ฐ์ฐ ๋ชฉ์
- P1: X = X + 1 โ ๊ธฐ๋๊ฐ: 3
- P2: X = X - 1 โ ๊ธฐ๋๊ฐ: 1
๐งฎ ๋ด๋ถ ์ฐ์ฐ (P1 / P2)
P1 | load X โ reg1 inc reg1 store reg1 โ X |
P2 | load X โ reg2 dec reg2 store reg2 โ X |
๐ฅ Race ๋ฐ์ ์ํฉ ์์
- P1์ด X=2๋ฅผ reg1์ ๋ก๋ํ๊ณ ์์ง store ์ ํ ์ํ
- ๊ทธ ์ฌ์ด์ ํ์ด๋จธ ์ธํฐ๋ฝํธ(context switch) ๋ฐ์ โ P2๊ฐ CPU ์ ์
- P2๋ X๋ฅผ ์ฝ๊ณ ๊ฐ์ โ X=1 ์ ์ฅ
- ๋ค์ P1 ๋ณต๊ท โ X=3 ์ ์ฅ
๐ป ๊ฒฐ๊ณผ: X = 2 โ 1 โ 3
โ P2์ ๋ณ๊ฒฝ ๋ด์ฉ(1)์ด ์ฌ๋ผ์ง = Race Condition ๋ฐ์
โ ์ฌ๋ผ์ด๋ ํ๊ธฐ ์์ฝ
- โ์ฌ์ฉ์ ํ๋ก์ธ์ค P1 ์ํ ์ค timer interrupt๊ฐ ๋ฐ์ํ์ฌ P2๊ฐ CPU๋ฅผ ์ป๊ฒ ๋๋ฉด?โ
โ Critical Section ๋ณดํธ ์์ผ๋ฉด P2์ ์์ ์ด ๋ฌด์๋ ์ ์์
โ ํต์ฌ ์ ๋ฆฌ
๋ฐ์ ์กฐ๊ฑด | ๊ณต์ ์์(X)์ ๋์์ ์์ ํ๋ ๋ ํ๋ก์ธ์ค๊ฐ ์์ |
๋ฌธ์ ์์ธ | ์ฐ์ฐ ๋จ์(loadโincโstore)๊ฐ **์์์ (atomic)**์ด์ง ์์ |
ํด๊ฒฐ ํ์ | ์ฐ์ฐ ์ ์ฒด๋ฅผ ํ๋์ Critical Section์ผ๋ก ๋ฌถ์ด์ผ ํจ |
๐งฉ ํด๊ฒฐ ๋ฐฉ์ ์์ฝ
- Lock ์ฌ์ฉ: lock(X) โ ์ฐ์ฐ โ unlock(X)
- Atomic ์ฐ์ฐ ๋์ : Test-and-set, Compare-and-swap ๋ฑ
- ์ปค๋ ๋ ๋ฒจ ๋ณดํธ: preempt disable, spinlock ๋ฑ ์ฌ์ฉ
๐ก ์๊ธฐ์ฉ ๋ฌธ์ฅ
"Race Condition์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์์์ ๋ํด ๋น๋๊ธฐ์ ์ผ๋ก ์ ๊ทผํ ๋ ๋ฐ์ํ๋ฉฐ,
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ฐ์ฐ์ Atomicํ๊ฒ ๋ง๋ค๊ฑฐ๋ Lock์ผ๋ก ๋ณดํธํด์ผ ํ๋ค."
์ด ์ฌ๋ผ์ด๋๋ Race Condition์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ด๊ณ ์์ฃผ ์ถ์ ๋๋ ํํ์ด๋ฏ๋ก,
์ฐ์ฐ ๋จ์ / context switch ์์ / ๊ฒฐ๊ณผ ๊ผฌ์ ์ด์ ๋ฅผ ์ ํํ ์ค๋ช
ํ ์ ์์ด์ผ ํด!
๐ Algorithm 1 โ Mutual Exclusion using turn only

๐ ํต์ฌ ์์ด๋์ด
ํ๋์ ๊ณต์ ๋ณ์ turn์ ํตํด ๋ ์ค ํ๋๋ง CS์ ๋ค์ด๊ฐ๋๋ก ์ ์ดํ๋ค.
๐ ์ฌ์ฉ ๋ณ์
- turn == 0: ํ๋ก์ธ์ค Pโ๊ฐ ์ง์ ๊ฐ๋ฅ
- turn == 1: ํ๋ก์ธ์ค Pโ๊ฐ ์ง์ ๊ฐ๋ฅ
- ์ฆ, ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ํ์ฉ๋๋ฉฐ, CS๋ฅผ ๋น ์ ธ๋์จ ์ชฝ์ด ํด์ ๋๊ฒจ์ค
๐งฑ ์๊ณ ๋ฆฌ์ฆ ๊ตฌ์กฐ
๐น ํ๋ก์ธ์ค Pโ
๐น ํ๋ก์ธ์ค Pโ
๐ ํ๊ธฐ ์์ฝ ์ ๋ฆฌ
- while(turn != i) ์กฐ๊ฑด์ ๋ด ํด์ด ๋ ๋๊น์ง **๋ฌดํ ๋๊ธฐ(loop)**ํจ
- ํ๊ธฐ์์ ๊ฐ์กฐํ ๊ฒ์ฒ๋ผ:
- ๋ ๋ค CS์ ๋ค์ด๊ฐ๋ ค๊ณ ํด๋, turn์ ํ๋๋ง ์ด์ด์ฃผ๋ฏ๋ก Mutual Exclusion์ OK
- ํ์ง๋ง ์๋๊ฐ Remainder Section์ ๋จธ๋ฌผ๋ฌ๋ ๋ด ํด์ด ์๋๋ฉด ๋๋ ๋ฌด์กฐ๊ฑด ๊ธฐ๋ค๋ฆผ
- ์ด๊ฒ ๋ฐ๋ก Progress ์กฐ๊ฑด์ ์๋ฐํ๋ ๊ฒ
๐ ์กฐ๊ฑด ํ๊ฐ
Mutual Exclusion | โ ๋ง์กฑ | ๋์์ CS ์ง์ ๋ถ๊ฐ |
Progress | โ ๋ถ๋ง์กฑ | ๋ ๋ค CS ์ํด๋ turn์ด ์ ๋ฐ๋๋ฉด ๋ฌดํ ๋๊ธฐ |
Bounded Waiting | โ ๋ถ๋ง์กฑ | ํด์ด ์์ํ ๋์์ค์ง ์์ ์ ์์ |
๐ ํต์ฌ ํ๊ธฐ ํด์
- * ๋จ์ํ๊ฒ swap-turn ๋ฐฉ์
- * Pโ, Pโ ๋ ๋ค critical section ์ํ๋ฉด turn์ด ์ ๋ฐ๋์ด ๋ฉ์ถค
- * "์ด๊ฑด mutual exclusion๋ง ๋ง์กฑํ๊ณ ๋๋จธ์ง๋ ๋ถ๋ง์กฑ"
- โค ๊ทธ๋์ ์ด ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก **Peterson's Algorithm (Algorithm 3)**๊ฐ ๋ฑ์ฅํ ๊ฑฐ์ผ
โ ์๊ธฐ ํฌ์ธํธ
- turn ๋ณ์๋ง ์ฌ์ฉ โ ์ํธ๋ฐฐ์ OK
- ์ง์ ์๋ ํํ X โ ์งํ์ฑ ๋ฌธ์ ๋ฐ์
- โค ์๋ก ๋ฐฐ๋ ค ์์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ง ํ๋ฉด ๊ต์ฐฉ ๊ฐ๋ฅ
- Peterson ์๊ณ ๋ฆฌ์ฆ์์ ์ด๊ฑธ ๊ฐ์ (flag + turn)
๐ Algorithm 2 - Mutual Exclusion (2-Process)

๋ ํ๋ก์ธ์ค๊ฐ ๋์์ **Critical Section(CS)**์ ๋ค์ด๊ฐ์ง ์๋๋ก ์ํธ๋ฐฐ์ (Mutual Exclusion)๋ฅผ ๋ณด์ฅ
๐ ์ฌ์ฉ ๋ณ์
- ์ด๊ธฐ ์ํ: flag[0] = flag[1] = false
- flag[i] = true โ ํ๋ก์ธ์ค Pi๋ CS ์ง์ ์ ์ํจ
- flag[j] = true โ ์๋ ํ๋ก์ธ์ค๊ฐ CS์ ๋ค์ด๊ฐ๋ ค๊ณ ํ๋ค๊ณ ์ธ์๋จ
๐งฑ ์๊ณ ๋ฆฌ์ฆ ๊ตฌ์กฐ (P_i ๊ด์ )
๐ ์ฌ๋ผ์ด๋ ํ๊ธฐ ํด์
- flag[i] = true: ๋ ๋ค์ด๊ฐ๊ฒ
- while (flag[j]): ์๋๋ฐฉ๋ ๋ค์ด๊ฐ ๊ฑฐ๋ผ๋ฉด ๊ธฐ๋ค๋ ค๋ผ
- โ ์๋ก ๋์์ flag[0] = true, flag[1] = true ํ๊ฒ ๋๋ฉด โ ๋ ๋ค ๊ธฐ๋ค๋ฆฌ๋ฉฐ ๋ฌดํ ๋ฃจํ ๊ฐ๋ฅ์ฑ ์กด์ฌ
(โ progress ๋ณด์ฅ ์คํจ)
๐ ๋ง์กฑ ์กฐ๊ฑด ๋ถ์
Mutual Exclusion | โ ๋ง์กฑ | ๋ ๋ค ๋์์ CS ๋ชป ๋ค์ด๊ฐ |
Progress | โ ๋ถ๋ง์กฑ | ๋ ๋ค flag = true ์ค์ ํ ๋๊ธฐํ๋ฉด ์ง์ ๋ชปํ๊ณ ๋ฉ์ถค |
Bounded Waiting | โ ๋ถ๋ง์กฑ | ํ ์ชฝ์ด ๊ณ์ CS ๋ค์ด๊ฐ๋ฉด ๋ค๋ฅธ ์ชฝ์ ๋ฌดํ ๋๊ธฐ ๊ฐ๋ฅ |
โ ํํธerson's Algorithm์ด ์ ํ์ํ์ง ์์
- ์ด ์๊ณ ๋ฆฌ์ฆ์ Mutual Exclusion์ ์งํค์ง๋ง,
**์งํ์ฑ(Progress)**๊ณผ **๊ณต์ ์ฑ(Bounded Waiting)**์ ๋ณด์ฅํ์ง ๋ชปํจ. - ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด **Petersonโs Algorithm (Algorithm 3)**๊ฐ ๋ฑ์ฅํจ
โ ์์ฝ ๋ฌธ์ฅ
Algorithm 2๋ ์๋ก ์๋ณดํ์ง ์์ผ๋ฉด ๋ฌดํํ ๊ธฐ๋ค๋ฆด ์ ์๋ค๋ ํ๊ณ๋ฅผ ๊ฐ์ง๋ฉฐ,
์ง์ ์์๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ๋ณ๋ ๋ณ์(turn)๊ฐ ์์ด ์งํ์ฑ์ด ๋ณด์ฅ๋์ง ์๋๋ค.
๐ก ์๊ธฐ ํฌ์ธํธ
- flag[i] = true: ๋ ๋ค์ด๊ฐ๊ณ ์ถ์ด!
- while (flag[j]): ์๋๊ฐ ์ํ๋ฉด ๊ธฐ๋ค๋ ค์ผ ํจ
- ์๋ก ๋์์ ์ง์ ์์ฌ๋ฅผ ํ์ํ ๊ฒฝ์ฐ ๊ต์ฐฉ ์ํ ๋ฐ์ ๊ฐ๋ฅ
- Mutual Exclusion์ ์งํค์ง๋ง, ๋๋จธ์ง ์กฐ๊ฑด์ ๋ถ์ถฉ๋ถ
๐ง Petersonโs Algorithm โ Algorithm 3

๐ ํต์ฌ ๊ฐ๋
- ๋ ๊ฐ์ ํ๋ก์ธ์ค(Pโ, Pโ) ์ฌ์ด์์ Mutual Exclusion, Progress, Bounded Waiting ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋๋ก ์ค๊ณ๋ ์๊ณ ๋ฆฌ์ฆ.
- flag[i]: ๋์ ์ง์ ์๋๋ฅผ ๋ํ๋
- turn: ๋ง์ง๋ง์ผ๋ก ์ง์ ์ ์๋ณดํ ์ชฝ์ ๊ธฐ์ต (์๋๋ฐฉ์๊ฒ ๊ธฐํ๋ฅผ ์ฃผ๊ธฐ ์ํจ)
๐ ์ฌ์ฉ ๋ณ์
๐งฑ ํ๋ก์ธ์ค Pi ์ฝ๋
๐ก ์ฌ๊ธฐ์ i๋ ์๊ธฐ ๋ฒํธ, j๋ ์๋ ํ๋ก์ธ์ค ๋ฒํธ (0 ๋๋ 1)
โ ๋ง์กฑ ์กฐ๊ฑด
Mutual Exclusion | โ ๋ง์กฑ | ๋์์ ๋ ํ๋ก์ธ์ค๊ฐ CS์ ์ง์ ๋ถ๊ฐ |
Progress | โ ๋ง์กฑ | ์ง์ ์ํ๋ ํ๋ก์ธ์ค๋ ๊ฐ์ญ ๋ชป ํจ |
Bounded Waiting | โ ๋ง์กฑ | ์๋๋ฐฉ์ด ๊ณ์ ์ง์ ํ์ง ๋ชปํ๋๋ก ๋ฐฉ์ง |
๐ ํ๊ธฐ ์์ฝ ํด์
- flag[i] & turn==j ์ด ์กฐ๊ฑด์ด ๋ ํ๋ก์ธ์ค๊ฐ ๋์์ ๋ค์ด๊ฐ๋ ๊ฑธ ๋ง์
- turn์ ์๋ณดํ๋ ๋ณ์, ๋ ๋ค ์ง์ ์ํ๋ฉด ์ต๊ทผ ์๋ณดํ ํ๋ก์ธ์ค๋ ๋๊ธฐ
- flag๋ ๋ด๊ฐ ์ง์ ์์ฌ๋ฅผ ํํํ๋์ง ๋ํ๋
- ํ๊ธฐ ์ค:
- Busy Waiting์ ์์ (while ์กฐ๊ฑด ๋ฌดํ ํ์ธ)
- mutex + progress + bounded waiting ๋ค ๋ง์กฑ
- Peterson์ ์๊ณ ๋ฆฌ์ฆ 1๊ณผ 2๋ฅผ ์กฐํฉํ ๊ตฌ์กฐ
- jump table ์ด์ ํด๊ฒฐ๋จ (๋๊ธฐ ์์ ๋ณด์ฅ๋จ)
๐ฌ ์๊ธฐ ํฌ์ธํธ ์์ฝ
- flag[i] = true: ๋๋ ๋ค์ด๊ฐ๊ณ ์ถ์ด!
- turn = j: ๋ค๊ฐ ๋จผ์ ๋ค์ด๊ฐ
- while(flag[j] && turn == j): ๋ค๊ฐ ์ํ๋ฉด ๋จผ์ ๋ค์ด๊ฐ
- flag[i] = false: ๋ CS ๋๋ฌ์ด
- โ ์ด ๊ตฌ์กฐ๊ฐ ์ธ ์กฐ๊ฑด ๋ค ๋ง์กฑ์ํด
๐จ ์ฃผ์
- ๋ ๊ฐ์ ํ๋ก์ธ์ค๋ง์ ์ํ ์๊ณ ๋ฆฌ์ฆ (n๊ฐ์ ์ผ๋ฐํํ๋ ค๋ฉด Filter Algorithm, Bakery Algorithm ํ์)
'CS > ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ด์์ฒด์ ] ch05. CPU Scheduling (0) | 2025.04.21 |
---|---|
[์ด์์ฒด์ ] ch04. Process Management (0) | 2025.04.21 |
[์ด์์ฒด์ ] ch03. Process (0) | 2025.04.21 |
[์ด์์ฒด์ ] ch02. System structure & program excution (0) | 2025.04.21 |
[์ด์์ฒด์ ] ch01. Introduction to Operating Systems (0) | 2025.04.21 |