Skip to content

Latest commit

ย 

History

History
157 lines (99 loc) ยท 5.5 KB

File metadata and controls

157 lines (99 loc) ยท 5.5 KB

์„ธ๋งˆํฌ์–ด(Semaphore) & ๋ฎคํ…์Šค(Mutex)


๊ณต์œ ๋œ ์ž์›์— ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๊ณต์œ ๋œ ์ž์›์˜ ๋ฐ์ดํ„ฐ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œ์„ ๋‘ฌ์•ผ ํ•œ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด ๋ฐ”๋กœ '์„ธ๋งˆํฌ์–ด'

์„ธ๋งˆํฌ์–ด : ๋ฉ€ํ‹ฐํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์—์„œ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•


์ž„๊ณ„ ๊ตฌ์—ญ(Critical Section)

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ ์ˆ˜ํ–‰๋  ๋•Œ, ๊ฐ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ ๋ถ€๋ถ„

๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ๋•Œ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.


์„ธ๋งˆํฌ์–ด P, V ์—ฐ์‚ฐ

P : ์ž„๊ณ„ ๊ตฌ์—ญ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ˆ˜ํ–‰ ( ํ”„๋กœ์„ธ์Šค ์ง„์ž… ์—ฌ๋ถ€๋ฅผ ์ž์›์˜ ๊ฐœ์ˆ˜(S)๋ฅผ ํ†ตํ•ด ๊ฒฐ์ •)

V : ์ž„๊ณ„ ๊ตฌ์—ญ์—์„œ ๋‚˜์˜ฌ ๋•Œ ์ˆ˜ํ–‰ ( ์ž์› ๋ฐ˜๋‚ฉ ์•Œ๋ฆผ, ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์šฐ๋Š” ์‹ ํ˜ธ )


๊ตฌํ˜„ ๋ฐฉ๋ฒ•
P(S);

// --- ์ž„๊ณ„ ๊ตฌ์—ญ ---

V(S);

procedure P(S)   --> ์ตœ์ดˆ S๊ฐ’์€ 1์ž„
    while S=0 do wait  --> S๊ฐ€ 0๋ฉด 1์ด ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ
    S := S-1   --> S๋ฅผ 0๋กœ ๋งŒ๋“ค์–ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด ์˜ค์ง€ ๋ชปํ•˜๋„๋ก ํ•จ
end P

--- ์ž„๊ณ„ ๊ตฌ์—ญ ---

procedure V(S) --> ํ˜„์žฌ์ƒํƒœ๋Š” S๊ฐ€ 0์ž„
    S := S+1   --> S๋ฅผ 1๋กœ ์›์œ„์น˜์‹œ์ผœ ํ•ด์ œํ•˜๋Š” ๊ณผ์ •
end V

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

์˜ˆ์‹œ

์ตœ์ดˆ S ๊ฐ’์€ 1์ด๊ณ , ํ˜„์žฌ ํ•ด๋‹น ๊ตฌ์—ญ์„ ์ˆ˜ํ–‰ํ•  ํ”„๋กœ์„ธ์Šค A, B๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž

  1. ๋จผ์ € ๋„์ฐฉํ•œ A๊ฐ€ P(S)๋ฅผ ์‹คํ–‰ํ•˜์—ฌ S๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ
  2. ๊ทธ ๋’ค์— ๋„์ฐฉํ•œ B๊ฐ€ P(S)๋ฅผ ์‹คํ–‰ํ•˜์ง€๋งŒ S๊ฐ€ 0์ด๋ฏ€๋กœ ๋Œ€๊ธฐ ์ƒํƒœ
  3. A๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ ์ˆ˜ํ–‰์„ ๋งˆ์น˜๊ณ  V(S)๋ฅผ ์‹คํ–‰ํ•˜๋ฉด S๋Š” ๋‹ค์‹œ 1์ด ๋จ
  4. B๋Š” ์ด์ œ P(S)์—์„œ while๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ณ , ์ž„๊ณ„๊ตฌ์—ญ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์ˆ˜ํ–‰ํ•จ


๋ฎคํ…์Šค : ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๋“ค์˜ ์‹คํ–‰์‹œ๊ฐ„์ด ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ 

์ƒํ˜ธ ๋ฐฐ์ œ(Mutual Exclusion)์˜ ์•ฝ์ž์ž„

ํ•ด๋‹น ์ ‘๊ทผ์„ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•ด lock๊ณผ unlock์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • lock : ํ˜„์žฌ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ๊ถŒํ•œ์„ ์–ป์–ด์˜ด ( ๋งŒ์•ฝ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์ˆ˜ํ–‰ ์ค‘์ด๋ฉด ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ )
  • unlock : ํ˜„์žฌ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ์Œ์„ ์•Œ๋ฆผ. ( ๋Œ€๊ธฐ ์ค‘์ธ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ์Œ )

๋ฎคํ…์Šค๋Š” ์ƒํƒœ๊ฐ€ 0, 1๋กœ ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋กœ ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ


๋ฎคํ…์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜

  1. ๋ฐ์ปค(Dekker) ์•Œ๊ณ ๋ฆฌ์ฆ˜

    flag์™€ turn ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹

    • flag : ํ”„๋กœ์„ธ์Šค ์ค‘ ๋ˆ„๊ฐ€ ์ž„๊ณ„์˜์—ญ์— ์ง„์ž…ํ•  ๊ฒƒ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜
    • turn : ๋ˆ„๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ฐจ๋ก€์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜
    while(true) {
        flag[i] = true; // ํ”„๋กœ์„ธ์Šค i๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์ง„์ž… ์‹œ๋„
        while(flag[j]) { // ํ”„๋กœ์„ธ์Šค j๊ฐ€ ํ˜„์žฌ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์žˆ๋Š”์ง€ ํ™•์ธ
            if(turn == j) { // j๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์ค‘์ด๋ฉด
                flag[i] = false; // ํ”„๋กœ์„ธ์Šค i ์ง„์ž… ์ทจ์†Œ
                while(turn == j); // turn์ด j์—์„œ ๋ณ€๊ฒฝ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
                flag[i] = true; // j turn์ด ๋๋‚˜๋ฉด ๋‹ค์‹œ ์ง„์ž… ์‹œ๋„
            }
        }
    }
    
    // ------- ์ž„๊ณ„ ๊ตฌ์—ญ ---------
    
    turn = j; // ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ๋๋‚˜๋ฉด turn์„ ๋„˜๊น€
    flag[i] = false; // flag ๊ฐ’์„ false๋กœ ๋ฐ”๊ฟ” ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆผ

  2. ํ”ผํ„ฐ์Šจ(Peterson) ์•Œ๊ณ ๋ฆฌ์ฆ˜

    ๋ฐ์ปค์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ƒ๋Œ€๋ฐฉ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ์—๊ฒŒ ์ง„์ž… ๊ธฐํšŒ๋ฅผ ์–‘๋ณดํ•˜๋Š” ๊ฒƒ์— ์ฐจ์ด๊ฐ€ ์žˆ์Œ

    while(true) {
        flag[i] = true; // ํ”„๋กœ์„ธ์Šค i๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์ง„์ž… ์‹œ๋„
        turn = j; // ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ง„์ž… ๊ธฐํšŒ ์–‘๋ณด
        while(flag[j] && turn == j) { // ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„์ž… ์‹œ๋„ํ•˜๋ฉด ๋Œ€๊ธฐ
        }
    }
    
    // ------- ์ž„๊ณ„ ๊ตฌ์—ญ ---------
    
    flag[i] = false; // flag ๊ฐ’์„ false๋กœ ๋ฐ”๊ฟ” ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆผ

  3. ์ œ๊ณผ์ (Bakery) ์•Œ๊ณ ๋ฆฌ์ฆ˜

    ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜. ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์˜ ๋ฒˆํ˜ธํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•œ๋‹ค.

    while(true) {
        
        isReady[i] = true; // ๋ฒˆํ˜ธํ‘œ ๋ฐ›์„ ์ค€๋น„
        number[i] = max(number[0~n-1]) + 1; // ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ค‘์— ๊ฐ€์žฅ ํฐ ๋ฒˆํ˜ธ ๋ฐฐ์ • 
        isReady[i] = false; // ๋ฒˆํ˜ธํ‘œ ์ˆ˜๋ น ์™„๋ฃŒ
        
        for(j = 0; j < n; j++) { // ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ๋ฒˆํ˜ธํ‘œ ๋น„๊ต
            while(isReady[j]); // ๋น„๊ต ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฒˆํ˜ธํ‘œ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
            while(number[j] && number[j] < number[i] && j < i);
            
            // ํ”„๋กœ์„ธ์Šค j๊ฐ€ ๋ฒˆํ˜ธํ‘œ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ
            // ํ”„๋กœ์„ธ์Šค j์˜ ๋ฒˆํ˜ธํ‘œ < ํ”„๋กœ์„ธ์Šค i์˜ ๋ฒˆํ˜ธํ‘œ
        }
    
        // ------- ์ž„๊ณ„ ๊ตฌ์—ญ ---------
    
        number[i] = 0; // ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์ข…๋ฃŒ
    }