CS/์šด์˜์ฒด์ œ

[์šด์˜์ฒด์ œ] ๊ณต์œ  ์ž์›๊ณผ ์ž„๊ณ„ ์˜์—ญ

1eehyunji 2023. 8. 31. 00:36

๊ณต์œ  ์ž์›(shared memory)

๊ณต์œ  ์ž์›์€ ์‹œ์Šคํ…œ ์•ˆ์—์„œ ๊ฐ ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ๊ฐ€ ํ•จ๊ป˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋‹ˆํ„ฐ, ํ”„๋ฆฐํ„ฐ, ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ, ๋ฐ์ดํ„ฐ ๋“ฑ์˜ ์ž์›์ด๋‚˜ ๋ณ€์ˆ˜ ๋“ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด ๊ณต์œ  ์ž์›์„ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ์ƒํ™ฉ์„ ๊ฒฝ์Ÿ ์ƒํƒœ(race condition)์ด๋ผ ํ•œ๋‹ค. 

๋™์‹œ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•  ๋•Œ, ์ ‘๊ทผ์˜ ํƒ€์ด๋ฐ์ด๋‚˜ ์ˆœ์„œ ๋“ฑ์ด ๊ฒฐ๊ด๊ฐ’์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ธ ๊ฒƒ์ด๋‹ค.

๊ณต์œ  ์ž์› ์˜ˆ์‹œ

์ „์—ญ ๋ณ€์ˆ˜ '์˜ˆ๊ธˆ'์— 10๋งŒ์›์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ํ”„๋กœ์„ธ์Šค P1์ด ์˜ˆ๊ธˆ์„ ํ™•์ธํ•˜๊ณ , ํ”„๋กœ์„ธ์Šค P2๊ฐ€ ์˜ˆ๊ธˆ์„ ํ™•์ธํ•œ ๋’ค์— ์˜ˆ๊ธˆ์— 5๋งŒ์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์˜ˆ๊ธˆ์„ ์ €์žฅํ•œ๋‹ค. ์ด๋•Œ ์ถ”๊ฐ€ํ•œ ์˜ˆ๊ธˆ์ด ํ”„๋กœ์„ธ์Šค P1์—๋Š” ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š”๋‹ค. 

๊ทธ ์ดํ›„์—, ํ”„๋กœ์„ธ์Šค P1์ด ํ”„๋กœ์„ธ์Šค P2๊ฐ€ ์˜ˆ๊ธˆ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ํ™•์ธํ•ด๋‘” ์˜ˆ๊ธˆ ๊ธˆ์•ก์— 10๋งŒ์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์˜ˆ๊ธˆ์„ ์ €์žฅํ•œ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ, ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๊ฐ’์€ 25๋งŒ์›์ด์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค P1, P2์—์„œ๋Š” ํ‹€๋ฆฐ ์˜ˆ๊ธˆ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. 

 

์ž„๊ณ„ ์˜์—ญ(critical section)

์ž„๊ณ„ ์˜์—ญ์€ ๋‘˜ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ ์ˆœ์„œ ๋“ฑ์˜ ์ด์œ ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ์ฝ”๋“œ ์˜์—ญ์„ ๋งํ•œ๋‹ค.

์ž„๊ณ„ ์˜์—ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋ฎคํ…์Šค, ์„ธ๋งˆํฌ์–ด, ๋ชจ๋‹ˆํ„ฐ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ชจ๋‘ ์ƒํ˜ธ ๋ฐฐ์ œ, ํ•œ์ • ๋Œ€๊ธฐ, ์œตํ†ต์„ฑ์ด๋ž€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค. 

์ด ๋ฐฉ๋ฒ•์— ํ† ๋Œ€๊ฐ€ ๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ž ๊ธˆ(lock)์ด๋‹ค. 

  • ์ƒํ˜ธ ๋ฐฐ์ œ : ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ์˜์—ญ์— ๋“ค์–ด๊ฐ”์„ ๋•Œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.
  • ํ•œ์ • ๋Œ€๊ธฐ : ํŠน์ • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜์›ํžˆ ์ž„๊ณ„ ์˜์—ญ์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  • ์œตํ†ต์„ฑ : ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ผ์„ ๋ฐฉํ•ดํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

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

ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์„ lock()์„ ํ†ตํ•ด ์ž ๊ธˆ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•œ ํ›„์—๋Š” unlock()์„ ํ†ตํ•ด ์ž ๊ธˆ ํ•ด์ œํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

์ž ๊ธˆ์ด ์„ค์ •๋˜๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๋Š” ์ž ๊ธด ์ฝ”๋“œ ์˜์—ญ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ  ํ•ด์ œ๋Š” ๊ทธ์™€ ๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊ฒผ๋˜ ์ฝ”๋“œ ์˜์—ญ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

๋˜ํ•œ ๋ฎคํ…์Šค๋Š” ์ž ๊ธˆ ๋˜๋Š” ์ž ๊ธˆ ํ•ด์ œ๋ผ๋Š” ์ƒํƒœ๋งŒ์„ ๊ฐ€์ง„๋‹ค.

mutex

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

์„ธ๋งˆํฌ์–ด๋Š” ์ผ๋ฐ˜ํ™”๋œ ๋ฎคํ…์Šค์ด๋‹ค. ๊ฐ„๋‹จํ•œ ์ •์ˆ˜ ๊ฐ’๊ณผ ๋‘ ๊ฐ€์ง€ ํ•จ์ˆ˜ wait(P ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ) ๋ฐ signal(V ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ)๋กœ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

wait()๋Š” ์ž์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, signal()์€ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋กœ ์ˆœ์„œ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

์„ธ๋งˆํฌ์–ด

  ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•˜๋ฉด ์„ธ๋งˆํฌ์–ด์—์„œ wait() ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์„ ํ•ด์ œํ•˜๋ฉด ์„ธ๋งˆํฌ์–ด์—์„œ signal() ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์„ธ๋งˆํฌ์–ด์—๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜๊ฐ€ ์—†๊ณ  ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์„ธ๋งˆํฌ์–ด ๊ฐ’์„ ์ˆ˜์ •ํ•  ๋•Œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๋Š” ๋™์‹œ์— ์„ธ๋งˆํฌ์–ด ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค. 

์ฆ‰, ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•˜๋ฉด ์„ธ๋งˆํฌ์–ด์—์„œ wait() ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ ,

ํ•ด๋‹น ๊ณต์œ  ์ž์›์„ ์‚ฌ์šฉ์ค‘์ธ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์„ ํ•ด์ œํ•ด์„œ ์„ธ๋งˆํฌ์–ด์—์„œ signal()์ด ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.

 

๋ฐ”์ด๋„ˆ๋ฆฌ ์„ธ๋งˆํฌ์–ด

๋ฐ”์ด๋„ˆ๋ฆฌ ์„ธ๋งˆํฌ์–ด๋Š” 0๊ณผ 1์˜ ๋‘ ๊ฐ€์ง€ ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์„ธ๋งˆํฌ์–ด์ด๋‹ค.

๊ตฌํ˜„์˜ ์œ ์‚ฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฎคํ…์Šค๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ธ๋งˆํฌ์–ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋ฎคํ…์Šค๋ฅผ ์ž ๊ธˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํ˜ธ๋ฐฐ์ œ๊ฐ€ ์ผ์–ด๋‚˜๋Š” '์ž ๊ธˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜'์ด๊ณ , ์„ธ๋งˆํฌ์–ด๋Š” ์‹ ํ˜ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํ˜ธ ๋ฐฐ์ œ๊ฐ€ ์ผ์–ด๋‚˜๋Š” '์‹ ํ˜ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜'์ด๋‹ค. 

 

์นด์šดํŒ… ์„ธ๋งˆํฌ์–ด

์นด์šดํŒ… ์„ธ๋งˆํฌ์–ด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ์„ธ๋งˆํฌ์–ด์ด๋ฉฐ, ์—ฌ๋Ÿฌ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 

์œ ํ•œํ•œ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์ž์›์„ ์ ‘๊ทผ ์ œ์–ดํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์„ธ๋งˆํฌ์–ด๋Š” ๊ฐ€์šฉํ•œ ์ž์›์˜ ๊ฐœ์ˆ˜๋กœ ์ดˆ๊ธฐํ™” ๋˜๋ฉฐ wait() ์—ฐ์‚ฐ ์ˆ˜ํ–‰์‹œ ์„ธ๋งˆํฌ์–ด ๊ฐ’์€ ๊ฐ์†Œํ•œ๋‹ค. ์ดํ›„ signal() ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์„ธ๋งˆํฌ์–ด ๊ฐ’์€ ์ฆ๊ฐ€ํ•œ๋‹ค. ์„ธ๋งˆํฌ์–ด ๊ฐ’์ด 0์ด ๋˜๋ฉด ๋ชจ๋“  ์ž์›์ด ์‚ฌ์šฉ ์ค‘์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

์นด์šดํŒ… ์„ธ๋งˆํฌ์–ด์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

semaphore s = 1;

void Process (int i) {
	while (true) 
  {
     wait(s); //์„ธ๋งˆํฌ์–ด ๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
        
     /* ์ž„๊ณ„ ์˜์—ญ */
        
     signal(s); //์„ธ๋งˆํฌ์–ด ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
        
     /* ์ž„๊ณ„ ์˜์—ญ ์ดํ›„ ์ฝ”๋“œ */
   }
}

๋ณ€์ˆ˜ s๋ฅผ ๊ฐ€์šฉํ•œ ์ž์›์˜ ๊ฐœ์ˆ˜์ธ 1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ์ž„๊ณ„ ์˜์—ญ ์ฝ”๋“œ๋ฅผ wait() ํ•จ์ˆ˜์™€ signal() ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์ค˜์„œ, ์–ด๋–ค ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ์ž„๊ณ„ ์˜์—ญ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ wait() ํ•จ์ˆ˜๋กœ ์„ธ๋งˆํฌ์–ด ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ(์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณต์œ  ์ž์›์ด ์—†๋Š” ๊ฒฝ์šฐ), 

๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ์—์„œ signal()์ด ์ˆ˜ํ–‰๋˜์–ด ์„ธ๋งˆํฌ์–ด ๊ฐ’์ด 0๋ณด๋‹ค ์ปค์ง€๋ฉด(์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณต์œ  ์ž์›์ด ๋˜๋ฉด), ๋Œ€๊ธฐ ์ƒํƒœ๋ฅผ ๋น ์ ธ๋‚˜์™€ ์ž„๊ณ„ ์˜์—ญ ์ฝ”๋“œ์— ์ ‘๊ทผํ•˜๊ณ , ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋ฉด signal() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์„ธ๋งˆํฌ์–ด ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค(๊ณต์œ  ์ž์›์„ ํ•ด์ œํ•œ๋‹ค). 

 

๋ชจ๋‹ˆํ„ฐ

๋ชจ๋‹ˆํ„ฐ๋Š” ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์›์— ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต์œ  ์ž์›์„ ์ˆจ๊ธฐ๊ณ  ํ•ด๋‹น ์ ‘๊ทผ์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณตํ•œ๋‹ค.

๋ชจ๋‹ˆํ„ฐ

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ชจ๋‹ˆํ„ฐ๋Š” ๋ชจ๋‹ˆํ„ฐ ํ๋ฅผ ํ†ตํ•ด ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ž‘์—…๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

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

๋ฐ˜๋ฉด์—, ์„ธ๋งˆํฌ์–ด์—์„œ๋Š” ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.