๐Ÿ€ Knowledge/์šด์˜์ฒด์ œ(OS)

[์šด์˜์ฒด์ œ] ์„ธ๋งˆํฌ์–ด(Semaphores)์™€ ์„ธ๋งˆํฌ์–ด์˜ ํ™œ์šฉ

TIlearn 2024. 4. 7. 12:22

์„ธ๋งˆํฌ์–ด(Semaphores)๋ž€?

 

์ง€๊ธˆ๊นŒ์ง€ Critical Section Ploblem์„ ์†Œํ”„ํŠธ์›จ์–ด/ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ดค๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์„ธ ๊ฐ€์ง€ ์†”๋ฃจ์…˜์ด ์žˆ์—ˆ๊ณ , ํ•˜๋“œ์›จ์–ด์ ์ธ ๋ฐฉ๋ฒ•์—๋Š” Testset ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

 

์กฐ๊ธˆ ๋” ๋‚˜์€ ๋ฐฉ์•ˆ์€ ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋ผ ํ•˜์˜€๋Š”๋ฐ, Testset ์—ญ์‹œ๋‚˜ Busy Wating์„ ํ•ด์•ผํ•˜๋Š” ํฐ ๋‹จ์ ์ด ์žˆ๋‹ค.

 

 

์„ธ๋งˆํฌ์–ด๋Š” Busy Wating์„ ํ•ด๊ฒฐํ•˜๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ๋‹ค. ์„ธ๋งˆํฌ์–ด ์ž์ฒด๋งŒ์œผ๋กœ๋Š” Int ๊ฐ’์„ ์ €์žฅํ•  ๋ฟ์ธ ๊ตฌ์กฐ์ฒด์ผ ๋ฟ์ด์ง€๋งŒ, _semWait (s)_์™€ _semSignal (s)_์„ ํ†ตํ•ด์„œ ์†์‰ฝ๊ฒŒ Critical Section Ploblem์„ ํ•ด๊ฒฐํ•œ๋‹ค.

 

 

  • semWait (s)
    • semiphore์˜ ๊ฐ’์„ 1 ๊ฐ์†Œ ์‹œํ‚จ๋‹ค.
    • ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ P(s), Wait(s), down(s)์œผ๋กœ๋„ ๋ถˆ๋ฆฐ๋‹ค.
  • semSignal (s)
    • ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ called V(s), Signal (s), sem_post(s)์œผ๋กœ๋„ ๋ถˆ๋ฆฐ๋‹ค.

 

๊ฐ ํ•จ์ˆ˜๋“ค์€ ํ•˜๋“œ์›จ์–ด์˜ ์ง€์›์„ ๋ฐ›์•„ atomic ํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

 

 

Testset์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•ด ์ ์œ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” _while_๋ฌธ์„ ํ†ตํ•ด ์˜๋ฏธ ์—†๋Š” time slice๋ฅผ ์†Œ๋ชจํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ธ๋งˆํฌ์–ด๋Š” ๋‹ค๋ฅด๋‹ค. ์„ธ๋งˆํฌ์–ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋– ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์›์„ ์ ์œ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•ˆ๋‹ค. ํ•ด๋‹น ์‚ฌ์‹ค์„ ๋ฐ”ํƒ•์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ๋Œ€๊ธฐ ํ(Block Queue)์— ๋“ค์–ด๊ฐ€ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. _semWait_๊ฐ€ ๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ ๋Œ€๊ธฐ ํ์— ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ์ž์›์„ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. 

 

 

๊ณต์œ  ์ž์›์„ ์ ์œ ํ•˜๊ณ  ์žˆ๋˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ์ž์›์„ ๋‹ค ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด๋•Œ _semSignal_์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋Œ€๊ธฐ ํ์— ๋งŒ์•ฝ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ์šฐ์„ ์ˆœ์œ„์— ํ•ด๋‹น๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ Block ์ƒํƒœ์—์„œ Ready Queue๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

 

 

Ready Queue๋กœ ๋“ค์–ด๊ฐ„ ํ”„๋กœ์„ธ์Šค๋Š” _semWait_์—์„œ Block ๋œ ์ƒํƒœ์—์„œ ํ’€๋ ค๋‚˜๊ธฐ ๋•Œ๋ฌธ์— Critical Section ๋‚ด์˜ ์ž์›์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

 

์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

 

semaphore

struct semaphore {
    int count;
    queueType queue;
}

 

 

 

semWait(semaphore s)

void semWait (semaphore s) {
    s.count--;
    if (s.count < 0) {
        /* ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€๊ธฐ ํ(s.queue)๋กœ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. */
        /* ํ”„๋กœ์„ธ์Šค Block */
    }
}

 

 

 

semSignal (semaphore s)

void semSignal (semaphore s) {
    s.count++;
    if (s.count <= 0) {
        /* ๋Œ€๊ธฐ ํ(s.queue)๋กœ๋ถ€ํ„ฐ ํ”„๋กœ์„ธ์Šค ์ œ๊ฑฐ */
        /* ํ”„๋กœ์„ธ์Šค๋ฅผ Ready Queue๋กœ ๋„ฃ๋Š”๋‹ค. */
    }
}

 

 

๋Œ€๊ธฐ ํ๊ฐ€ ์™œ semaphore ๊ตฌ์กฐ์ฒด ์•ˆ์— ์žˆ์„๊นŒ? ์ด์ „์— ๋ดค๋˜ ํ”„๋กœ์„ธ์Šค ์ƒํƒœ๋„๋ฅผ ๋– ์˜ฌ๋ ค๋ณด์ž. ๋Œ€๊ธฐ ํ๋Š” ํ•˜๋‚˜๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ๋“ค์— ๋Œ€ํ•ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋Œ€๊ธฐ ํ๊ฐ€ ์žˆ๋‹ค.

 

 

s.queue ๋˜ํ•œ semaphore์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋Œ€๊ธฐ ํ์ผ ๋ฟ์ด๋‹ค.

 

 

 

 

 

 

์„ธ๋งˆํฌ์–ด์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด

 

 

์ฝ”๋“œ๋งŒ์œผ๋กœ ๋ณธ๋‹ค๋ฉด ๋™์ž‘์„ ์˜ˆ์ƒํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์‹ค์ œ๋กœ ์„ธ๋งˆํฌ์–ด๋Š” ์ดˆ๊ธฐ์— ์ €์žฅ๋˜๋Š” ๊ฐ’์— ๋”ฐ๋ผ ๋…ผ๋ฆฌ์ ์ธ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž.

 

 

 

 

1. ๊ฐ„๋‹จํ•˜๊ฒŒ Mutual Exclusion์„ ๋ณด์žฅํ•˜๋Š” ํŒจํ„ด

 

์ œ์ผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. semaphore์— ์ดˆ๊ธฐ๊ฐ’ 1์„ ์ €์žฅํ•œ๋‹ค.

 

const int n = /* ํ”„๋กœ์„ธ์Šค ๊ฐฏ์ˆ˜ */
semaphore s = 1;
void P(int i) {
    while (true) {
        semWait (s);
        /* critical section */
        semSignal (s);
        /* remainder */
    }
}

void main() {
    parbegin(P(1), P(2), ... , P(n));
}

 

 

_semWait_์— 1 ๊ฐ’์ด ์ „๋‹ฌ๋œ๋‹ค๋ฉด, _count_๊ฐ€ ํ•˜๋‚˜ ์ค„์–ด๋“ค์–ด ์„ธ๋งˆํฌ์–ด๋Š” 0์˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. Context Switch ๋œ ํ”„๋กœ์„ธ์Šค๋Š” critical section์— ์ ‘๊ทผํ•  ๋•Œ _count_๊ฐ€ 0 ๋ฏธ๋งŒ์˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ๋”ฐ๋ผ์„œ Context Switch๋œ ํ”„๋กœ์„ธ์Šค๋Š” ๋Œ€๊ธฐ ํ์— ๋“ค์–ด๊ฐ€๋ฉฐ Block ์ƒํƒœ๋กœ ์ด๋™ํ•œ๋‹ค.

 

 

๋‹ค์‹œ Context Switch ๋˜์–ด ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ์•„์™€๋ณด์ž. critical section์˜ ๋ชจ๋“  ์ž‘์—…์ด ๋๋‚˜๊ณ , _semSignal_์ด ํ˜ธ์ถœ๋œ ์ƒํ™ฉ์ด๋‹ค. count๋Š” ๋‹ค์‹œ ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•œ๋‹ค.

 

 

๋งŒ์•ฝ ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ์žˆ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋ฌด๋„ _semWait_์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด semaphore๋Š” 1์ด๋‹ค. ์ด๋Ÿฐ ์ƒํƒœ์—์„œ Context Switch๋˜์–ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ Critical Section์— ์ ‘๊ทผํ•ด๋„ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

 

 

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ์žˆ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ _semWait_์„ ํ˜ธ์ถœํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๋Š” semaphore๋ฅผ ํ•˜๋‚˜ ๋นผ์–ด -1์ด ๋˜๊ณ , Block ์ƒํƒœ๋กœ ์ด๋™ํ•œ๋‹ค. ๊ธฐ์กด์˜ critical section์— ์žˆ๋˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚ฌ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด _semSignal_๋กœ ์ธํ•ด semaphore๋Š” 0์ด ๋˜์ง€๋งŒ, ๋Œ€๊ธฐ ํ์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•ด ์กฐ๊ฑด๋ฌธ ์•ˆ์œผ๋กœ ์ง„์ž…ํ•œ๋‹ค.

 

 

์กฐ๊ฑด๋ฌธ์œผ๋กœ ์ธํ•ด ๋Œ€๊ธฐ ํ์— ์กด์žฌํ•˜๋˜ ํ”„๋กœ์„ธ์Šค๋Š” Ready Queue๋กœ ์ด๋™ํ•œ๋‹ค. Ready Queue์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์ด์ œ Critical Section์œผ๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

 

 

 

 

2. ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ณด์žฅํ•˜๋Š” ํŒจํ„ด

 

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด semaphore๋ฅผ 0์œผ๋กœ ๋‘์ž. ๋˜ํ•œ ์ฝ”๋“œ์˜ ์œ„์น˜๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‘์ž.

 

 

 

์กฐ๊ฑด๋งŒ ๋งŒ์กฑ์‹œํ‚จ๋‹ค๋ฉด ์–ด๋– ํ•œ ์ƒํ™ฉ์ด๋“ , Pi๊ฐ€ Pk๋ณด๋‹ค ๋จผ์ € ๋™์ž‘ํ•œ๋‹ค.

 

 

1. Pk๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ ๊ฒฝ์šฐ

 

_semWait_์œผ๋กœ ์ธํ•ด semaphore๋Š” -1์ด๋‹ค. ๋”ฐ๋ผ์„œ Pk๋Š” Block ๋œ๋‹ค. Pi๋Š” ๋”ฐ๋กœ _semWait_์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ _semSignal_๋ฅผ ์ด๋‚ด ๋งŒ๋‚œ๋‹ค. _semSignal_๋กœ ์ธํ•ด semaphore๋Š” 0์ด ๋˜๊ณ , Pk๋Š” Ready Queue๋กœ ๋น ์ ธ๋‚˜๊ฐ€ ์ฝ”๋“œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

 

2. Pi๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ ๊ฒฝ์šฐ

 

Pi๋Š” _semWait_์ด ์—†์œผ๋‹ˆ _semSignal(flag)_๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ํŽธํ•˜๊ฒŒ ์‹คํ–‰ํ•œ๋‹ค. ํ˜น์—ฌ๋‚˜ Pk๋กœ ๋ฐ”๋€Œ๋”๋ผ๋„ 1. ์˜ ๊ณผ์ •์„ ํ†ตํ•ด Pi๊ฐ€ ๋จผ์ € ์‹คํ–‰๋จ์ด ๋ณด์žฅ๋œ๋‹ค. _semSignal(flag)_๋ฅผ ๋จผ์ € ๋งŒ๋‚˜๋ฉด semaphore๋Š” 1์ด ๋˜๋ฉฐ Pk๋กœ ๋ฐ”๋€Œ์–ด๋„ Pk๋Š” ๋Œ€๊ธฐํ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.

 

 

 

 

 

โ€ป Producer/Consumer ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

 


์•ž์„œ Race Condition์ด ๋ฐœ์ƒํ–ˆ๋˜ Producer/Consumer ๋ฌธ์ œ๋ฅผ ์„ธ๋งˆ ํฌ์–ด๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•ด ๋ณด์ž.

 

 

Semaphore

semaphore counter = 0;
semaphore empty = BUFFER_SIZE;
semaphore mut_ex = 1;

 

 

Producer

while (true) {
    produce();
    semWait(empty);
    semWait(mut_ex);
    append();
    semSignal(mut_ex);
    semSignal(counter);
}

 

 

 

Consumer

while (true) {
    semWait(counter);
    semWait(mut_ex);
    take();
    semSignal(mut_ex);
    semSignal(empty);
    consume();
}

 

 

_mut ex_๋Š” 1 ํŒจํ„ด์„ ์ ์šฉ์‹œํ‚จ ๊ฒƒ์ด๋‹ค. ๊ฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ Race Condition์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•ด์ค€๋‹ค.

_counter_๋Š” Producer๊ฐ€ ์šฐ์„ ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.

_empty_๋Š” BUFFER SIZE๋งŒํผ ์ฑ„์›Œ์ ธ ์žˆ๋Š”๋ฐ, ๋ฒ„ํผ๋ณด๋‹ค ๋” ๋งŽ์€ Produce()๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.

 

 

 

3. Readers/Writers Problem์„ ํ•ด๊ฒฐํ•˜๋Š” ํŒจํ„ด

 

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฝ๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ฝ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋А ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ์ˆ˜์ •์„ ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋ฅผ ๋ณด์žฅํ•˜๋Š” ํŒจํ„ด์„ ์†์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

Writer

void writer() {
    while (true) {
        semWait(wsem);
        WRITEUNIT();
        semSignal(wsem);
    }
}

 

 

Reader

void reader() {
    while (true) {
        semWait(rsem);
        readcount++;
        if (readcount == 1) semWait (wsem);
        semSignal(rsem);
        
        READUNIT();
        
        semWait (rsem);
        readcount--;
        if (readcount == 0) semSignal(wsem);
        semSignal (rsem);
    }
}

 

 

_rsem_๊ณผ _wsem_์€ ๊ฐ๊ฐ reader์™€ writer์— ๋Œ€ํ•œ ์„ธ๋งˆํฌ์–ด ๋ณ€์ˆ˜ ๊ฐ’์ด๋‹ค. ์ด ๊ฐ’๋“ค์€ ๊ฐ๊ฐ 1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

๋จผ์ € _semWait(rsem)_๊ณผ _semSignal(rsem)_์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์ด๋Š” _readcount_๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ผ์ด ๋‹ค๋ฅธ reader๋“ค๊ณผ ๊ฒฝ์Ÿ๊ด€๊ณ„๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

_readcount_๊ฐ€ 1์ด๋ผ๋Š” ๊ฒƒ์€ reader ํ•˜๋‚˜๊ฐ€ ์ฒ˜์Œ ๋“ค์–ด์™”๋‹ค๋Š” ๋œป์ด๊ณ , writer๊ฐ€ ๋ฏธ๋ฆฌ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. writer๊ฐ€ ๋ฏธ๋ฆฌ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด reader๋Š” writer๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋ฏ€๋กœ _semWait(wsem)_์„ ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ writer๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์ง€ ์•Š๋‹ค๋ฉด reader๊ฐ€ ๋จผ์ € _semWait(wsem)_์„ ํ˜ธ์ถœํ–ˆ์œผ๋ฏ€๋กœ, writer๋Š” ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.

reader๊ฐ€ ์ฝ๋Š” ๋™์•ˆ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ณ , writer๊ฐ€ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ reader๋Š” ์ฝ์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์—ฌ๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์„ ํ†ต๊ณผํ•œ๋‹ค๋ฉด, read์ž‘์—…์ด ์ผ์–ด๋‚˜๋„ ์ข‹๋‹ค. READUNIT() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ฃผ์ž.

์ด์ œ ๋ชจ๋“  read์ž‘์—…์ด ๋๋‚ฌ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด _readcount_๋Š” ํ•˜๋‚˜ ์ค„์–ด๋“ค์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 1 ํŒจํ„ด์„ ์ ์šฉ์‹œ์ผœ ์ฃผ์ž. _readcount_๊ฐ€ 0์ธ ์กฐ๊ฑด์€ ๋” ์ด์ƒ ์ž๊ธฐ ์ž์‹  ํ”„๋กœ์„ธ์Šค ๋’ค์— ๋‹ค๋ฅธ read ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋Š” ์ƒํƒœ๋‹ค. ์•ž์„œ _semWait(wsem)_์œผ๋กœ reader๊ฐ€ ์ฝ๋Š” ๋™์•ˆ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•ด ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— writer๊ฐ€ ๋‹ค์‹œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ’€์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๊ฒŒ _semSignal(wsem)_์ด๋‹ค.

 

 

 

 

 

 

Binary Semaphore, Lock

 

์„ธ๋งˆํฌ์–ด ๊ฐ’์„ 0๊ณผ 1๋งŒ ๊ฐ€์ง€๋Š” ์„ธ๋งˆํฌ์–ด๋ฅผ Binary Semaphore(= mutex)๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋ฏธ critical section์— ์–ด๋А ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด, ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.

๊ธฐ์กด์— ๋ฐฐ์šด ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์ ์€ ready queue์˜ ๊ฐœ๋…์œผ๋กœ ๋Œ€๊ธฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ก  ์ƒ bounded wating์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

Lock๋„ ๊ฒฐ๊ตญ Binary Semaphore๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋ฆ„๋งŒ ๋‹ค๋ฅผ ๋ฟ์ด์ง€ ์‹ค์ œ๋กœ ๋™์ž‘์€ ๊ฐ™๋‹ค. Linux์—์„œ๋Š” lock์„ ์ฒ˜๋ฆฌํ•˜๋Š” Thread Library๊ฐ€ ์žˆ๋‹ค. phread mutex unlock๊ณผ pthread mutex lock์ด ์žˆ์œผ๋ฉฐ bounded wating์„ ๋ณด์žฅํ•œ๋‹ค.

 

 

 

 

 

 

 

 

Monitors

 

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์ˆ˜์ค€์˜ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.