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

[OS / ์šด์˜ ์ฒด์ œ] Monitors, Condition Variable, Implementing a Monitor Using Semaphore, Deadlock and Starvation, Bounded Buffer Problem

by UKHYUN22 2022. 5. 19.
728x90

 

Monitors

Monitor์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ Resource์ด๋‹ค. Spin lock๊ณผ Block์˜ ๋ฐฉ๋ฒ•์œผ๋กœ Waiting ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. Waiting ์€ Linked List๋กœ ๊ตฌํ˜„์„ ํ•œ๋‹ค. Monitor ์ž์ฒด๋Š” Mutual Exclusion์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

Monitor in Java

synchronized๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ์„ ํ•˜๋ฉด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ Thread๋งŒ์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ ๊ฒƒ์ด๋‹ค. System.Threading.Monitor์˜ ํŠน์„ฑ์„ ์ „ํ•ด ๋ฐ›์œผ๋ฉด Monitor์˜ ํŠน์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

Condition Variable

์–ผ์Œ ๋•ก ๋†€์ด. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  x.wait์œผ๋กœ ์‹คํ–‰์„ ํ•˜๋ฉด ์–ผ์Œ๊ณผ ๋™์ผํ•œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. Signal์„ ๋ณด๋‚ด๋ฉด ๋•ก์„ ํ•ด์„œ ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. wait() signal()์€ Semaphore์—์„œ ๋“ค์–ด๋ดค๋‹ค. ๊ต‰์žฅํžˆ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์•„์ฃผ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ Process๊ฐ€ ๋“ค์–ด์˜ค๋”๋ผ๋„ wait์„ ๋งŒ๋‚˜๋ฉด ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ ์•„๋ฌด๋„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด signal์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

Semaphore๋„ ์ฒซ ๋ฒˆ์งธ Process๋ถ€ํ„ฐ ๋ฉˆ์ถ”๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•. S๊ฐ€ 0์—์„œ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค. 

 

 

Condition Variable

Q๊ฐ€ ์ฒซ ๋ฒˆ์งธ Process๋ผ๊ณ  ํ•ด๋ณด์ž. Monitor ์•ˆ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. x.wait()์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค. ๋ฉˆ์ถ”๋Š” ์ˆœ๊ฐ„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์นœ๊ตฌ๋“ค์„ ๋„ฃ๊ฒŒ ํ•ด์ค˜์•ผ ํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” Process๋“ค์„ ์ง‘์–ด๋„ฃ์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๊ธฐ๋‹ค๋ฆฌ๋Š” Process๋ฅผ ๋†”๋‘๊ฒŒ ๋˜๋ฉด ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”๊ฐ€. ์˜์›ํžˆ waitํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์Œ Process๊ฐ€ ๋“ค์–ด์™€์„œ signal์„ ๋ณด๋‚ด์„œ ๋•กํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ์ด๋•Œ ๋‘ ๊ฐ€์ง€ Process๊ฐ€ ์‚ด์•„์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์žฌ์›Œ์•ผ ํ•œ๋‹ค. signal and wait์€ ์ž  ์ž๋˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์šฐ๊ณ  ์ž์‹ ์€ ๋ฉˆ์ถ˜๋‹ค. Signal and continue์˜ ๊ฒฝ์šฐ Singal๋งŒ ๋ณด๋‚ด๊ณ  ์ž์‹ ์„ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์ˆœ์„œ๊ฐ€ ์ •ํ™•ํžˆ ์ดํ•ด๋˜์–ด์•ผ ํ•œ๋‹ค. 

 

 

Implementation a Monitor Using Semaphore

1. Exclusive

2. wait

3. Signal 

3๊ฐ€์ง€๋ฅผ ์—ฐ๊ด€๋˜๊ฒŒ ๊ตฌํ˜„์„ ํ•ด์•ผ ํ•œ๋‹ค. 

 

mutex ๋ณ€์ˆ˜๋Š” mutual exclusive๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜. ์ดˆ๊นƒ๊ฐ’์€ 1์ด๋‹ค. ๋งŒ์•ฝ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค๋ฉด ์ฒซ ๋ฒˆ์งธ Process๋ถ€ํ„ฐ ๋ง‰ํžŒ๋‹ค. ๊ทธ Process๋ฅผ ๊นจ์šฐ๋Š” ๋ฐฉ๋ฒ•์€ Signal๋ฐ–์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. wait()์„ ํ•˜๊ณ  signal()๋กœ ๊นจ์›Œ์ค€๋‹ค. 

next์— ๋Œ€ํ•ด์„œ signal์„ ๋ณด๋‚ธ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด๋Š” ์ฒซ ๋ฒˆ์งธ Process๊ฐ€ ๋‚˜๊ฐ€๋ฉด์„œ mutex๋ฅผ 1๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ next์— ๋Œ€ํ•ด์„œ waitํ•œ Process๋ฅผ ๊นจ์›Œ์ ธ์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ Next์— ์˜ํ•ด์„œ wait๋œ Procress๋“ค์ด ๋ช‡ ๊ฐœ์ธ์ง€ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ counter์˜ ๊ฐ’์„ ํ™œ์šฉํ•œ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ์นœ๊ตฌ๊ฐ€ ์—†์œผ๋ฉด(counter == 0) Mutex๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค. 

 

Implementing a Monitor Using Semaphore

mutex์˜ ์ดˆ๊นƒ๊ฐ’์€ 1๋กœ ๋˜์–ด์•ผ Mutually Exclusive๋ฅผ ๋ณด์žฅํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. 

 

 

Implementing a Monitor Using Semaphore

x_sem์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฒƒ์„ ํฌํ•จํ•ด์„œ ๋ฉˆ์ถ”๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. x_count ๋Š” x์— ๋Œ€ํ•ด์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์นœ๊ตฌ๋ฅผ ์…€ ๊ฒƒ์ด๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” Process์˜ ์ˆซ์ž๊ฐ€ ์—†์œผ๋ฉด signal์„ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ํ•„์š”ํ•œ ๋ณ€์ˆ˜์ด๋‹ค. 

wait

x_count++๋กœ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฆ๊ฐ€๋˜์—ˆ์Œ์„ ํ‘œ์‹œํ•œ๋‹ค. wait(x_sem)์—์„œ s_sem์ด 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ฌด์กฐ๊ฑด ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค. 

๊นจ์›Œ์ค„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. wait์„ ํ•˜๊ณ  ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด์™€์„œ ๊นจ์›Œ์ฃผ๋Š” ๊ฒฝ์šฐ. waitํ•˜๊ณ  signal ๋ฐ›๊ณ  ๋‹ค์‹œ wait์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๊นจ์›Œ์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋‹ค๋ฆฌ๋Š” Process์ธ์ง€ Next์— ๋Œ€ํ•ด wait์„ ํ•˜๊ณ  ์žˆ๋Š” Process์ธ์ง€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. 

signal

signal(x_sem)์€ ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€. x_sem์„ ๊นจ์›Œ์ฃผ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  next์— ๋Œ€ํ•ด์„œ wait์„ ํ•˜๊ฒŒ ๋œ๋‹ค. next์˜ ๊ฐ’์€ 0์ด๋‹ค. 

 

 

Resuming Process within in a Monitor

์ œ์ผ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” FIFO ๋˜๋Š” Randomํ•˜๊ฒŒ ๊นจ์šฐ๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๋ฉด ๊นจ์šฐ๋Š” ์ˆœ์„œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

 

 

Liveness

Progress๋ฅผ ์ž˜ ๋งŒ์กฑํ•˜๋ฉด์„œ ์ง„ํ–‰๋˜๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•œ๋‹ค. 

 

 

Deadlock and Starvation

P0์™€ P1์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉด P0๋Š” P1์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  P1์€ P0๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค. 

 

Priority Inversion

 

 

7์žฅ. Synchronization Examples

 

 

Bounded Buffer Problem

Buffer์˜ size๊ฐ€ n์œผ๋กœ ์ œํ•œ๋˜์–ด ์žˆ๋‹ค. ๋นˆ ๊ณต๊ฐ„์˜ ๊ฐœ์ˆ˜๋Š” Producer ์ž…์žฅ์—์„œ Resource์ด๊ณ  Item์˜ ๊ฐœ์ˆ˜๋Š” Consumer์˜ ์ž…์žฅ์—์„œ Resource๊ฐ€ ๋œ๋‹ค.

 

 

Bounded Buffer Problem

counting semaphore๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋นˆ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์…€ ์ˆ˜ ์žˆ๋‹ค. Data item์„ Counting Semaphore๋กœ ๋‚˜ํƒ€๋‚ด์–ด์•ผ ํ•œ๋‹ค. empty์˜ ์ดˆ๊นƒ๊ฐ’์€ n์ด ๋œ๋‹ค. full ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋Š” Remainder section์ด๊ณ  ์ง‘์–ด ๋„ฃ๋Š” ์ฝ”๋“œ๊ฐ€ Critical Section์ด ๋œ๋‹ค. wait(empty)๋Š” empty๋ผ๋Š” ์ž์›์„ ํ•˜๋‚˜ ์†Œ๋น„ํ•˜๊ฒ ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. empry์— ๋Œ€ํ•ด์„œ signal์„ ํ˜ธ์ถœํ•œ๋‹ค. 

Consumer์˜ ์ž…์žฅ์—์„œ full์˜ item์„ ์‚ฌ์šฉํ•˜๊ณ  empty์— ๋Œ€ํ•ด์„œ signal์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.