๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Group_Study/Operating System

[3์ฃผ์ฐจ] Mutual Exclusion Solutions (OS supported SW solution)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 12. 18.

Mutual Exclusion Solutions (OS supported SW solution)

Spinlock

โœ” ์ •์ˆ˜ ๋ณ€์ˆ˜
โœ” ์ดˆ๊ธฐํ™”, P(), V() ์—ฐ์‚ฐ์œผ๋กœ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

  • ์œ„ ์—ฐ์‚ฐ๋“ค์€ indivisible (or atomic) ์—ฐ์‚ฐ
    • OS support
    • ์ „์ฒด๊ฐ€ ํ•œ instruction cycle์— ์ˆ˜ํ–‰๋จ

โœ” P, V ์—ฐ์‚ฐ์„ ํ†ตํ•ด active ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ž„๊ณ„์˜์—ญ์— ์ง„์ž…ํ•œ๋‹ค

ํŠน์ง•

โœ” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ์‹œ์Šคํ…œ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โœ” Busy waiting

  • lock์„ ๋Œ€๊ธฐํ•˜๋Š” ๋™์•ˆ loop๋ฅผ ๋Œ๋ฉด์„œ busy waiting ์ƒํƒœ๋กœ ๋Œ€๊ธฐ

Semaphore

โœ” 1965๋…„ Dijkstra๊ฐ€ ์ œ์•ˆ
โœ” Busy waiting ๋ฌธ์ œ ํ•ด๊ฒฐ

โœ” ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜(S)

  • ์ดˆ๊ธฐํ™” ์—ฐ์‚ฐ, P(), V()๋กœ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • P: Probern(๊ฒ€์‚ฌ)
    • V: Verhogen(์ฆ๊ฐ€)

โœ” ์ž„์˜์˜ S๋ณ€์ˆ˜ ํ•˜๋‚˜์— ready queue ํ•˜๋‚˜๊ฐ€ ํ• ๋‹น๋จ

semaphore์˜ ์ข…๋ฅ˜

โœ” Binary semaphore

  • S๊ฐ€ 0๊ณผ 1 ๋‘ ์ข…๋ฅ˜์˜ ๊ฐ’๋งŒ ๊ฐ–๋Š” ๊ฒฝ์šฐ
  • ์ƒํ˜ธ๋ฐฐ์ œ๋‚˜ ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”์˜ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ

โœ” Counting semaphore

  • S๊ฐ€ 0 ์ด์ƒ์˜ ์ •์ˆ˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
  • Producer-Consumer ๋ฌธ์ œ ๋“ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    • ์ƒ์‚ฐ์ž - ์†Œ๋น„์ž ๋ฌธ์ œ

์—ฐ์‚ฐ

โœ” ์ดˆ๊ธฐํ™” ์—ฐ์‚ฐ: S๋ณ€์ˆ˜์— ์ดˆ๊ธฐ๊ฐ’์„ ๋ถ€์—ฌํ•˜๋Š” ์—ฐ์‚ฐ

โœ” P() ์—ฐ์‚ฐ, V() ์—ฐ์‚ฐ

โœ” ์ž์›์„ ํ• ๋‹น ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด ready queue(๋Œ€๊ธฐ์‹ค)์—์„œ ๋Œ€๊ธฐ
โœ” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚˜๊ฐˆ ๋•Œ ready queue์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ wake up ์‹œํ‚จ๋‹ค!

โœ” ๋ชจ๋‘ indivisible ์—ฐ์‚ฐ

  • OS support
  • ์ „์ฒด๊ฐ€ ํ•œ instruction cycle์— ์ˆ˜ํ–‰

Semaphore๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค

โœ” ์ƒํ˜ธ๋ฐฐ์ œ ๋ฌธ์ œ (Mutual exclusion)
โœ” ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™” ๋ฌธ์ œ (process synchronization problem)
โœ” ์ƒ์‚ฐ์ž-์†Œ๋น„์ž ๋ฌธ์ œ (producer-consumer problem)
โœ” Reader - writer problem
โœ” Dining philosopher problem
โœ” ๊ธฐํƒ€

Mutual exclusion

Process synchronization

โœ” Process๋“ค์˜ ์‹คํ–‰ ์ˆœ์„œ ๋งž์ถ”๊ธฐ

  • ํ”„๋กœ์„ธ์Šค๋“ค์€ ๋ณ‘ํ–‰์ ์ด๋ฉฐ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰

Producer-Consumer problem

โœ” ์ƒ์‚ฐ์ž ํ”„๋กœ์„ธ์Šค: ๋ฉ”์„ธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน
โœ” ์†Œ๋น„์ž ํ”„๋กœ์„ธ์Šค: ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน

Producer-Consumer problem with Single Buffer

โœ” 2๊ฐœ์˜ ๋ณ€์ˆ˜ ์ƒ์„ฑ (consumed, produced)

โœ” producer๋Š” buffer๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ (consumed) ์ฒดํฌ ํ›„ buffer์— ๋ฉ”์„ธ์ง€(M) ๋„ฃ๊ธฐ
โœ” ์ดํ›„ produced ๋ณ€์ˆ˜ 0 -> 1

โœ” consumer๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ์žˆ๋Š”์ง€ (produced) ํ™•์ธ

  • ์žˆ์œผ๋ฉด ๋ฉ”์„ธ์ง€ ์†Œ๋น„ ํ›„ cousumed 0 -> 1
  • ์—†์œผ๋ฉด ๊นจ์›Œ์ค„ ๋•Œ๊นŒ์ง€ ready queue์—์„œ ๋Œ€๊ธฐ

Producer-Consumer problem with N-Buffer

โœ” buffer๋Š” ์›ํ˜• ํ ์‚ฌ์šฉ


โœ” mutexP: producer / mutexC: consumer -> ์ƒํ˜ธ๋ฐฐ์ œ ๊ตฌํ˜„

โœ” nrfull: ์ฐจ ์žˆ๋Š” buffer์˜ ์ˆ˜ / nrempty: ๋น„์–ด ์žˆ๋Š” buffer์˜ ์ˆ˜

โœ” producer

  • producer๋Š” ์ƒ์‚ฐํ•  ๋•Œ nrempty๋ฅผ ํ†ตํ•ด์„œ ๊ณต๊ฐ„์ด ์žˆ๋Š”์ง€(> 0) ํ™•์ธ
  • ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ๊ณต๊ฐ„์— ๋ฉ”์„ธ์ง€๋ฅผ ๋„ฃ๊ณ  ์›ํ˜•ํ์˜ ์œ„์น˜ ๊ฐฑ์‹  (์—†์œผ๋ฉด ready queue)
  • nrfull ๋ณ€์ˆ˜ ์ฆ๊ฐ€

โœ” consumer

  • ์†Œ๋น„ํ•  ๋–„ nrfull์„ ํ†ตํ•ด ๋ฉ”์„ธ์ง€๊ฐ€ ์žˆ๋Š”์ง€(> 0) ํ™•์ธ
  • ๋ฉ”์„ธ์ง€๊ฐ€ ์žˆ์œผ๋ฉด ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ€๊ณ  ์›ํ˜•ํ ์œ„์น˜ ๊ฐฑ์‹ (์—†์œผ๋ฉด ready queue)
  • nrempty ๋ณ€์ˆ˜ ์ฆ๊ฐ€

Reader-Writer problem

โœ” Reader

  • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ฝ๊ธฐ ์—ฐ์‚ฐ๋งŒ ์ˆ˜ํ–‰

โœ” Writer

  • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ฐฑ์‹  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰

โœ” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ ํ•„์š”

  • reader๋“ค์€ ๋™์‹œ์— ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • writer๋“ค(๋˜๋Š” reader์™€ writer)์ด ๋™์‹œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์‹œ ์ƒํ˜ธ๋ฐฐ์ œ(๋™๊ธฐํ™”) ํ•„์š”

โœ” ํ•ด๊ฒฐ๋ฒ•

  • reader/writer์— ๋Œ€ํ•œ ์šฐ์„ ๊ถŒ ๋ถ€์—ฌ
    • reader preference solution
    • writer preference solution

reader preference solution

โœ” wmutex: writer / rmutex: reader
โœ” nreaders: reader์˜ ์ˆ˜

โœ” Reader

  • ์ž๊ธฐ๊ฐ€ ์ฒ˜์Œ ์ฝ์„ ๋–„ writer ์ƒํ˜ธ๋ฐฐ์ œ
  • reader ์ˆ˜ ์ฆ๊ฐ€

  • ์ฝ๊ธฐ๋Š” ์—ฌ๋Ÿฌ ๋ช…์ด ํ•ด๋„ ๋œ๋‹ค (์ƒํ˜ธ๋ฐฐ์ œ x)
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚˜๊ฐˆ ๊ฒฝ์šฐ์—” writer ์ƒํ˜ธ๋ฐฐ์ œ ํ•ด์ œ

ํŠน์ง•

โœ” No busy waiting

  • ๋Œ€๊ธฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” block(asleep) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค

โœ” seamaphore queue์— ๋Œ€ํ•œ wake-up ์ˆœ์„œ๋Š” ๋น„๊ฒฐ์ •์ 

  • starvation problem

Eventcount / Sequencer

โœ” ์€ํ–‰์˜ ๋ฒˆํ˜ธํ‘œ์™€ ๋น„์Šทํ•œ ๊ฐœ๋…

โœ” Sequencer

  • ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜
  • ์ƒ์„ฑ ์‹œ 0์œผ๋กœ ์ดˆ๊ธฐํ™”, ๊ฐ์†Œํ•˜์ง€ ์•Š์Œ
  • ๋ฐœ์ƒ ์‚ฌ๊ฑด๋“ค์˜ ์ˆœ์„œ ์œ ์ง€
  • ticket() ์—ฐ์‚ฐ์œผ๋กœ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

โœ” ticket(S)

  • ํ˜„์žฌ๊นŒ์ง€ ticket() ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ ๋œ ํšŸ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
  • indivisible operation

โœ” Eventcount

  • ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜
  • ์ƒ์„ฑ ์‹œ 0์œผ๋กœ ์ดˆ๊ธฐํ™”, ๊ฐ์†Œํ•˜์ง€ ์•Š์Œ
  • ํŠน์ • ์‚ฌ๊ฑด์˜ ๋ฐœ์ƒ ํšŸ์ˆ˜๋ฅผ ๊ธฐ๋ก
  • read(E), advance(E), await(E, v) ์—ฐ์‚ฐ์œผ๋กœ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

โœ” read(E)

  • ํ˜„์žฌ Eventcount ๊ฐ’ ๋ฐ˜ํ™˜

โœ” advance(E)

  • E <- E + 1
  • E๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์›€ (wake-up)

โœ” await(E, v)

  • v๋Š” ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜
  • if (E < v)์ด๋ฉด E์— ์—ฐ๊ฒฐ๋œ Q_E์— ํ”„๋กœ์„ธ์Šค ์ „๋‹ฌ(push) ๋ฐ CPU scheduler ํ˜ธ์ถœ

Mutual exclusion

producer-consumer problem

ํŠน์ง•

โœ” No busy waiting
โœ” No starvation

  • FIFO scheduling for Q_E

โœ” Semaphore๋ณด๋‹ค ๋” low-level control(์ž‘์—… ์ˆœ์„œ) ๊ฐ€๋Šฅ

๋Œ“๊ธ€