๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš— Major Study (Bachelor)/๐ŸŸง Operating System

[OS / ์šด์˜์ฒด์ œ] Mutex, Semaphores, Monitors

by UKHYUN22 2022. 5. 16.
728x90

Mutex 

Mutex์˜ ๊ฐ’์ด 1์ด๋ฉด ๋“ค์–ด๊ฐ€๋„ ๋œ๋‹ค. Boolean variable์˜ ๋œป์€ Availableํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ€์ง„๋‹ค. True์ด๋ฉด ๋“ค์–ด์™€๋„ ๋œ๋‹ค! ์ดˆ๊ธฐํ™”๋ฅผ True๋กœ ์„ค์ •์„ ํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ฌด๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. Atomic Operation์„ ํ†ตํ•ด์„œ๋งŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. Class์˜ Private ๋ณ€์ˆ˜๋กœ ์„ ์–ธ์„ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค. acquire๋Š” Entry section์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋ˆ„๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ์„ ํ•ด์•ผ ํ•œ๋‹ค. release ํ•จ์ˆ˜๋Š” Exit function์ด๋‹ค. ๋‹ค์Œ ์นœ๊ตฌ๊ฐ€ ๋“ค์–ด์™€๋„ ๋œ๋‹ค๊ณ  ํ•˜๋Š” ํ’€์–ด์ฃผ๋Š” ๊ตฌ์—ญ์ด๋‹ค.

acquire ํ•จ์ˆ˜

available์˜ ๊ฐ’์ด ์ฒ˜์Œ์— true์ด๋ฏ€๋กœ while ๋ฌธ์„ ํ†ต๊ณผํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ available๊ฐ€ false๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. ์ด๋ฏธ ๋“ค์–ด์™€์žˆ์œผ๋ฏ€๋กœ ์•„๋ฌด๋„ ๋“ค์–ด์˜ค๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. acquire ์ž์ฒด๊ฐ€ critical section ์•ž์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ available = false๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ํ•จ๊ป˜ ์ง„ํ–‰๋œ๋‹ค. 2๋ฒˆ Process๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด acquire๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. while์„ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๊ณ  waitํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ Mutual Exclusion์„ ๋งŒ์กฑํ•˜๊ฒŒ ๋œ๋‹ค. P1์ด ๋‚˜์˜ฌ ๋•Œ release ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. available์˜ ๊ฐ’์„ true๋กœ ๋ฐ”๊พธ๊ฒŒ ๋œ๋‹ค. P2์˜ ์ž…์žฅ์—์„œ๋Š” while ๋ฌธ์„ ๊นจ๋œจ๋ฆฌ๊ณ  ํ†ต๊ณผํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ ์ˆœ๊ฐ„์— available์„ false๋กœ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. ์ด ์ด์œ ๋Š” Mutual Exclusion์„ ๋งŒ์กฑํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๊ฐ๊ฐ์˜ acquireํ•จ์ˆ˜์™€ release ํ•จ์ˆ˜๋Š” Atomic Operation์ด์–ด์•ผ ํ•œ๋‹ค. knocking๊ณผ locking ์‚ฌ์ด์˜ Gap์ด ์žˆ์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค. (acquire์˜ ํ•จ์ˆ˜ ์ด๋ฆ„์ด lock() wait()์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.) (release() ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ unlock()๊ณผ signal()์˜ ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค)

 

Mutex Locks

Entry Section์—์„œ Acquire๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. Exit section์—์„œ๋Š” Releaseํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. 

 

Semaphores

์ฃผ์ฐจํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด 3๊ฐœ๊ฐ€ ์žˆ์œผ๋ฉด ํ•œ ๋Œ€๋งŒ ๋“ค์–ด์™”๋‹ค๊ณ  Lock์„ ํ•ด๋ฒ„๋ฆฌ๋ฉด ์•ˆ๋œ๋‹ค. semaphore์—์„œ๋Š” Integer ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ง€๊ธˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Resource๊ฐ€ ๋ช‡ ๊ฐœ ๋‚จ์•„์žˆ๋Š”์ง€๋ฅผ ์ˆซ์ž๋กœ ๋‚˜ํƒ€๋‚ด์ค€๋‹ค. ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ S = 2 ๋ผ๊ณ  ๊ฐ€์ •์„ ํ•ด๋ณด์ž. P1์ด ๋“ค์–ด์˜จ๋‹ค. ๊ทธ ์ˆœ๊ฐ„ S = 2์ธ ์ƒํƒœ๋กœ while๋ฌธ์ด false๊ฐ€ ๋ผ์„œ ํ†ต๊ณผํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ S์˜ ๊ฐ’์„ 1 ๋งŒํผ ์ค„์ด๊ฒŒ ๋œ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ P2๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. while์˜ ์กฐ๊ฑด์ด false๊ฐ€ ๋ผ์„œ P2๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. P3๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ while๋ฌธ์ด true๊ฐ€ ๋˜๋ฏ€๋กœ whlie๋ฌธ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋‹ค. P1์ด ๋‚˜๊ฐˆ ๋•Œ Signal์„ ํ˜ธ์ถœํ•ด์„œ S๋ฅผ 1๋กœ ์ฆ๊ฐ€์‹œํ‚ค๊ฒŒ ๋˜๊ณ  ๊ทธ ์ˆœ๊ฐ„ P3๊ฐ€ while๋ฌธ์„ ํ†ต๊ณผํ•ด์„œ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค. Shared Resource๊ฐ€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์กด์žฌํ•œ๋‹ค. 

 

Implementation of Semaphore

busy waiting ์ด๋ž€? ๊ธฐ๋‹ค๋ฆฌ๋Š” Process๊ฐ€ ๊ณ„์†์ ์œผ๋กœ S ๋ณ€์ˆ˜๋ฅผ ์ณ๋‹ค๋ณด๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด ๋œ๋‹ค. CPU๋ฅผ ๊ณ„์†์ ์œผ๋กœ ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค. Block์ด๋ผ๋Š” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. Process ์ž์ฒด๋ฅผ Ready Queue์—์„œ ๊บผ๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. Waiting State๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ๋” ์ด์ƒ CPU Time์„ Waste ํ•˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. Waiting Queue์—์„œ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. ์ด๋Š” PCB๋กœ ๊ตฌ์„ฑ๋œ Linked List์ด๋‹ค. 

 

Implementation of Semaphore

semaphore Structure ์•ˆ์— Integer ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ณ  struct process์˜ ํƒ€์ž…์€ PCB์˜ ํƒ€์ž…์ด ๋œ๋‹ค. Linked List๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด์„œ๋Š” Head Pointer๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. *list๋Š” head๋ฅผ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ์— ํ•ด๋‹นํ•œ๋‹ค. 

wait()

black์€ ๋” ์ด์ƒ CPU Time Waste๋ฅผ ํ•˜์ง€ ์•Š๋„๋ก Waiting State๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์„ S = 2 ์ด๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•ด๋ณด์ž. S = 1๋กœ ๋ณ€ํ•˜๊ณ  if๋ฌธ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. P2์˜ ๊ฒฝ์šฐ S = 0์ด ๋˜๊ณ  if๋ฌธ์ด ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. P3์˜ ๊ฒฝ์šฐ S = -1์ด ๋˜๊ณ  if๋ฌธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. P3๋ฅผ linked list์— ์ถ”๊ฐ€๋ฅผ ํ•˜๊ณ  block()์„ ํ˜ธ์ถœํ•ด์„œ CPU Time์„ ๋ฐ›์ง€ ์•Š๊ณ  Waiting State๋กœ ๋น ์ง€๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. S๊ฐ€ Minus๊ฐ€ ๋˜๋ฉด ํ˜„์žฌ Block๋œ Process์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

Signal()

P1์ด ๋‚˜๊ฐ€๋ฉด S = -1 ์ด ๋˜๊ณ  list์—์„œ ํ•˜๋‚˜๋ฅผ ๊บผ๋‚ด์„œ P์— ๋„ฃ๋Š”๋‹ค. wakeup(p)๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด Waiting State์—์„œ Ready State๋กœ ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค. wakeup()์„ ํ•ด์„œ ๊นจ๊ฒŒ ๋˜๋ฉด Block ์ดํ›„๋ถ€ํ„ฐ ์‹คํ–‰์„ ์žฌ๊ฐœํ•˜๊ฒŒ ๋œ๋‹ค. wakeup() ์ดํ›„๋ถ€ํ„ฐ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ wait() ํ•จ์ˆ˜์˜ block() ์ดํ›„๋ถ€ํ„ฐ ์‹คํ–‰๋œ๋‹ค. 

Semaphore Instruction์€ ๋ฐ˜๋“œ์‹œ function์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ Atomic ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?? 

 

Implementation of Semaphore

Atomic ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์˜ ๋Œ€์ƒ์€ Critical Section์˜ Atomic์ด ์•„๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Wait๊ณผ Signal Function์—์„œ์˜ Atomic ํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. CPU๊ฐ€ ํ•˜๋‚˜ ๋ฐ–์— ์—†๋‹ค๋ฉด Interrupt๋ฅผ Disableํ•˜๋ฉด ๋œ๋‹ค. (Single Processor์ธ ๊ฒฝ์šฐ) ๋งŒ์•ฝ 2๊ฐœ ์ด์ƒ์˜ CPU๋ผ๋ฉด Interrupt Disable์ด Atomic์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค. Atomic ํ•œ ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ Spinlock์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด์ „์˜ Spinlock์€ ์ด์ „์˜ Process๊ฐ€ Exitํ•  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„์ด๊ณ  ์ง€๊ธˆ์˜ Spinlock์€ Wait๊ณผ Signal ํ•จ์ˆ˜ ์ž์ฒด์˜ ์‹œ๊ฐ„์ด๋ฏ€๋กœ ํ›จ์”ฌ ์ ๊ฒŒ ๊ฑธ๋ฆฐ๋‹ค. 

Atomic Function์€ ์ค‘๊ฐ„ ์ƒํƒœ๊ฐ€ ์—†๋‹ค๋ผ๋Š” ๊ฒƒ์ด๊ณ  Mutual Exclusion์€ ๋ˆ„๊ตฌ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋‹ค๋ฅธ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์—†๋‹ค์ด๋‹ค. ์ •์˜๊ฐ€ ๋‹ค๋ฅด๋‹ค. 

 

Monitors

semaphore๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ์—ญ์‹œ Low level์ด๋ผ๊ณ  ๋งํ•œ๋‹ค. low level์˜ ๊ฒฝ์šฐ ์ž˜ ๋ชป ํ˜ธ์ถœํ•˜๋ฉด ์ž‘๋™์„ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

Syntax of Monitor

Mutual Exclusion์ด ์ž๋™์ ์œผ๋กœ ๋ณด์žฅ๋˜๋Š” Class๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. (***********)