Search
Duplicate

Race Condition, Semaphore, Mutex

ํƒœ๊ทธ
1 more property

Race Condition

โ€ข
race condition์ด๋ž€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณตํ†ต ์ž์›์„ ๋ณ‘ํ–‰์ ์œผ๋กœ(concurrently) ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋™์ž‘์„ ํ•  ๋•Œ, ๊ณต์šฉ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ์–ด๋–ค ์ˆœ์„œ์— ๋”ฐ๋ผ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€์— ๋”ฐ๋ผ ๊ทธ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์ง€ ์•Š๊ณ  ๋‹ฌ๋ผ์ง€๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค.
โ€ข
Race์˜ ๋œป ๊ทธ๋Œ€๋กœ, ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ๊ฒฝ์Ÿํ•˜๋Š” ์ƒํƒœ, ์ฆ‰ ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ์ž์›์„ ๋†“๊ณ  ์„œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๊ฒฝ์Ÿํ•˜๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค.

Race Condition์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

1.
์ปค๋„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘์— ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ
โ€ข
๋ฌธ์ œ์  : ์ปค๋„๋ชจ๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ
โ€ข
ํ•ด๊ฒฐ๋ฒ• : ์ปค๋„๋ชจ๋“œ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ, ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ disable ์‹œ์ผœ CPU ์ œ์–ด๊ถŒ์„ ๊ฐ€์ ธ๊ฐ€์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.
2.
ํ”„๋กœ์„ธ์Šค๊ฐ€ 'System Call'์„ ํ•˜์—ฌ ์ปค๋„ ๋ชจ๋“œ๋กœ ์ง„์ž…ํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„์ค‘ ๋ฌธ๋งฅ ๊ตํ™˜์ด ๋ฐœ์ƒํ•  ๋•Œ
โ€ข
๋ฌธ์ œ์  : ํ”„๋กœ์„ธ์Šค1์ด ์ปค๋„๋ชจ๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋„์ค‘, ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์–ด CPU ์ œ์–ด๊ถŒ์ด ํ”„๋กœ์„ธ์Šค2๋กœ ๋„˜์–ด๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ( ํ”„๋กœ์„ธ์Šค2๊ฐ€ ์ž‘์—…์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ )
โ€ข
ํ•ด๊ฒฐ๋ฒ• : ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ปค๋„๋ชจ๋“œ์—์„œ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์–ด๋„ CPU ์ œ์–ด๊ถŒ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•จ
3.
๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ํ™˜๊ฒฝ์—์„œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์˜ ์ปค๋„ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ
โ€ข
๋ฌธ์ œ์  : ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ํ™˜๊ฒฝ์—์„œ 2๊ฐœ์˜ CPU๊ฐ€ ๋™์‹œ์— ์ปค๋„ ๋‚ด๋ถ€์˜ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ ์กฐ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ
โ€ข
ํ•ด๊ฒฐ๋ฒ• : ์ปค๋„ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค, ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ lock/unlock์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•

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

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

์„ธ๋งˆํฌ์–ด(Semaphore)

โ€ข
๊ณต์œ ๋œ ์ž์›์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
โ€ข
๋˜ํ•œ ์„ธ๋งˆํฌ์–ด๋Š” ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ„๋‹จํ•œ ์นด์šดํ„ฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฎคํ…์Šค์™€์˜ ์ฐจ์ด์ด๋‹ค.
โ€ข
Spin Up ๋ฐฉ์‹๊ณผ Block & wakeup 2๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ Spin Up ๋ฐฉ์‹์€ CPU๋ฅผ ๊ณ„์† ์ ์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— busy-waiting์ด ๋ฐœ์ƒํ•œ๋‹ค.

์„ธ๋งˆํฌ์–ด์˜ P, V ์—ฐ์‚ฐ (Block & Wakeup ๋ฐฉ์‹)

P : ์ž„๊ณ„ ๊ตฌ์—ญ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ˆ˜ํ–‰ ( ํ”„๋กœ์„ธ์Šค ์ง„์ž… ์—ฌ๋ถ€๋ฅผ ์ž์›์˜ ๊ฐœ์ˆ˜(S)๋ฅผ ํ†ตํ•ด ๊ฒฐ์ •)
์ปค๋„์€ wait ( == block )์„ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ suspend ์‹œํ‚ค๊ณ  ์ด ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ ์„ธ๋งˆํฌ์–ด์— ๋Œ€ํ•œ wait queue์— ๋„ฃ๋Š”๋‹ค.
V : ์ž„๊ณ„ ๊ตฌ์—ญ์—์„œ ๋‚˜์˜ฌ ๋•Œ ์ˆ˜ํ–‰ ( ์ž์› ๋ฐ˜๋‚ฉ ์•Œ๋ฆผ, ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์šฐ๋Š” ์‹ ํ˜ธ )
block๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ wakeup ์‹œํ‚ค๊ณ  ์ด ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ ready queue๋กœ ์˜ฎ๊ธด๋‹ค.
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
C
๋ณต์‚ฌ

๋ฎคํ…์Šค (Mutex)

โ€ข
์ƒํ˜ธ ๋ฐฐ์ œ(Mutual Exclusion)์˜ ์•ฝ์ž๋กœ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๋“ค์˜ ์‹คํ–‰์‹œ๊ฐ„์ด ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
โ€ข
ํ•ด๋‹น ์ ‘๊ทผ์„ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•ด lock๊ณผ unlock์„ ์‚ฌ์šฉํ•œ๋‹ค.
โ—ฆ
lock : ํ˜„์žฌ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ๊ถŒํ•œ์„ ์–ป์–ด์˜ด ( ๋งŒ์•ฝ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์ˆ˜ํ–‰ ์ค‘์ด๋ฉด ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ )
โ—ฆ
unlock : ํ˜„์žฌ ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ์Œ์„ ์•Œ๋ฆผ. ( ๋Œ€๊ธฐ ์ค‘์ธ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ์Œ )
โ€ข
๋ฎคํ…์Šค๋Š” ์ƒํƒœ๊ฐ€ 1, 0 ๋ฐ–์— ์—†๊ณ , ์ด์ง„ ์„ธ๋งˆํฌ์–ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค.

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

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๋กœ ๋ฐ”๊ฟ” ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆผ
C
๋ณต์‚ฌ
2. ํ”ผํ„ฐ์Šจ (Peterson) ์•Œ๊ณ ๋ฆฌ์ฆ˜
๋ฐ์ปค์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ƒ๋Œ€๋ฐฉ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ์—๊ฒŒ ์ง„์ž… ๊ธฐํšŒ๋ฅผ ์–‘๋ณดํ•˜๋Š” ๊ฒƒ์— ์ฐจ์ด๊ฐ€ ์žˆ์Œ
while(true) { flag[i] = true; // ํ”„๋กœ์„ธ์Šค i๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์ง„์ž… ์‹œ๋„ turn = j; // ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ง„์ž… ๊ธฐํšŒ ์–‘๋ณด while(flag[j] && turn == j) { // ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„์ž… ์‹œ๋„ํ•˜๋ฉด ๋Œ€๊ธฐ } } // ------- ์ž„๊ณ„ ๊ตฌ์—ญ --------- flag[i] = false; // flag ๊ฐ’์„ false๋กœ ๋ฐ”๊ฟ” ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆผ
C
๋ณต์‚ฌ
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; // ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์ข…๋ฃŒ
C
๋ณต์‚ฌ