[OS] Spinlock, Semaphore, Mutex, Monitor

๊ถŒ์šฉํ™˜ยท2021๋…„ 10์›” 29์ผ
0

OS

๋ชฉ๋ก ๋ณด๊ธฐ
3/3

์งˆ๋ฌธ ๊ฑฐ๋ฆฌ

Q1. ๋™์‹œ์„ฑ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๋ฅผ ๋™๊ธฐํ™” ํ•˜๋Š” ์ด์œ ๋Š”?

๐Ÿ‘‰ race condition ์ด๋‚˜ deadlock์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด

Q2. ๋™๊ธฐํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”๊ฐ€?

๐Ÿ‘‰ spinlock, semaphore, mutex, monitor ๋“ฑ

Spinlock์ด๋ž€?

spinlock

๐Ÿ‘‰ ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ์ž„๊ณ„์˜์—ญ์— ์ ‘๊ทผํ• ๋•Œ, ํ•˜๋‚˜๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž

Thread 0์ด ์ž„๊ณ„์˜์—ญ์„ ์ ์œ ์ค‘์ด๊ณ  lock์„ ๊ฑธ์–ด๋†“์€ ์ƒํƒœ์ผ๋•Œ, Thread 1์€ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๋ฌดํ•œ์ • ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค

๋‹ค๋งŒ spinlock์—์„œ๋Š” busy waiting์ด๋ผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, Thread 0์ด ์ž„๊ณ„์˜์—ญ์„ ๋‹ค ์‚ฌ์šฉํ–ˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ Thread 1์ด ๊ณ„์† ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค

Busy waiting์€ ์ฝ”๋“œ์ƒ์—์„œ while ๋ฌธ์œผ๋กœ ๋Œ€๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ปดํ“จํ„ฐ ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌ๊ฒŒ ๋‚ญ๋น„๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค

Semaphore ๋ž€?

semaphore

๐Ÿ‘‰ ์„ธ๋งˆํฌ์–ด๋Š” spinlock์˜ ๋‹จ์ ์ธ busy waiting์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด wait()์™€ signal() ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค

Wait ์ƒํƒœ์ธ ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ ํ์— ๋“ค์–ด๊ฐ€์„œ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ while ๋ฌธ์„ ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๊ฐ€ ์—†๋‹ค

์ž„๊ณ„์˜์—ญ์„ ์ ์œ ์ค‘์ด๋˜ ์Šค๋ ˆ๋“œ๋Š” ์ž‘์—…์ด ๋๋‚˜๋Š”๋Œ€๋กœ signal()์„ ํ†ตํ•ด lock์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ์จ ๋Œ€๊ธฐ ํ์— ์กด์žฌํ•˜๋˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์›Œ ์ค€๋น„ ํ๋กœ ์ด๋™์‹œํ‚จ๋‹ค

ํฌ๊ฒŒ binary semaphore์™€ counting semaphore ๋‘๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋œ๋‹ค

binary semaphore

binary semaphore

๐Ÿ‘‰ 0 ๊ณผ 1 ๋‘๊ฐ€์ง€์˜ ๊ฐ’๋งŒ ์กด์žฌํ•œ๋‹ค

๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ์ž„๊ณ„์˜์—ญ์€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ์ด ์ ์œ  ๊ฐ€๋Šฅํ•˜๋‹ค

counting semaphore

counting semaphore

๐Ÿ‘‰ ์–ด๋– ํ•œ ์–‘์˜ ์ •์ˆ˜ ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค

์ด ์ •์ˆ˜ ๊ฐ’๋งŒํผ์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ๋™์‹œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค

์ด์ฏค์—์„œ spinlock๊ณผ semaphore์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

spinlock์€ loop๋ฅผ ํ†ตํ•ด ์Šค๋ ˆ๋“œ๋กœ ํ•˜์—ฌ๊ธˆ ๋Š์ž„์—†์ด ์ž„๊ณ„์˜์—ญ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค

๋ฐ˜๋ฉด, semaphore๋Š” ๋ฐ”๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์Šค๋ ˆ๋“œ๋Š” sleep ์‹œํ‚ค๊ณ  ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ผ๋•Œ awaken up ์‹œ์ผœ์ค๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด, semaphore์—์„œ๋Š” ๋ฆฌ์†Œ์Šค์˜ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋˜ํ•œ, spinlock์€ ๊ตฌํ˜„์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ด์„œ ํ•œ๋ˆˆ์— ์•Œ์•„๋ณด๊ธฐ ์‰ฌ์šฐ๋ฉฐ lock์„ ์งง์€ ์‹œ๊ฐ„๋™์•ˆ๋งŒ ์ ์œ ํ•  ๊ฒฝ์šฐ์—๋Š” ์˜คํžˆ๋ ค ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค

๋ฐ˜๋ฉด, semaphore๋Š” ๊ตฌํ˜„์ด ์–ด๋ ต์ง€๋งŒ ์˜ค๋žœ ์‹œ๊ฐ„์„ ๋Œ€๊ธฐํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์—์„œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค

spinlock๊ณผ binary semaphore๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ lock์— ์ ‘๊ทผ๊ฐ€๋Šฅํ•ด์„œ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, counting semaphore๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์— ์ ‘๊ทผ ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•œ๋‹ค

Mutex ๋ž€?

๐Ÿ‘‰ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ์ง€๋‹Œ ์‹คํ–‰์— ์žˆ์–ด์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜

Mutual Exclusion ์˜ ์ค„์ž„๋ง๋กœ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค

๋ฎคํ…์Šค๋Š” lock์ด๋‹ค! ์‹คํ–‰ํ• ๋•Œ ์ž ๊ถœ๋‹ค๊ฐ€ ๋‹ค ์“ฐ๊ณ ๋‚˜๋ฉด ์—ด์–ด๋‘”๋‹ค!

๋ฎคํ…์Šค ์‚ฌ์šฉ์‹œ ์ฃผ์˜์ 

  1. ์ž˜๋ชป ์„ค๊ณ„ํ•  ๊ฒฝ์šฐ lock ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ญ์ƒ ์ ์œ ํ•ด๋ฒ„๋ฆฌ๋ฏ€๋กœ starvation ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์กฐ์‹ฌํ•˜์ž

  2. ๋งŽ์€ lock์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ, deadlock ๋ฐœ์ƒ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค

binary semaphore์™€ mutex์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

binary semaphore๋Š” signaling mechanism ์ด๊ณ  mutex๋Š” locking mechanism์ด๋‹ค

Monitor ๋ž€?

๐Ÿ‘‰ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒํ˜ธ ๋ฐฐ์ œ์™€ ํ˜‘๋™์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜

mutual exclusion - lock์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ์ˆœ๊ฐ„์— ํŠน์ • ์Šค๋ ˆ๋“œ๋งŒ ์ž„๊ณ„ ์˜์—ญ ์ ‘๊ทผ ๊ฐ€๋Šฅ

cooperation - wait set์„ ์ด์šฉํ•˜์—ฌ ํŠน์ • ์กฐ๊ฑด์ด ๋ ๋•Œ๊นŒ์ง€ ์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜๋ฉฐ, ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Œ

monitor๋กœ ๋ถˆ๋ฆฌ๋Š” ์ด์œ ๋Š”?

์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž์›์— ์ ‘๊ทผํ•˜๋Š”์ง€ ๊ฐ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ

Java ์—์„œ๋Š” ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€?

Synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

synchronized methods : ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

public synchronized void method() {
    // ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ๋จ
    }

synchronized statements : ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ๋‚ซ๋‹ค

public void method() {
    
    // ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉ๋˜์–ด๋„ ๊ดœ์ฐฎ์€ ์˜์—ญ
    
    //์—ฌ๊ธฐ๋ถ€ํ„ฐ๋Š” ์ž„๊ณ„ ์˜์—ญ
    synchronized(๊ณต์œ  ๊ฐ์ฒด) {
        
    } // ์ž„๊ณ„ ์˜์—ญ ๋
    
    // ๋‹ค์‹œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    
    }

entry set๊ณผ wait set์„ ์‚ฌ์šฉํ•œ๋‹ค

  • ๋ชจ๋‹ˆํ„ฐ๋Š” entry set, wait set, ์ž„๊ณ„์˜์—ญ ์ด๋ ‡๊ฒŒ ์„ธ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค
  • ์ž„๊ณ„์˜์—ญ์€ synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ๋ถ€๋ถ„์œผ๋กœ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•˜๊ณ  ์‹ถ์€ ์˜์—ญ์ด๋‹ค
  • wait set์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๊ณณ์ด๋‹ค
  • entry set์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž…์žฅํ•˜๋Š” ๊ณณ์ด๋‹ค
  • wait() , notify() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

์ž‘๋™ ์›๋ฆฌ

  1. ์Šค๋ ˆ๋“œ๊ฐ€ entry set์— ๋“ค์–ด๊ฐ€์„œ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ธฐ๋‹ค๋ฆผ
  2. ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ์ž„๊ณ„์˜์—ญ์— ๋“ค์—ฌ๋ณด๋‚ด์ค€๋‹ค
  3. ์ž‘์—…์ด ์™„๋ฃŒ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋•Œ๋กœ๋Š” wait set์—์„œ ๋Œ€๊ธฐ๋ฅผ ํ•ด์•ผํ•œ๋‹ค
  4. ๋‹ค์‹œ ์ฐจ๋ก€๊ฐ€ ์˜ค๋ฉด ์ž„๊ณ„์˜์—ญ์— ์ ‘๊ทผํ•˜์—ฌ ์ž‘์—…์„ ์™„๋ฃŒํ•œ๋‹ค

JVM์˜ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค

๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ์—๋Š” FIFO ์Šค์ผ€์ค„๋ง์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค

์ฐธ๊ณ 

baeldung ๋ธ”๋กœ๊ทธ

profile
๋งˆ๊ตฌ ๋‚™์„œํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€