Skip to content

Latest commit

ย 

History

History
447 lines (316 loc) ยท 13.4 KB

Process_Synchronization.md

File metadata and controls

447 lines (316 loc) ยท 13.4 KB

ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”(Process Synchronization)

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋™์‹œ์— critical section์— ์ง„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.

ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ

critical section(์ž„๊ณ„ ๊ตฌ์—ญ)์€ ์ฝ”๋“œ ์ƒ์—์„œ race condition์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค

race condition(๊ฒฝ์Ÿ ์ƒํƒœ)๋ž€ ๋‘ ๊ฐœ ์ด์ƒ์˜ concurrentํ•œ ํ”„๋กœ์„ธ์Šค(ํ˜น์€ ์Šค๋ ˆ๋“œ)๋“ค์ด ํ•˜๋‚˜์˜ ์ž์›(๋ฆฌ์†Œ์Šค)์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ์Ÿํ•˜๋Š” ์ƒํƒœ


ํ”„๋กœ๊ทธ๋žจ์  ํ•ด๊ฒฐ๋ฒ•์˜ ์ถฉ์กฑ ์กฐ๊ฑด

  1. Mutal Exclusion(์ƒํ˜ธ ๋ฐฐ์ œ)

์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์„ ์ˆ˜ํ–‰ ์ค‘์ด๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋“ค์€ critical section์— ์ง„์ž…ํ•  ์ˆ˜ ์—†๋‹ค.

  1. Progress

์•„๋ฌด๋„ critical section์— ์—†์„ ๊ฒฝ์šฐ critical section์— ๋“ค์–ด๊ฐ€๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๋“ค์–ด๊ฐ€๊ฒŒ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

  1. Bounded Waiting(์œ ํ•œ ๋Œ€๊ธฐ)

crtical section์— ๋“ค์–ด๊ฐ€๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๋Œ€๊ธฐ์‹œ๊ฐ„์ด ์œ ํ•œ์ ์ด์–ด์•ผ ํ•œ๋‹ค.

  • ์ฆ‰, ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ๋“ค์–ด๊ฐ€๊ธฐ ์œ„ํ•ด ๋ฌดํ•œ๋Œ€๊ธฐ๋ฅผ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

Synchronization Algorithm

Algorithm 1

๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค P_i, P_j๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

Synchronization variable

int turn;
intially turn=0; -> turn==i๋ฉด P_i๋Š” critical section์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค

P_i's code

do{
    while(turn!=i); // my turn?
    critical section
    turn =j;        // now it's your turn
    remainder section
}while(1);

Mutual exclusion์€ ๋งŒ์กฑํ•˜์ง€๋งŒ progress๋Š” ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ๋‹ค.

๋ฐ˜๋“œ์‹œ ํ•œ ๋ฒˆ์”ฉ ๊ต๋Œ€๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋” ์ž์ฃผ critical section์— ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค๋ฉด ๋Œ€๊ธฐ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Algorithm 2

๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค P_i, P_j๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

Synchronization variable

boolean flag[2]; -> ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ๋“ค์–ด๊ฐˆ ์ง€ ๊ฒฐ์ • intially falg[all]=false; -> ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋„ critical section์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์Œ

  • flag[i]==true๋ฉด Pi๋Š” critical section์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

P_i's code

do{
    flag[i]=true;      // critical section ์ง„์ž… ์š”๊ตฌ
    while(flag[j]);    // P_j์˜ flag ํ™•์ธ
    critical section
    flag[i]=false;     // crtical section ์ข…๋ฃŒ 
    remainder section
}while(1);

Mutual exclusion์€ ๋งŒ์กฑํ•˜์ง€๋งŒ progress๋Š” ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ๋‹ค.

flag[i], flag[j]๊ฐ€ ๋ชจ๋‘ true๋ผ๋ฉด ๋‘ ํ”„๋กœ์„ธ์Šค ๋ชจ๋‘ critical section์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๊ณ  ๋Š์ž„์—†์ด ๋Œ€๊ธฐํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

Algorithm 3(Peterson's Algorithm)

์œ„์˜ ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•ฉ์นœ ๋ฐฉ๋ฒ•์œผ๋กœ turn, flag ๋ณ€์ˆ˜ ๋ชจ๋‘ ์‚ฌ์šฉํ•œ๋‹ค.

P_i's code

do{
    flag[i]=ture;     // critical section ์ง„์ž… ์š”๊ตฌ
    turn=j;           // ์ƒ๋Œ€๋ฐฉ turn์œผ๋กœ ๋ณ€๊ฒฝ
    while(flag[j]&&turn==j);   // ์ƒ๋Œ€๋ฐฉ์˜ turn์ด๊ณ , ์ƒ๋Œ€๋ฐฉ์ด critical section ์ง„์ž…์„ ์š”๊ตฌํ•˜๋ฉด ๋Œ€๊ธฐํ•œ๋‹ค
    critical section
    flag[i]=false;
    remainder section
}while(1);

Mutual Exclusion, Progress, Bounded Waiting์„ ๋ชจ๋‘ ๋งŒ์กฑํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ณ„์† CPU์™€ Memory๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ critical section ์ง„์ž…์„ ๋Œ€๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— Busy Waiting(spin lock)์ด ๋ฐœ์ƒํ•œ๋‹ค

Synchronization Hardware

ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ Test & Modify๋ฅผ atomicํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์•ž์˜ ๋ฌธ์ œ๋“ค์„ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

atomic hardware instruction์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” Test_and_set ๋“ฑ์ด ์žˆ๋‹ค.

์ด์ „๊นŒ์ง€์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ์„ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์—ˆ์ง€๋งŒ, Test_and_set ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ฉด์„œ ์“ฐ๋Š” ๊ฒƒ๊นŒ์ง€ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ๋™์‹œ์— ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ lock์„ ๊ฑธ๊ณ  ํ’€ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ด๊ณผ ๋™์‹œ์— lock์„ ๊ฑด๋‹ค

Synchronization variable

boolean lock=false;

P_i's code

do{
    while(Test_and_Set(lock));   // ์ด๋ฏธ lock์ด ๊ฑธ๋ ค์žˆ๋Š”์ง€ ํ™•์ธ 
    critical section
    lock=false;
    remainder section
}while(1);

Semaphores

์„ธ๋งˆํฌ์–ด(Semaphores)๋Š” Busy Waiting์ด ํ•„์š” ์—†๋Š” ๋™๊ธฐํ™” ๋„๊ตฌ์ด๋ฉฐ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ critical section์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” signaling ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

์•ž์˜ ๋ฐฉ์‹๋“ค์„ ์ถ”์ƒํ™”ํ•จ์œผ๋กœ์จ lock์ด๋‚˜ ๊ณต์œ ์ž์› counting์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.


๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ํš๋“ํ•˜๋Š” ์—ฐ์‚ฐ P(S)

P(S){
    while(S<=0 do no-ops);
    S--;
}

์ž์› S๊ฐ€ ์–‘์ˆ˜๋ผ๋ฉด ์ž์›์„ ํ• ๋‹น๋ฐ›๊ณ  ์ž์›์˜ ๊ฐœ์ˆ˜ ๊ฐ์†Œ

๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋‚ฉํ•˜๋Š” ์—ฐ์‚ฐ V(S)

V(S){
    S++;
}

Synchronization variable

semaphore mutex; -> intially 1: 1๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

P_i's code

do{
    P(mutex);        
    critical section
    V(mutex);
    remainder section
}while(1);

๋Œ€๊ธฐํ•˜๋Š” ๊ณผ์ •์—์„œ Busy Waiting์˜ ๋ฐœ์ƒ์œผ๋กœ ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Block & Wakeup ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

Block & Wakeup

Block

  • ์ปค๋„์€ block์„ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ suspend ์‹œํ‚ด
  • ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ semaphore์— ๋Œ€ํ•œ wait queue์— ์‚ฝ์ž…
    wakeup(P)
  • block๋œ ํ”„๋กœ์„ธ์Šค์˜ P๋ฅผ wakeup ์‹œํ‚ด
  • ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ ready queue์— ์‚ฝ์ž…

์„ธ๋งˆํฌ์–ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜

typedef struct{
    int value;      // ์„ธ๋งˆํฌ์–ด ๋ณ€์ˆ˜
    struct process *L;   // block๋œ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ๋Œ€๊ธฐ Queue
}semaphore

P(S)

void P(semaphore S){
    S.value--;
    if(S.value<0){
        add this process to S.L;  // block queue์— ์ถ”๊ฐ€
        block();   // ์ž์›์ด ์—†๋‹ค๋ฉด block ์ƒํƒœ๋กœ ์ง„์ž…
    }
}

V(S)

void V(semaphore S){
    S.value++;
    if(S.value<=0){
        remove a process P from S.L;
        wakeup(P);  // ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์›Œ์คŒ
    }
}

S.value++ ๋กœ ์ž์›์„ ๋‚ด๋†“์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž์›์ด 0์ดํ•˜๋ผ๋ฉด ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.


Block & Wakeup overhead VS critical section ๊ธธ์ด

  • critical section์˜ ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒฝ์šฐ block & Wakeup์ด ์ ๋‹น
  • critical section์˜ ๊ธธ์ด๊ฐ€ ๋งค์šฐ ์งง์€ ๊ฒฝ์šฐ block & wakeup ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ busy-wait ์˜ค๋ฒ„ํ—ค๋“œ๋ณด๋‹ค ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” block & wakeup์ด ๋” ์ข‹๋‹ค

์„ธ๋งˆํฌ์–ด์—๋Š” ๋‘ ๊ฐ€์ง€์˜ ํƒ€์ž…์ด ์กด์žฌํ•˜๋Š”๋ฐ

  1. Counting semaphore
    • ๋„๋ฉ”์ธ์ด 0 ์ด์ƒ์ธ ์ž„์˜์˜ ์ •์ˆ˜๊ฐ’
    • ์ฃผ๋กœ resources counting์— ์‚ฌ์šฉ๋œ๋‹ค.
  2. Binary semaphore(mutex)
    • bool ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค
    • ์ฃผ๋กœ mutual exclusion(lock/unlock)์— ์‚ฌ์šฉ๋œ๋‹ค.

Classical Problems of Synchronization

1. Producer-Consumer Problem(Bounded-Buffer Problem)

Producer-Buffer-Consumer ๊ตฌ์กฐ์ผ ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ 

์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ 

  1. ๋‘˜ ์ด์ƒ์˜ ์ƒ์‚ฐ์ž๊ฐ€ ๋น„์–ด์žˆ๋Š” ๋ฒ„ํผ์— ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ
  2. ๋‘˜ ์ด์ƒ์˜ ์†Œ๋น„์ž๊ฐ€ ๋™์ผํ•œ ๋ฒ„ํผ์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ฒ„ํผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ๋ฝ์„ ๊ฑธ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  1. ๋ฒ„ํผ๊ฐ€ ๊ฝ‰ ์ฐฌ ๊ฒฝ์šฐ
    • ์ƒ์‚ฐ์ž๋Š” ์†Œ๋น„์ž๊ฐ€ ๋ฒ„ํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์–ด์žˆ๋Š” ๋ฒ„ํผ๊ฐ€ ์ƒ๊ธธ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  2. ๋ฒ„ํผ๊ฐ€ ๋ชจ๋‘ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ
    • ์†Œ๋น„์ž๋Š” ์ƒ์‚ฐ์ž๊ฐ€ ๋น„์–ด์žˆ๋Š” ๋ฒ„ํผ์— ์ƒ์‚ฐ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

Synchronization variable

mutual exclusion: binary semaphore
resource count: integer semaphore(full/empty ๋ฒ„ํผ์˜ ๊ฐœ์ˆ˜)
semaphore full=0, empty=n, mutex=1(lock)

Producer

do{
produce an item in x
P(empty);   // ๋นˆ ๋ฒ„ํผ๊ฐ€ ์žˆ์œผ๋ฉด ํš๋“ ์—†์œผ๋ฉด wait
P(mutex);   // lock
...
add x to buffer  // ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
...
V(mutex);   // unlock
V(full);    // full buffer count++
}while(1);

Consumer

do{
    P(full);  // ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฒ„ํผ๊ฐ€ ์žˆ์œผ๋ฉด ํš๋“ ์—†์œผ๋ฉด wait
    P(mutex); // lock
    ...
    remove an item from buffer to y  // ๋ฐ์ดํ„ฐ ์ถ”์ถœ
    ...
    V(mutex); // unlock
    V(empty); // empty buffer count++
    ...
    consume the item in y 
    ...
}while(1);

2. Readers-Writers Problem

ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด write ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋–„ ๋‹ค ๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋˜๊ณ  read ์ž‘์—…์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฌธ์ œ


solution

  • writer๊ฐ€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ํ—ˆ๊ฐ€๋ฅผ ์–ป๋”” ๋ชปํ•œ ์ƒํƒœ์—์„œ๋Š” ๋Œ€๊ธฐ์ค‘์ธ reader๋“ค์„ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ—ˆ๊ฐ€ํ•œ๋‹ค
  • writer๋Š” ๋Œ€๊ธฐ์ค‘์ธ reader๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋œ๋‹ค
  • writer๊ฐ€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์ค‘์ด๋ฉด reader๋“ค์€ ์ ‘๊ทผ์ด ๊ธˆ์ง€๋œ๋‹ค
  • writer๊ฐ€ ๋ฐ์ดํ„ฐ์— ๋น ์ ธ๋‚˜๊ฐ€์•ผ๋งŒ reader๋“ค์˜ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋œ๋‹ค

Synchronization variable

shared data

  • int readcount=0, data semaphore mutex=1, db=1
  • db: ๊ณต์œ  data์— ๋Œ€ํ•œ lock/unclok
  • mutex: ๊ณต์œ ๋ณ€์ˆ˜ readcount์— ๋Œ€ํ•œ lock/unlock

writer

do{
    P(db);   // reader๊ฐ€ ์—†๋‹ค๋ฉด lock
    ...
    writing data is perforemd
    ...
    V(db);   // unlock
}while(1);

Reader

do{ 
    P(mutex);     // readcount lock
    readcount++;
    if(readcount==1) P(db);  // ์ตœ์ดˆ์˜ reader๋ผ๋ฉด data lock 
    V(mutex);     // readcount unlcok
    ...
    reading data is performed
    ...
    P(mutex);     // readcount lock
    readcount--;
    if(readcount==0) V(db);  // ๋งˆ์ง€๋ง‰ reader๋ผ๋ฉด data unlock
    V(mutex);     // readcount unlock
}while(1);

๊ณ„์†ํ•ด์„œ writer๋‚˜ reader๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ ํ•œ ์ชฝ์ด ๊ณ„์† ๋Œ€๊ธฐํ•˜๋Š” starvation์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค

ํ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ฑฐ๋‚˜ timer๋ฅผ ํ†ตํ•ด write์™€ read๋ฅผ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


3. Dining-Philosophers Problem

5๋ช…์˜ ์ฒ ํ•™์ž๊ฐ€ ์›ํƒ์— ๋‘˜๋Ÿฌ์•‰์•„์žˆ๊ณ , 5๊ฐœ์˜ ์ “๊ฐ€๋ฝ์ด ์žˆ๋‹ค

  • ์ฒ ํ•™์ž๋Š” ๋‘ ๊ฐ€์ง€ ํ–‰๋™์„ ํ•  ์ˆ˜ ์žˆ*๋‹ค
    1. ์‹์‚ฌ
    2. ์ƒ๊ฐ

Synchronization variables

semaphore chopstick[5];

  • intially all values are 1
do{
    P(chopstick[i]);      // ์™ผ์ชฝ ์ “๊ฐ€๋ฝ์„ ์žก๋Š”๋‹ค
    P(chopstick[(i+1)%5]);  // ์˜ค๋ฅธ์ชฝ ์ “๊ฐ€๋ฝ์„ ์žก๋Š”๋‹ค
    ...
    eat();
    ...
    V(chopstick[i]);      // ์™ผ์ชฝ ์ “๊ฐ€๋ฝ์„ ๋‚ด๋ ค๋†“๋Š”๋‹ค
    V(chopstick[(i+1)%5]); // ์˜ค๋ฅธ์ชฝ ์ “๊ฐ€๋ฝ์„ ๋‚ด๋ ค๋†“๋Š”๋‹ค
    ...
    think();
    ...
}while(1);

์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด ๋งค์šฐ ์œ„ํ—˜ํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

Deadlock์˜ ๊ฐ€๋Šฅ์„ฑ
๋ชจ๋“  ์ฒ ํ•™์ž๊ฐ€ ๋™์‹œ์— ๋ฐฐ๊ฐ€ ๊ณ ํŒŒ์„œ ์™ผ์ชฝ ์ “๊ฐ€๋ฝ์„ ์ง‘์€ ๊ฒฝ์šฐ

  • ๋‹ค๋ฅธ ์ฒ ํ•™์ž๊ฐ€ ์˜ค๋ฅธ์ชฝ ์ “๊ฐ€๋ฝ์„ ์ง‘์„ ์ˆ˜ ์—†๋‹ค.

solution

  1. 4๋ช…์˜ ์ฒ ํ•™์ž๋งŒ์ด ํ…Œ์ด๋ธ”์— ๋™์‹œ์— ์•‰์„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  2. ์ “๊ฐ€๋ฝ์„ ๋‘ ๊ฐœ ๋ชจ๋‘ ์ง‘์„ ์ˆ˜ ์žˆ์„ ๋•Œ์—๋งŒ ์ “๊ฐ€๋ฝ์„ ์ง‘์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค
  3. ์ง์ˆ˜/ํ™€์ˆ˜ ์ฒ ํ•™์ž๋Š” ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ์ “๊ฐ€๋ฝ์„ ๋จผ์ € ์ง‘๋„๋ก ํ•œ๋‹ค.

์„ธ๋งˆํฌ์–ด์˜ ๋ฌธ์ œ์ 

  1. ์ฝ”๋”ฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๊ณ 
  2. ์ •ํ™•์„ฑ์„ ์ž…์ฆํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค
  3. ์ž๋ฐœ์  ํ˜‘๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค
  4. ํ•œ๋ฒˆ์˜ ์‹ค์ˆ˜๊ฐ€ ๋ชจ๋“  ์‹œ์Šคํ…œ์— ์น˜๋ช…์  ์˜ํ–ฅ

V(mutex)์™€ P(mutex)์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ deadlock์ด ์ƒ๊ธฐ๊ฑฐ๋‚˜ mutual exclusion์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค.

Monitor

Monitor(๋ชจ๋‹ˆํ„ฐ)๋Š” ์ด๋Ÿฌํ•œ ์„ธ๋งˆํฌ์–ด์˜ ๋‹จ์ ์„ ๋ณด์•ˆํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ

  1. ๋™์‹œ ์ˆ˜ํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์—์„œ ์ถ”์ƒ ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „ํ•œ ๊ณต์œ ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ High-level ๋™๊ธฐํ™” ๊ตฌ์กฐ์ด๋‹ค.
  2. ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋‹ˆํ„ฐ ๋‚ด๋ถ€ procedure๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. lock์„ ๊ฑธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋ชจ๋‹ˆํ„ฐ์˜ ๊ตฌ์กฐ

  1. ๊ณต์œ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  2. ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์‹œ์ €(Precedure)
  3. ํ˜„์žฌ ํ˜ธ์ถœ๋œ ํ”„๋กœ์‹œ์ €๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ์บก์Šํ™”ํ•œ ๋ชจ๋“ˆ(module)

ํ”„๋กœ์„ธ์Šค๋Š” ์˜ค์ง ๋ชจ๋‹ˆํ„ฐ ๋‚ด๋ถ€์˜ ํ”„๋กœ์‹œ์ €๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ๋งŒ ๋ชจ๋‹ˆํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค

๋ชจ๋‹ˆํ„ฐ์— ์ ‘๊ทผ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์€ ๋ชจ๋‹ˆํ„ฐ ํ(Monitor Queue)์—์„œ ๋Œ€๊ธฐํ•œ๋‹ค.

  • ์ด ๋•Œ ์กฐ๊ฑด๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค

์กฐ๊ฑด ๋ณ€์ˆ˜๋Š” ์–ด๋–ค ๊ฐ’์„ ๊ฐ€์ง€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ์„ธ์Šค๋ฅผ sleep ํ˜น์€ wakeup ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค


์กฐ๊ฑด ๋ณ€์ˆ˜๋Š” ์˜ค์ง wait์™€ signal ์—ฐ์‚ฐ์— ์˜ํ•ด์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค

๋ฉด์ ‘ ์งˆ๋ฌธ

1. ์„ธ๋งˆํฌ์–ด(semaphore)๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ณต์œ ๋œ ์ž์›์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ์ถ”์ƒ ๋ฐ์ดํ„ฐ.

  • ์„ธ๋งˆํฌ์–ด์˜ ๊ฐ’์€ ์ž์›์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ„๋‹จํ•œ ์นด์šดํ„ฐ์ด๋‹ค.

2. ๋ฎคํ…์Šค(mutex)๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ƒํ˜ธ๋ฐฐ์ œ๋ผ๊ณ ๋„ ํ•˜๋ฉฐ crtical section์„ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ์˜ runnig time์ด ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ๊ฐ๊ฐ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ .

  • ํ”„๋กœ์„ธ์Šค๋Š” ์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์Šค๋ ˆ๋“œ๋Š” ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

3. ์„ธ๋งˆํฌ์–ด์™€ ๋ฎคํ…์Šค์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ๋™๊ธฐํ™” ๋Œ€์ƒ์˜ ๊ฐœ์ˆ˜์ด๋‹ค

  • ๋ฎคํ…์Šค๋Š” ๋Œ€์ƒ์ด ํ•˜๋‚˜
  • ์„ธ๋งˆํฌ์–ด๋Š” ๋Œ€์ƒ์ด ํ•˜๋‚˜ ์ด์ƒ์ผ ๋•Œ

์ฐธ๊ณ )

  • KOCW ๊ณต๊ฐœ๊ฐ•์˜ (2014-1. ์ดํ™”์—ฌ์ž๋Œ€ํ•™๊ต - ๋ฐ˜ํšจ๊ฒฝ)