Post

[OS] Operating System(6-3): Monitors, Liveness

[OS] Operating System(6-3): Monitors, Liveness

๐Ÿ€ ์šด์˜์ฒด์ œ ์ „๊ณต ์ˆ˜์—… ์ •๋ฆฌ

semaphore๋Š” ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!!

  1. ์ž˜๋ชป๋œ ์—ฐ์‚ฐ ์ˆœ์„œ: signal(mutex) ํ›„์— wait(mutex) ํ˜ธ์ถœ
  2. ์ค‘๋ณต wait()ํ˜ธ์ถœ: wait(mutex) ํ›„์— ๋‹ค์‹œ wait(mutex) ํ˜ธ์ถœ
  3. ์—ฐ์‚ฐ ๋ˆ„๋ฝ: wait(mutex) ๋˜๋Š” signal(mutex) ๋ˆ„๋ฝ

์œ„ ๋ฌธ์ œ๋“ค์€ Deadlock, Race Condition, Starvation ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•จ!

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์  ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” synchronization tool์ด ํ•„์š”
โ†’ Monitors๊ฐ€ ๊ฐœ๋ฐœ๋จ

Monitors

๐Ÿ“šMonitors: semaphore๋ณด๋‹ค ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜

โœ…์ฃผ์š” ํŠน์ง•:

  • Abstract Data Type: ๊ณต์œ  ๋ฐ์ดํ„ฐ์™€ ์ด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ์บก์Аํ™”
  • ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์€๋‹‰: monitor ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋Š” ์˜ค์ง monitor๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ƒํ˜ธ ๋ฐฐ์ œ ์ž๋™ ๋ณด์žฅ: ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ๋ชจ๋‹ˆํ„ฐ ๋‚ด๋ถ€์—์„œ ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ
  • Condition Variable: ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€๊ธฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ œ๊ณต

Monitor ๊ตฌ์กฐ

1
2
3
4
5
6
7
8
9
10
11
12
monitor monitor-name {
    // ๊ณต์œ  ๋ณ€์ˆ˜ ์„ ์–ธ
    Data data
    ...
    //๊ณต์œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋“ค
    function P1 (...) { ... }
    function P2 (...) { ... }
    function Pn (...) { ... }
    
    //๋ชจ๋‹ˆํ„ฐ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ
    initialization code (...) { ... }
}

alt text

  1. ๊ณต์œ  ๋ฐ์ดํ„ฐ(Shared Data): ๋ชจ๋‹ˆํ„ฐ ๋‚ด๋ถ€์˜ ๊ณต์œ  ๋ณ€์ˆ˜๋“ค
  2. ์—ฐ์‚ฐ(Operations): ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋“ค
  3. ์ดˆ๊ธฐํ™” ์ฝ”๋“œ(Initialization Code): ๋ชจ๋‹ˆํ„ฐ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ
  4. ์ง„์ž… ํ(Entry Queue): ๋ชจ๋‹ˆํ„ฐ์— ์ง„์ž… ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ํ
  • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์€ ์ง„์ž… ํ์—์„œ ๋Œ€๊ธฐ
  • ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ๋” ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฉด Monitors condition variable์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์Šค๋กœ suspend ๊ฐ€๋Šฅ

Condition Variables


๐Ÿ“šCondition Variables: ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€๊ธฐ์‹œํ‚ด

  • condition x,y์˜ ํ˜•์‹
Condition Variables operation
  1. x.wait(): ์ด ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๋Š” x.signal()์ด ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ suspended
  2. x.signal(): x.wait()์„ ํ˜ธ์ถœํ•˜์—ฌ ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊นจ์›€(resume)

โœ…ํŠน์ง•:

  • ์กฐ๊ฑด ๋ณ€์ˆ˜(x or y)๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๋Œ€๊ธฐ ํ์˜ ์ด๋ฆ„
  • x.wait()์„ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋‹ค๋ฉด x.signal()์€ ์•„๋ฌด ํšจ๊ณผ ์—†์Œ
  • ์กฐ๊ฑด ๋ณ€์ˆ˜๋Š” ํŠน์ • ์ƒํƒœ๋‚˜ ์‚ฌ๊ฑด์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•ด๋‹น ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€๊ธฐ์‹œํ‚ด

  • ํ”„๋กœ์„ธ์Šค(๋˜๋Š”์Šค๋ ˆ๋“œ)๋Š” ๋ชจ๋‹ˆํ„ฐ ์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐฉํ•ด๋ฐ›์ง€ ์•Š๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์žฅ๋ฐ›์Œ
  • ๋งŒ์ผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ณ‘ํ–‰์‹คํ–‰์„ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์กฐ๊ฑด๋ณ€์ˆ˜์— wait()๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅ
  • ์ฆ‰, ํ”„๋กœ์„ธ์Šค๊ฐ€ preemption ์œ„์น˜๋ฅผ ์Šค์Šค๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋œปํ•จ

alt text

semaphore์™€ monitor ์กฐ๊ฑด ๋ณ€์ˆ˜ ๋น„๊ต

Condition Variable ์‚ฌ์šฉ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ

  • ์กฐ๊ฑด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ: signal ํ›„ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์ˆœ์„œ

ํ”„๋กœ์„ธ์Šค P๊ฐ€ x.signal()์„ ํ˜ธ์ถœํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค Q๊ฐ€ x.wait()์—์„œ ์ผ์‹œ ์ค‘๋‹จ๋œ ์ƒํƒœ์ผ ๋•Œ, ๋‹ค์Œ์— ๋ฌด์—‡์ด ์ผ์–ด๋‚˜์•ผ ํ• ๊นŒ?

โœ…๊ฐ€๋Šฅํ•œ ์˜ต์…˜:

  1. signal and Wait: P๋Š” Q๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๋– ๋‚˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์กฐ๊ฑด ๋ณ€์ˆ˜์—์„œ ๋Œ€๊ธฐํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
  2. Signal and Continue: Q๋Š” P๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๋– ๋‚˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์กฐ๊ฑด ๋ณ€์ˆ˜์—์„œ ๋Œ€๊ธฐํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
  3. Concurrent Pascal ๋ฐฉ์‹: P๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ธ ํ›„ ์ฆ‰์‹œ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๋– ๋‚˜๊ณ , Q๊ฐ€ ์žฌ๊ฐœ๋จ

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

Signal-and-Wait ๊ตฌํ˜„

alt text

  • Semaphore:
    • mutex: ๋ชจ๋‹ˆํ„ฐ ์ง„์ž…์„ ์ œ์–ดํ•˜๋Š” ์„ธ๋งˆํฌ์–ด, ์ดˆ๊ธฐ๊ฐ’ 1(binary semaphore)
    • next: Condition variable์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ธ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ์„ธ๋งˆํฌ์–ด, ์ดˆ๊ธฐ๊ฐ’ 0
    • x.sem: Condition variable x์— ๋Œ€ํ•ด ๋Œ€๊ธฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ์„ธ๋งˆํฌ์–ด, ์ดˆ๊ธฐ๊ฐ’ 0
  • Counter:
    • x.count: ์กฐ๊ฑด ๋ณ€์ˆ˜ x์— ๋Œ€ํ•ด ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ˆ˜
    • next_count: next ์„ธ๋งˆํฌ์–ด์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ˆ˜

alt text

  • Condition variable x
    • x.sem: ์กฐ๊ฑด ๋ณ€์ˆ˜์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ธ”๋ก/์–ธ๋ธ”๋กํ•˜๋Š” ์„ธ๋งˆํฌ์–ด
    • x.count: ํ˜„์žฌ ์ด ์กฐ๊ฑด ๋ณ€์ˆ˜์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜

wait(next)๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋ฅผ ์‹คํ–‰ํ•œ ์Šค๋ ˆ๋“œ๋Š” ๋ˆ„๊ฐ€ ๊นจ์›Œ์ฃผ๋Š”๊ฐ€?
โ†’ ์‹œ๊ทธ๋„์„ ๋ฐ›์€ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋งˆ์น˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์กฐ๊ฑด์„ ๊ธฐ๋‹ค๋ฆด ๋•Œ

  1. ์กฐ๊ฑด ๋ณ€์ˆ˜ x์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ธ ํ”„๋กœ์„ธ์Šค A๋Š” ๋Œ€๊ธฐ ์ƒํƒœ
  2. ์‹ ํ˜ธ๋ฅผ ๋ฐ›์€ ํ”„๋กœ์„ธ์Šค B๊ฐ€ ๊นจ์–ด๋‚˜์„œ ์‹คํ–‰๋จ
  3. ํ”„๋กœ์„ธ์Šค A๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋‹ค์‹œ ๊นจ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค:
    1. ํ”„๋กœ์„ธ์Šค B๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๋– ๋‚  ๋•Œ (signal(next))
    2. ํ”„๋กœ์„ธ์Šค B๊ฐ€ ๋‹ค๋ฅธ ์กฐ๊ฑด ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋  ๋•Œ (x.wait())

Resuming Processes withing a Monitor


์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ condition variable x์—์„œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๊ณ , x.signal()d์ด ์‹คํ–‰๋  ๋•Œ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žฌ๊ฐœ๋˜์–ด์•ผ ํ• ๊นŒ?

FCFS ๋ฐฉ์‹์ด ๋ฌด์กฐ๊ฑด ์ ์ ˆํ•˜์ง€๋Š” ์•Š๋‹ค!

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด ์กฐ๊ฑด๋ถ€ ๋Œ€๊ธฐ(conditional-wait) ๋„์ž…

Coditional Wait

1
x.wait(c)
  • ์—ฌ๊ธฐ์„œ c๋Š” priority number
  • ๋‚ฎ์€ ๋ฒˆํ˜ธ = ๋†’์€ ์šฐ์„ ์ˆœ์œ„

Single Resource Allocation

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ํ•˜๋‚˜์˜ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ๋ฐฐ๋ถ„ํ•˜๋Š” ๋ฌธ์ œ

์šฐ์„ ์ˆœ์œ„ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์›์„ ์‚ฌ์šฉํ•  ๊ณ„ํš์ธ ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ์ง€์ •ํ•จ์œผ๋กœ์จ ๊ฒฝ์Ÿํ•˜๋Š”, ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๋‹จ์ผ ์ž์›์„ ํ• ๋‹น

  • ๊ธฐ๋ณธ ์‚ฌ์šฉ ํŒจํ„ด:
1
2
3
4
5
R.acquire(t);
...
access the resource;
...
R.release;
  • R: ResourceAllocator ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค
  • t: ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„

  • ResourceAllocator ๊ตฌํ˜„ ์ฝ”๋“œ:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
monitor ResourceAllocator
{
    boolean busy;
    condition x;
    
    void acquire(int time) {
        if (busy)
            x.wait(time);
        busy = true;
    }
    
    void release() {
        busy = false;
        x.signal();
    }
    
    initialization code() {
        busy = false;
    }
}
  1. ์ƒํƒœ ๋ณ€์ˆ˜:
    • boolean busy: ์ž์›์ด ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€
    • condition x: ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์˜ ๋Œ€๊ธฐ์—ด์„ ๊ด€๋ฆฌํ•˜๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜
  2. acquire(int time):
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์š”์ฒญํ•  ๋•Œ ํ˜ธ์ถœ
    • time: ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์šฐ์„ ์ˆœ์œ„
    • ์ž์›์ด ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ฉด (busy = true), ํ”„๋กœ์„ธ์Šค๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜ x์—์„œ ๋Œ€๊ธฐ
    • ์ž์›์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉด (busy = false), ์ฆ‰์‹œ ์ž์›์„ ํ• ๋‹น๋ฐ›๊ณ  busy๋ฅผ true๋กœ ์„ค์ •
  3. releasea():
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์› ์‚ฌ์šฉ์„ ๋งˆ์น˜๋ฉด ํ˜ธ์ถœ
    • busy๋ฅผ false๋กœ ์„ค์ •ํ•˜์—ฌ ์ž์›์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ์„ ํ‘œ์‹œ
    • x.signal()์„ ํ˜ธ์ถœ โ†’ ์กฐ๊ฑด ๋ณ€์ˆ˜ x์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ค‘ ํ•˜๋‚˜(๊ฐ€์žฅ ๋‚ฎ์€ time ๊ฐ’์„ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค)๋ฅผ ๊นจ์šด๋‹ค
  4. ์ดˆ๊ธฐํ™” ์ฝ”๋“œ:
    • ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ busy๋ฅผ false๋กœ ์ดˆ๊ธฐํ™”

Liveness


๐Ÿ“šLiveness: ์‹œ์Šคํ…œ์ด ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ

  • liveness failure ์ƒํƒœ๋„ ์žˆ๋‹ค โ†’ ๋ฌดํ•œ ๋Œ€๊ธฐ(Indefinite Waiting)

Deadlock

๐Ÿ“šDeadlock: ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ค‘ ํ•˜๋‚˜๋งŒ์ด ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฌดํ•œ์ • ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ

โœ…์˜ˆ์‹œ:

1
2
3
4
5
6
7
8
Let S and Q be two semaphores initialized to 1

Pโ‚€                      Pโ‚
wait(S);                wait(Q);
wait(Q);                wait(S);
...                     ...
signal(S);              signal(Q);
signal(Q);              signal(S);
  1. Pโ‚€๊ฐ€ wait(S)๋ฅผ ์‹คํ–‰ํ•˜๊ณ , Pโ‚์ด wait(Q)๋ฅผ ์‹คํ–‰
  2. Pโ‚€๊ฐ€ wait(Q)๋ฅผ ์‹คํ–‰ํ•˜๋ ค ํ•˜์ง€๋งŒ, Q๋Š” Pโ‚์ด ์ด๋ฏธ ํš๋“ํ–ˆ์œผ๋ฏ€๋กœ Pโ‚€๋Š” Pโ‚์ด signal(Q)๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผํ•จ
  3. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, Pโ‚์ด wait(S)๋ฅผ ์‹คํ–‰ํ•˜๋ ค ํ•˜์ง€๋งŒ, S๋Š” Pโ‚€์ด ์ด๋ฏธ ํš๋“ํ–ˆ์œผ๋ฏ€๋กœ Pโ‚์€ Pโ‚€๊ฐ€ signal(S)๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผํ•จ
  4. ๊ฒฐ๊ตญ, Pโ‚€๋Š” Pโ‚์ด Q๋ฅผ ํ•ด์ œํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ , Pโ‚์€ Pโ‚€๊ฐ€ S๋ฅผ ํ•ด์ œํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ!
  5. signal() ์—ฐ์‚ฐ์€ ์ ˆ๋Œ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋‘ ํ”„๋กœ์„ธ์Šค๋Š” deadlock

Starvation

๐Ÿ“šStarvation: ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ ์ž์›์„ ์–ป์ง€ ๋ชปํ•˜๊ณ  ๋ฌดํ•œํžˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ

Priority Inversion

๐Ÿ“šPriority Inversion: ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋†’์€ ์šฐ์„ ์ˆœ์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฝ์„ ๋ณด์œ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š”, ์Šค์ผ€์ค„๋ง ๋ฌธ์ œ

โœ…๋ฌธ์ œ ๋ฐœ์ƒ ์ƒํ™ฉ ์˜ˆ์‹œ:

  1. ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ”„๋กœ์„ธ์Šค P1์ด ์ž์› R์„ ์š”์ฒญ
  2. ์ž์› R์€ ์ด๋ฏธ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ”„๋กœ์„ธ์Šค P3๊ฐ€ ์‚ฌ์šฉ ์ค‘
  3. P1์€ P3๊ฐ€ ์ž์›์„ ํ•ด์ œํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
  4. ์ค‘๊ฐ„ ์šฐ์„ ์ˆœ์œ„์˜ ํ”„๋กœ์„ธ์Šค P2๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์ง€๋ฉด, P2๊ฐ€ P3๋ฅผ ์„ ์ 
  5. P2(๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„)๊ฐ€ ๊ฐ„์ ‘์ ์œผ๋กœ P1(๋†’์€ ์šฐ์„ ์ˆœ์œ„)์ด ์ž์›์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ด

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” Priority Ingeritance Protocol๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

Priority Ingeritance Protocol


๐Ÿ“šPriority Ingeritance Protocol: ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ ๋†’์€ ์šฐ์„ ์ˆœ์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ทธ ์ž์›์„ ์š”์ฒญํ•˜๋ฉด, ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ์ผ์‹œ์ ์œผ๋กœ ๋†’์€ ์šฐ์„ ์ˆœ์œ„ ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค

alt text

  1. P3๊ฐ€ ์ž์› R์„ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ P1์ด R์„ ์š”์ฒญํ•˜๋ฉด, P3๋Š” P1์˜ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค
  2. ๊ทธ๋Ÿฌ๋ฉด P2๋Š” ๋” ์ด์ƒ P3๋ฅผ ์„ ์ ํ•  ์ˆ˜ ์—†๋‹ค
  3. P3๋Š” ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ์‹คํ–‰์„ ๊ณ„์†ํ•จ โ†’ ์ž์› R์„ ๋น ๋ฅด๊ฒŒ ํ•ด์ œ ๊ฐ€๋Šฅ
  4. P3๊ฐ€ ์ž์›์„ ํ•ด์ œํ•˜๋ฉด, P3๋Š” ์›๋ž˜์˜ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋กœ ๋Œ์•„๊ฐ€๊ณ  P1์€ R์„ ํš๋“ํ•˜์—ฌ ์‹คํ–‰
This post is licensed under CC BY 4.0 by the author.