The Readers-Writers Problem
Writer๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ๊ธฐ๋ ํ๊ณ ์ฝ์ด์ฌ ์ ์๋ ํจ์์ด๋ค. Mutual Exclusion ๋ณด์ฅํ์ง ์๊ณ Shared Data๋ฅผ ๊ฑด๋๋ฆฌ๋ฉด race condition์ด ๋ฐ์ํ๊ณ Debug ํ๊ธฐ ๊ต์ฅํ ์ด๋ ต๋ค. Writer ๋ค์ด ๋์์ ๋ค์ด์ค๋ฉด ์๋๋ค. Reader ๋ค์ด ์๋๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ธฐ๋ ํ์ง๋ง ์์ ์ ํ์ง ์๋๋ค. ๋์์ Shard Data์ ์ ๊ทผ์ ํ๋ฉด ๋ฌธ์ ๋ ๋ฐ์ํ์ง ์๋๋ค. ์ฝ๊ธฐ๋ง ํ๋ Reader๋ ์ฌ๋ฌ ๊ฐ๊ฐ ์์ด๋ ์๊ด์ด ์๋ค.
์ฐ๊ณ ์๋ ์ค๊ฐ์ ์ฝ์ด๊ฐ๋ฉด ์ด๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด ์ํฉ์ ์ํํ ์ํฉ์ด๋ค. ๋ฐ๋์ ๊ฒฝ์ฐ Reader๊ฐ ์ฝ์ด๊ฐ๊ณ ์๋๋ฐ Writer๊ฐ ๋ค์ด์์ ๋ด์ฉ์ ๋ฐ๊พธ์ด ๋ฒ๋ฆฌ๋ฉด ์ด๊ฒ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ด๋ค. ์ด 4๊ฐ์ง์ ์ํฉ์ด ์์ ์ ์๋ค. Writer๊ฐ ๋ค์ด๊ฐ ์์ผ๋ฉด Writer๋ ๋ชป๋ค์ด์ค๊ณ Reader๋ ๋ชป๋ค์ด์จ๋ค. Reader๊ฐ ๋ค์ด๊ฐ ์์ผ๋ฉด Writer๋ ๋ชป๋ค์ด์ค๊ณ Reader๋ ๋ค์ด์ฌ ์ ์๋ค.
Synchronizer์ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ ๋ฌด์์ด ๋ฐ์ํ์ง ์๋๋ก ํ๋ ๊ฒ์ธ๊ฐ?
A) Critical Section Problem์ด ๊ฐ์ ธ์ผํ 3๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ํจ์ด๋ค. Entry Section๊ณผ Exit section์ ์ ์ ํ ์กฐํฉ์ผ๋ก ํด๊ฒฐ์ ํ ์ ์๋ค.
The Readers-Writers Problem
Writer์ ํ๋
Writer๊ฐ ๋ค์ด๊ฐ ์์ผ๋ฉด writer๊ฐ ๋ค์ด๊ฐ ์ ์๋ค. Writer๊ฐ ๋ค์ด๊ฐ๊ณ ๋์๋ ์๋ฌด๋ ๋ค์ด์ค์ง ๋ชปํ๊ฒ ๋ง์์ผ ํ๋ค.
Reader์ ํ๋
Writer๊ฐ ์์ผ๋ฉด Reader๊ฐ ๋ค์ด๊ฐ ์์ด๋ ๋ค๋ฅธ Reader๊ฐ ๋ค์ด์ฌ ์ ์๋ค. Reader๊ฐ ๋ค์ด๊ฐ๋ฉด Writer๊ฐ ๋ชป๋ค์ด์ค๊ฒ ๋ง์์ผ ํ๋ค. ์ฒซ ๋ฒ์งธ Reader์ ์ญํ ์ด ๋งค์ฐ ์ค์ํ๋ค.(*******) ๋ด ์์ Reader๊ฐ ์๋ค๋ ๊ฒ์ Writer๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฆ, ๋ด ์์ Reader๊ฐ ์๋ค๋ ๊ฒ์ ๋ค์ Reader๋ ๋ค์ด์๋ ๋๋ค๋ ์ถฉ๋ถ์กฐ๊ฑด์ด ๋๋ค. ๋ด๊ฐ ๋ค์ด๊ฐ๊ณ ๋์๋ Writer๋ฅผ ๋ง์์ผ ํ๋ค. ๋๊ฐ ๋๋ฅผ ์๊ฐํด๋ณด์. ๋ด๊ฐ ๋๊ฐ๋ฉด์ Critical section์ ๋ค์ด๊ฐ ๋ lock์ ๊ฑธ๊ณ ๋๊ฐ ๋ lock์ ํผ๋ค. Reader๊ฐ ๋์ฌ ๋ lock์ ํธ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ฐ? ๋ค๋ฅธ Reader ๊ฐ ๋จ์์์ ์ ์๋ค. ์๋ฌด Reader๋ ํ ์ ์๋ค. ๋ค์ด์ค๋ ๊ด์ ์์ ์ฒซ ๋ฒ์งธ Reader๋ Writer๋ฅผ ํ์ธํด์ผ ํ๋ค. ๋ค์ Reader๋ ํ์ธํ ํ์ ์๋ค. ๋๊ฐ ๋๋ ๋ง์ง๋ง์ ๋๊ฐ๋ Reader๋ง์ด Writer๋ฅผ ํ์ด์ค ์ ์๋ค. counter๋ฅผ ์ด์ฉํด์ Reader์ ๊ฐ์๋ฅผ ์ธ์ฃผ๋ฉด ํธํ๋ค.
The Readers-Writers Problem
mutex ๋ณ์๋ mutual exclusion์ ์ํ ๋ณ์. wrt๋ writer๊ฐ ๊ณต์ ๋์ง ๋ชปํ๊ธฐ ์ํ ๋ณ์์ด๋ค. Writer๋ ๊ต์ฅํ ๋จ์ํ๋ค.
Reader์ ๊ฒฝ์ฐ, ๋ค์ด๊ฐ๋ ์ฒซ ๋ฒ์งธ Reader์ ํ๋๊ณผ ๋๊ฐ ๋ ๋ง์ง๋ง Reader์ ํ๋์ ์ ์ดํด๋ด์ผ ํ๋ค. if(readcount==1) ์ธ ๊ฒฝ์ฐ wrt๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ์ธํ๋ ์ฝ๋๋ฅผ ์ํํด์ผ ํ๋ค. knocking๊ณผ locking์ ํด์ฃผ๋ ๊ฒ์ Semaphore์ wait function์ด๋ค. (๊ธฐ์ตํ ๊ฒ!)
wait()๊ณผ signal() ์ฌ์ด์ ์๋ ๊ฒ์ด Critical section์ด๊ณ ํด๋น ๋ถ๋ถ์ readCount๋ผ๋ Shared Variable์ ๊ฑด๋๋ฆฌ๊ณ ์์ผ๋ฏ๋ก ๋ค์์ฒ๋ผ wait๊ณผ signal๋ก ๋ง์์ค์ผ ํ๋ค. wait(wrt)๋ ํ์ฌ Writer๊ฐ ๋ค์ด์์๋ ์ํฉ์ด๋ผ๋ฉด ์ฌ๊ธฐ์์ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค. ๋ ๋ฒ์งธ Reader๋ wait(mutex)์์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ์ฒซ ๋ฒ์งธ Reader๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ค๋ฉด ๋ค์ Reader๋ค์ด ํด๋น Critical section์ ๋ค์ด์ฌ ์ ์๋ค.
The Dining Philosopher's Problems
chopstick์ ํ์ ์ Semaphore์ด๋ค. boolean์ด ์๋. deadlock์ด ๋ฐ์ํ ์ ์๋ค. ๋ชจ๋ ์ฌ๋์ด ์ผ์ชฝ ์ ๊ฐ๋ฝ์ ๋ค๊ณ ์๊ณ ์ค๋ฅธ์ชฝ์ ์๋ ์ ๊ฐ๋ฝ์ ๊ธฐ๋ค๋ฆฌ๋ ์ํฉ.
Deadlock
Hold and Wait์ด ์๊น์ ๊ฐ์ ์ ๊ฐ๋ฝ์ ์ํฉ. ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ ๋ค ๋ค ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ง๊ฒ ํด์ผ ํ๋ค.
No preemption,
Dining Philosopher's Solution Using Monitor
Thinking์ Remainder section์ด๋ค. Eating์ Critical Section์ด๋ค. dp.pickup(i)์ entry section์ ๊ตฌํํ procedure์ด๊ณ putdown์ exit section์ ๊ตฌํํ๋ค. conditioin variable์ ๋์์ ์ ๊ฐ๋ฝ์ด ์๋๋ผ self์ด๋ค. condition variable์ signa๊ณผ wait ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ wait์ ํ๋ ์๊ฐ ๋ฐ๋ก ๋ฉ์ถ๊ฒ ํ ์ ์๋ค. ์ฌ๊ธฐ์์ condition ๋ณ์๋ ๋ ์์ ์ ๋ํ wait์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ณ์์ด๋ค.
Dining Philosopher's Solution Using Monitor
๋ณ์ ์ ์ธ์ ํ๊ณ initialize ์ฝ๋๊ฐ ์๋ค. ์ ๋ถ๋ค Thinking ์ํ๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์์ด๋ค. pickup์ Entry section์ ์ฌ์ฉ๋๋ ํจ์์ด๋ค. ๊ทธ ์ํฉ์ Hungry state๋ผ๊ณ ํ ์ ์๋ค. ์ด ๋ ์ข์ฐ์ ์น๊ตฌ๋ค์ด ๋จน๊ณ ์๋์ง๋ฅผ ํ์ธํด์ผ ํ๋ค. ๋จน๊ณ ์์ผ๋ฉด ๋ด๊ฐ ๊ธฐ๋ค๋ฆฌ๋ condition variable์ ๋ํ wait์ ์ ์ธํด์ผ ํ๋ค. ๊ทธ test ํจ์๋ฅผ ํ์ธํด๋ณด์. 3๊ฐ์ If ์กฐ๊ฑด์ ํ์ธํด๋ด์ผ ํ๋ค. ์ฒซ ๋ฒ์งธ if๋ฌธ์ ์ผ์ชฝ์ ์์ ์ฌ๋์ด ๋จน๊ณ ์์ผ๋ฉด ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๊ธฐ ์์ ์ด Hungry์ฌ์ผ ํ๋ค. (๋ ๋ฒ์งธ ์กฐ๊ฑด์ pickup์์๋ ๋ฌด์๋ฏธํ ์ฝ๋์ด๋ค) ์ธ ๋ฒ์งธ ์กฐ๊ฑด์ ์ค๋ฅธ์ชฝ์ ์์ ์ฌ๋์ด ๋จน๊ณ ์์ผ๋ฉด ์๋๋ค. ์กฐ๊ฑด์ ๋ง์กฑํ์ผ๋ฉด ๋ด๊ฐ Eating condition์ ๊ฐ์ง๋ค. ์ดํ test ์๋์ if๋ฌธ์ ํต๊ณผํด์ EAT ์ ํ ์ ์๋ค. ๋ง์ฝ test condition์ ๋ง์กฑํ์ง ์์ผ๋ฉด pickup ํจ์์ if๋ฌธ์ TRUE๋ก ํ์ฌ self[i].wait()์ ์คํํ๊ฒ ๋๋ฉด์ ๋ณธ์ธ์ด ๋ฉ์ถ๊ฒ ๋๋ค.
putDown ํจ์๋ ๋ด๊ฐ ์ด์ THINKING์ ํ์๋ผ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ค. ๋ด๋ ค๋์ผ๋ฉด์ ๋ด ์์ Hungry์ธ ์น๊ตฌ๋ค์ด ์๋์ง test๋ฅผ ํด์ผ ํ๋ค. ๋ด๊ฐ putDown์ ํธ์ถํ๋ค๋ฉด ๋ด๊ฐ ๋จน๊ณ ์์์ผ๋ฏ๋ก ๋ด ์์ ์ฌ๋๋ค์ ๋จน๊ณ ์์ ์๊ฐ ์๋ค.
Synchronization within the Kernel
Windows๋ Multithreaded kernel์ด๋ค. real-time application๋ ์ง์์ ํ๋ค. CPU๊ฐ ํ๋ ์์ ๋ Mask Interrupt๋ฅผ ํ๋ฉด ๋๋ค. spinlock์ ์งง์ ์ฝ๋์ ๋ํด์๋ง ์ฌ์ฉ์ ํด์ผ ํ๋ค. ๊ธด ์ฝ๋์ ๋ํด์ ์ฌ์ฉ์ ํ๋ฉด ํจ์จ์ด ๋จ์ด์ง๋ค. ๋๊ตฐ๊ฐ Spinlock์ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๊ทธ ์น๊ตฌ๋ preemted ๋นํ์ง ์๋๋ก ๊ตฌํ์ ํด์ผ ํ๋ค.
Synchronization within the Kernel
Windows์์ Synchronize๋ฅผ ํ๋ ค๋ฉด dispatcher object๋ผ๋ ๋ง์ ์ฌ์ฉํ๋ค. Signaled State์ Nonsignaled State ๋ผ๋ ๋ง์ ์ฌ์ฉํ๋ค. ๋ค์ด๊ฐ๋ ๋๋ ์ํฉ์ด Signaled State์ด๊ณ Nonsignaled State๋ ๋ค์ด๊ฐ ์ ์๋ ์ํฉ์ด๋ค.
Synchronization within the Windows
spin lock๊ณผ block์ Hybrid ํ ๋ฐฉ๋ฒ์ด๋ค. ์ฒ์์๋ Spinlock์ ์ฌ์ฉํ๋ค. ํ์ง๋ง ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ฉด block์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ๊ฐ๊ฐ์ ์ฅ์ ์ ์กฐํฉํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Synchronization in Linux Kernel
Atomic Set์ ์ํด์ ๋ํ๊ณ ๋นผ๊ณ ์ง์ด๋ฃ๋๋ค. Function์ ์ํด์๋ง ์งํ์ด ๋๋ค. race condition์ด ๋ฐ์ํ์ง ์๋๋ก ์์ ํ ์ ์๋ค.
Synchronization in Linux Kernel
Synchronization in Linux Kernel
Spinlock๋ ์ง์์ ํ๋ค. spin_lock(), spin_unlock() ํจ์๊ฐ ์กด์ฌํ๋ค. Preempt_disable()์ Interrupt๋ฅผ ์ค๊ฐ์ ๋ง์๋ค ํ์๋ค ํ๊ณ Single Processor ํ๊ฒฝ์์ ์ฌ์ฉํ๋ค.
POSIX Synchronization
์ด๊ธฐํํ๋ ๋ฐฉ์์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค. init ํจ์๋ ์๊ณ ์ ์ญ ๋ณ์๋ก pthread_mutex_t mutex ์ ์ธ์ ํ ์ ์๋ค. ์ฌ์ฉ ์ ์ ํญ์ ์ด๊ธฐํ๋ฅผ ํ๊ณ ์์์ ํด์ผ ํ๋ค.
POSIX Synchronization
semaphore์ ์ข ๋ฅ๋ ๋ ๊ฐ์ง๊ฐ ์๋ค. named semaphore๋ ์ด๋ฆ์ ์ง์ ํ ์ ์๋ค. ์๋ก ๋ค๋ฅธ Semaphore๊ฐ์ ํด๋น semaphore๋ฅผ ์ฌ์ฉํ๊ฒ ํ ์ ์๋ค. sem_open์ผ๋ก ํ๋๋ฅผ ๋ง๋ค์ด๋ด๊ณ sem_wait()๊ณผ sem_post()๋ฅผ ์ฌ์ฉํ์ฌ Entry์ Exit section์ ๊ตฌ์ฑํ๋ค. ๋ ๋ฒ ์งธ๋ Unnamed Semaphore ํจ์๋ sem_init()์ผ๋ก ์ด๊ธฐํ๋ฅผ ํ๊ณ sem_wait() ๊ณผ sem_post() ํจ์๋ฅผ ์ฌ์ฉํ์ง๋ง ํ๋ผ๋ฏธํฐ๊ฐ ๋ค๋ฅด๋ค. open์ผ๋ก assign์ ํ๋ ๊ฒฝ์ฐ & ๊ฐ ๋ถ์ง ์์ง๋ง unnamed Semaphore์ ๊ฒฝ์ฐ๋ & ๊ฐ ๋ถ๋๋ค.