[์ด์์ฒด์ ] ํ๋ก์ธ์ค ๋๊ธฐํ, Race Condition, Critical Section
์ฌ๋ฌ ํ๋ก์ธ์ค, ์ค๋ ๋๊ฐ ๋์ํ๋ค ๋ณด๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ์๋ฐ์ ์๋ค. ์ด์์ฒด์ ์์๋ ์ด๋ฌํ ์ถฉ๋์ ๋ํด์ ํด๊ฒฐํ ์ ์๋ ์์คํ ์ ๊ตฌ์ถํด ๋์๋ค.
๋จผ์ ๋๊ธฐํ๋ฅผ ์ดํดํ๊ธฐ ์ํ ์ค์ํ ์ฉ์ด๋ถํฐ ์ดํด๋ณด์.
Some Key Terms in Concurrency
- Race Condition
- ๋ฉํฐ ํ๋ก์ธ์ค๋ ์ค๋ ๋๊ฐ ๋์์ ๊ฐ์ ๊ณต์ ์์์ ์ ๊ทผํ๋ ์ํฉ
- Mutual exclusion
- ํ๋์ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์์์ ์ฐจ์งํ๊ณ ์์ผ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์ ๊ทผํ ์ ์๋ ๊ฒ
- Critical section
- ๊ณต์ ํ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ์ฝ๋ ์์ญ์ด๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ถฉ๋์ด ์ผ์ด๋ ์ ์๋ค.
- Critical Section์ด ์ํธ ๋ฐฐํ์ (mutually exclusively)์ด๊ฒ ์คํ๋์ง ์๋๋ค๋ฉด, Race Condition์ด ๋ฐ์ํ ์ ์๋ค.
- Starvation
- ์ฌ์ ์ ์ธ ์๋ฏธ๋ก ๊ตถ์ฃผ๋ฆผ์ด๋ผ๋ ๋ป์ธ๋ฐ, ์ปดํจํฐ์์๋ CPU๊ฐ ์์์ ๋ฐฐ์ ํด ๋ฌ๋ผ๊ณ ์์ฒญํ์ง๋ง, ๊ทธ ์์์ด ๋ฐ๋ก ๋ฐฐ์ ๋์ง ๋ชปํ๋ ์ํฉ์ ์๋ฏธํ๋ค.
- ์ด๋, ๊ธฐ๋ค๋ฆฌ๋ ๊ธฐ๊ฐ์ ๋ฐ๋ก ์ง์ ๋ผ์์ง ์์ง๋ง, ๋ณดํต ์ํฉ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ฉด Starvation์ด๋ผ๊ณ ํ๋ค.
- DeadLock
- ์์ํ Starvation์ธ ์ํฉ, ์ฆ ์์์ด ์์ํ ๋ฐฐ์ ๋์ง ์๋๋ค.
- ์ด๋ฐ ์ํฉ์์๋ ํ๋ก์ธ์ค๋ผ๋ฆฌ๋ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ ์ปดํจํฐ ๊ด๋ฆฌ์๊ฐ ํด๊ฒฐํด์ฃผ์ด์ผ ํ๋ค.
Difficulties of Concurrency
void echo() {
chin = getchar();
chout = chin;
putchar(chout);
}
์์ ๊ฐ์ ์ฝ๋์์ _chin_๊ณผ _chout_์ด ๊ณต์ ์์์ด๋ผ๊ณ ๊ฐ์ ํด ๋ณด์. ๊ทธ๋ฆฌ๊ณ ๋ฉํฐ ํ๋ก์ธ์์ธ ์ํฉ์์ ๊ฐ CPU๊ฐ ๊ฐ์ ํ๋์ ํ๋ก์ธ์ค๋ฅผ ๋ด๋นํ๋ค๊ณ ์๊ฐํ์.
์ด๋, ๋ ํ๋ก์ธ์ค ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ๋ค. ์ด์ ์ด๋ค ๊ณผ์ ์ผ๋ก Race Condition์ด ์ผ์ด๋๋์ง ์ดํด๋ณด์.
- 1๋ฒ ํ๋ก์ธ์ค๊ฐ _chin_์ ์ํ๋ฅผ 1๋ก ๋ณ๊ฒฝ์ํจ๋ค.
- ์ด๋ 2๋ฒ ํ๋ก์ธ์ค๊ฐ _chin_์ ์ํ๋ฅผ 2๋ก ๋ณ๊ฒฝํ๋ค. ๋ฐ๋ผ์ 1์ด์๋ ์ํ๊ฐ 2๋ก ๋ณํ๋ค.
- 1๋ฒ ํ๋ก์ธ์ค๊ฐ _chout_์ _chin_์ ์ํ๋ฅผ ์ ์ฅํ๋ค. ์ด ๊ฒฝ์ฐ 2๊ฐ ์ ์ฅ๋๋ค.
- 1๋ฒ ํ๋ก์ธ์ค๋ 1์ ์ ์ฅํ ๊ฒ์ผ๋ก ์์ํ์ผ๋ 2๊ฐ ์ ์ฅ๋๋ค.(Race Condition ๋ฐ์)
Example of Race Condition
์์ ์ดํด๋ณด์๋ ์์ ๋ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์๊ฐ ์์ ๋์ Race Condition์ด ๋ฐ์ํ ์ํฉ์ด๋ค. ํ์ง๋ง, ํ๋ก์ธ์๊ฐ ํ๋์ฌ๋ Race Condition์ ์ถฉ๋ถํ ๋ฐ์ํ ์ ์๋ค.
Producer/Consumer ๊ด๊ณ์์๋ Race Condition์ด ๋ฐ์ํ๋ ๋ฐ ์ฐ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๋์ง ๋จผ์ ์ดํด๋ณด์.
Producer/Consumer ์ํฉ ์ดํด
- Producer/Consumer Problem
- ์ฌ๋ฌ ๊ฐ์ Producer ํ๋ก์ธ์ค๋ค๊ณผ ํ๋์ Consumer ํ๋ก์ธ์ค๊ฐ ํ๋์ ํ๋ก์ธ์์์ ๋์๊ฐ๋ค
- Producer๊ฐ ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด IPC์์ Shared Memory๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ์.
- Producer๋ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , Consumer ํ๋ก์ธ์ค๊ฐ ํด๋น ๋ฒํผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์ฒ๋ฆฌํ๋ค.
#define BUFFER_SIZE 10
typedef struct {
...
} item;
item b[BUFFER_SIZE];
int in = 0;
int out = 0;
int counter = 0;
_in_์ Producer๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ง์ด๋ฃ์ ์๋ฆฌ์ด๊ณ , _out_์ Consumer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋นผ์ด๋ผ ์๋ฆฌ์ด๋ค. ์ด๊ธฐ ๊ฐ์ 0์ผ๋ก ๋ ๋ค ์ธํ ๋์ด ์๋ค.
๋ฒํผ๋ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ฅ๋์ด ์๋ค. in์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๊ณ ์ธ๋ฑ์ค๊ฐ ํ๋์ฉ ์ฆ๊ฐํ๊ณ , out์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋นผ์ด๋ด์ง๋ฉฐ ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ๋ ํ ๋ฐฉ์์ผ๋ก ์งํ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฒํผ๋ฅผ circular๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
์ด๋์ Producer ์ฝ๋ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ๋ค.
item v;
while(1) {
while(counter == BUFFER_SIZE);
b[in] = v;
in = (in + 1) % BUFFER_SIZE;
counter++;
}
_counter == BUFFER_SIZE_๋ ๋ฒํผ์ ๊ฐ์ด ๋ชจ๋ ๊ฝ ์ฐฌ ๊ฒฝ์ฐ์ด๋ฏ๋ก Busy Wating ๊ธฐ๋ฒ์ ์ ์ฉํด ๋ฒํผ์ ์๋ฆฌ๊ฐ ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ฝ๋์ด๋ค.
์ด๋ ๊ฒ Producer ์ฝ๋๊ฐ ์งํ๋๋ค๊ฐ Time Slice์ ์ํด ์ด๋ ์๊ฐ Consumer์ ์ฝ๋๋ก ๋์ด๊ฐ ๊ฒ์ด๋ค. Consumer ์ฝ๋๋ ์๋์ ๊ฐ์ด ๊ตฌํ๋๋ค.
item w;
while(1) {
while(counter == 0);
w = b[out];
out = (out + 1) % BUFFER_SIZE;
counter--;
/* consume item */
}
ํ ๊ฐ์ง ์ผ๋ํด์ผ ํ ์ ์ counter๊ฐ ๊ฐ์ํ๋ค๊ณ ํด์ ์์ ์ดํด๋ณธ Producer ์ฝ๋์ Busy Wating์ด ๋ฐ๋ก ํ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ด๋ค. CPU๊ฐ ํ๋๋ผ๋ ๊ฒ์ ์ฃผ๋ชฉํ์. ์ด๋ฏธ Producer ํ๋ก์ธ์ค์์ Consumer ํ๋ก์ธ์ค๋ก ์ฎ๊ฒจ ์๋ค. ๋ฐ๋ผ์ Producer ํ๋ก์ธ์ค๋ Running์ํ๊ฐ ์๋๋ผ Ready์ํ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ๋ฉ์ถฐ์๋ค.
Producer/Consumer Race Condition
๋ฌธ์ ๊ฐ ๋๋ Ciritical Section์ ์ด๋์ผ๊น? ์์ ๊ฐ์ ์์ Producer/Consumer๊ฐ IPC ํต์ ์ผ๋ก Shared Memory ๋ฐฉ์์ ์ฌ์ฉํจ์ ๊ฐ์ ํ์๋ค. ์ถ์ธกํ ์ ์๋ ๊ฒ์ _counter_๋ณ์์ด๋ค. Producer์ Consumer ์ฝ๋ ๋ชจ๋์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ ๋ก Race Condition์ด ๋ฐ์ํ๋ ๊ณณ๋ _counter_๋ณ์๊ฐ ์ฐ์ด๋ ๊ตฌ๊ฐ์ด๋ค. ๋ฐ๋ผ์ ํด๋น ๊ตฌ๊ฐ์ atomicaly mutual exclusion ํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ฌ๊ธฐ์ ๋งํ๋ atomic ํ๋ค๋ ๊ฒ์ ํ๋์ operation์ด ๋ค๋ฅธ operation์ด ์คํ๋๋ ๋์ ์ค๋จ(interrupt)๋์ง ์์์ ๋งํ๋ค.
โป Interrupt
ํ๋์จ์ด๊ฐ CPU๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์์ ์๋ฆฌ๋ ๊ฒ์ด๋ค. ์ฌ๋ฌ ์ข ๋ฅ์ Interrupt๊ฐ ์์ผ๋ Clock Interrupt์ ๋ํด์ ์์๋ณด์.
Clock Interrupt๋ 1 millisecond๋ง๋ค ๋ฐ์ํ๋ฉฐ CPU๋ Clock Interrupt๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ปค๋๋ก Context Switch๋ฅผ ํด์ผ ํ๋์ง ๋ฌผ์ด๋ณธ๋ค. ๋ฌผ์ด๋ณด๋ ์ด์ ๋ 100 millisecond๋ง๋ค Time Slice์ ์ํด์ Context Switch๊ฐ ์ผ์ด๋์ผ ํ๋๋ฐ ์ด๋ฌํ ๊ณผ์ ์ Clock์ Interrupt๋ฅผ ํตํด ํ์ธํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Intterupt๋ ์ ๊ธฐ์ ์ธ ์ ํธ์ด๋ฉฐ Interrupt๊ฐ ๋ฐ์ํ๋ ์์ค์๋ ์ ์์ ์ธ ๋ช ๋ น์ด์ ์งํ์ด ๋ถ๊ฐ๋ฅํ๋ค.
_counter_๋ณ์๊ฐ race condition์ด ๋ฐ์ํ์ฌ ๊ฐ ํ๋ก์ธ์ค๋ง๋ค ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ํ๋ฆ์ ์ดํด๋ณด์. ์ ์์ ์ธ ํ๋ฆ์์์ _counter++_์ ๋ช ๋ น์ด๊ฐ ๊ฐ์ง๋ ์ด์ ๋ธ๋ฆฌ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
load register, counter (register <- counter)
increment register (register <- register + 1)
store register, counter (counter <- register)
๋ฉ๋ชจ๋ฆฌ ๋ด์ ๋ณ์ ๊ฐ์ ๋ ์ง์คํฐ๋ก ๊ฐ์ ธ์ ์ฐ์ฐ์ ์ํํ ๋ค ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ๋ณ์๋ก ์ ์ฅํ๋ค.
_counter--_์ ์ ์์ ์ธ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
load register, counter (register <- counter)
decrement register (register <- register -1)
store register, counter (counter <- register)
๋ง์ฐฌ๊ฐ์ง๋ก ๋์ํจ์ ์ ์ ์๋ค.
์ ์ด์ ๋น์ ์์ ์ธ ํ๋ฆ์ ํ ๋ฒ์ ์ดํด๋ณด์.
/* producer ํ๋ก์ธ์ค */
load register, counter (register <- counter = 5)
increment register (register = 6)
/* consumer ํ๋ก์ธ์ค */
load register, counter (register <- counter = 5)
decrement register (register = 4)
store register, counter (counter <- 4; register of consumer)
/* producer ํ๋ก์ธ์ค */
store register, counter (counter <- 6; register of producer)
producer ํ๋ก์ธ์ค๊ฐ ๋ช ๋ น์ด๋ฅผ ์งํํ๋ ๋์ค์ time slice์ ์ํด ์ค๋จ๋์๋ค. ๋ค์ ๋งํด _count++_ํ๋ ๊ณผ์ ์ค์ ๋๊ธด ๊ฒ์ด๋ค. register๊ฐ 6์ธ ์ํ์์ง๋ง ์ค๋จ๋์๊ธฐ ๋๋ฌธ์ PCB์ ํด๋น ๋ ์ง์คํฐ ๊ฐ์ ์ ์ฅ๋ง ํด ๋ ์ฑ Context Switch ํด์ผ ํ๋ค.
consumer ํ๋ก์ธ์ค์์๋ _counter_๋ผ๋ ๊ณต์ ๋ณ์๋ ์์ง 5๋ผ๋ ์ํ ๊ทธ๋๋ก์ด๋ค. ๊ทธ๋ฆฌ๊ณ register๋ฅผ ํตํด ์ ์์ ์ผ๋ก 4๋ก decrement ํ๋ ๋ฐ ์ฑ๊ณตํ๋ค. ๋ฐ๋ผ์ consumer๊น์ง๋ ์ ์์ ์ธ ์ํ์ ํ๋ฆ์ด๋ค.
๋ค์ producer ํ๋ก์ธ์ค๋ก Context Switch ํ๋ค. ์ฌ๊ธฐ์ ์์์น ๋ชปํ ์ํฉ์ด ๋ฐ์ํ๋๋ฐ, PCB๋ก๋ถํฐ ๋ ์ง์คํฐ ๊ฐ์ ๋ณต๊ตฌํ ๋ ์ด์ ์ ์ ์ฅํ register ์ ๋ณด ๊ฐ์ธ 6์ ๊ทธ๋๋ก ๋ถ๋ฌ์จ๋ค. ์ฆ, consumer ํ๋ก์ธ์ค๋ก ์ธํด _counter_๊ฐ์ด ๋ณ๊ฒฝ๋์์ผ๋, PCB์ ์ ์ฅ๋ ๋ ์ง์คํฐ ๊ฐ์ผ๋ก ์ธํด _counter_๊ฐ์ด 4์์ 6์ผ๋ก ๋ฐ๋๊ฒ ๋ผ๋ฒ๋ฆฐ๋ค. ์ด๋ฌํ ํ์์ _count++_์ด๋ผ๋ ๋ช ๋ น์ด์ ์ ํ ๋ถํฉํ์ง ๋ชปํ๋ ์ํฉ์ด๋ค.
๊ทธ๋ฌ๋ ์ฒ์์ 5์๊ธฐ ๋๋ฌธ์ 6์ผ๋ก ๋ณํ๋ ๊ฒ์ ๋น์ฐํ ๊ฒฐ๊ณผ ์๋๊ฐ ์๊ฐํ ์ ์๋ค. ๋ค๋ง _counter_๊ฐ ์ ์ญ์ ์ผ๋ก ๋ค๋ค์ง๋ ๋ณ์์์ ๊ณ ๋ คํด ๋ณด์. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค๊ฐ์ consumer ํ๋ก์ธ์ค๊ฐ ๋ผ์๊ธฐ ๋๋ฌธ์ _counter_๊ฐ์ 4์์ 6์ผ๋ก ๋ฐ๋์ด๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ ์ ์ฅ์์๋ 4์์ 5๋ก ๋ฐ๋ ์ค ์์๋ _counter_๊ฐ์ด ์์ํ ์ ์๋ 6์ด๋ผ๋ ๊ฐ์ผ๋ก ๋ฐ๋๋ค.
์ ๋ฆฌํ์๋ฉด ๊ณต์ ๋๋ _counter_๋ณ์๊ฐ ์๋ ์ํฉ์์ ์ฐ์ฐ์ ์ค๊ฐ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ผ์ด๋ค์๊ธฐ ๋๋ฌธ์ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ Race Condition์ด ๋ฐ์ํ๋ค๊ณ ํ ์ ์๋ค.
Race Condition in One Process
๋น์ฐํ ์ฌ๋ฌ ์ค๋ ๋์ธ ๊ฒฝ์ฐ์๋ Race Condition์ด ๋ฐ์ํ ์ ์๋ค. ๊ฒฐ๊ตญ ํ๋ก์ธ์ค ๊ฐ์ Race Condition์ด ๋ฐ์ํ๋ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ๋ฌด์์ธ๊ฐ? ๋ฐ๋ก _counter_๋ผ๋ ๊ณต์ ๋๋ ๋ณ์๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด ์๋๊ฐ.
์ค๋ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณต์ ํ๊ณ ์๋ data ์์ญ์ด ์๋ค. ๋ฐ๋ผ์ ๋น์ฐํ Race Condition์ด ๋ฐ์ํจ์ ์์ํ ์ ์๋ค.
Race Condition ์๋ฐฉํ๊ธฐ
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋ Critial Section์ Mutual Exclusion ํ๊ฒ ์คํํ๋ค. ์ด๋ฅผ ์ํด Atomic Operation์ผ๋ก ์คํํด์ผ ํ๋ค.
โป non-atomic operation
CPU๊ฐ Inttrupt Line์ ์ฒดํฌ
load register, counter
CPU๊ฐ Inttrupt Line์ ์ฒดํฌ
increment register
CPU๊ฐ Inttrupt Line์ ์ฒดํฌ
store register, counter
CPU๊ฐ Inttrupt Line์ ์ฒดํฌ
next instruction
โป atomic operation
interrupt ๋นํ์ฑํ
load register, counter
increment register
store register, counter
interrupt ํ์ฑํ
CPU๊ฐ Inttrupt Line์ ์ฒดํฌ
next instruction
๊ทธ๋ฌ๋ ์ด๋ ๊ฒ atopmic operation์ ๊ทธ๋ ๊ฒ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค. ๋ง์ฝ ๋ช ๋ น์ด๊ฐ ๋ง์ ๋ช ๋ น๋ฌธ์ ์ฒ๋ฆฌํด์ผ ํ ๋๋ ์ฑ๋ฅ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์์ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ๊ทธ ๊ธฐ๊ฐ ๋์ ์๋ฌด๋ฐ ํ๋์ ์ทจํ ์ ์๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ critical section์ fence๋ฅผ ๋๋ ๊ฒ์ด๋ค. ์ด fence์์ ๋ช ๋ น์ด๋ค์ atomicํ์ง๋ ์๋ค. ํ์ง๋ง ๊ฒฐ๋ก ์ ์ผ๋ก mutual exclusion์ ๋ณด์ฅํ๋๋ฐ, ์ด๋ Context Switch ๋๋ฉด์ fence(๋ด์ฅ)๋ฅผ ๋ซ๊ณ ๋์ค๊ธฐ ๋๋ฌธ์ด๋ค.
fence๊ฐ ์ ๊ธด ์ํ์์ Context Switch ๋๋ฉด ๋ฐ๋ ํ๋ก์ธ์ค๋ ๋ฐ๋๊ธฐ ์ ์ ํ๋ก์ธ์ค๊ฐ ์งํํ๋ critical section์์์ ์ ์ญ ๋ณ์๋ฅผ ๊ฑด๋๋ฆฌ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ์ฝ๋๊ฐ ๊ทธ๋๋ก ์งํ๋ ์ ์๊ณ , ๋ฐ๋๊ธฐ ์ด์ ์ ํ๋ก์ธ์ค๊ฐ ์์ ์ fence์์์์ ์ผ์ ์ ๋ถ ๋ง์น ํ์ fence๋ฅผ ์ด์์ ๋๊ฐ ๋์ด์์ผ ๊ฐ๋ฅํด์ง๋ค.
์ฃผ๋ก ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ์ ํธ๋๋ ํธ์ด๋ค. ์ด์ ๋ํด ์กฐ๊ธ ๋ ์์ธํ ์์๋ณด์.
The Critical Section Problem
๊ฒฐ๊ตญ, n๊ฐ์ ํ๋ก์ธ์ค๋ค์ด ๊ณต์ ์์์ ๋๊ณ ๊ฒฝ์ํ๋ ์ํฉ์ด ๋ฒ์ด์ง๋ค. ์ด๋ Race Condition์ด ๋ฐ์ํ์ง ์์์ผ ํ๋ค. ์์ Mutual Exclusion์ด ๋ณด์ฅ๋๋ ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์๋ค. ํ์ง๋ง ์ด๋ Mutual Exclusion์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ ผ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ์ผ ๋ฟ์ด์ง ์ค์ง์ ์ผ๋ก ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ด ๋ช ๊ฐ์ง ๋ ๋ถ๋๋ค. ๋ฐ๋ผ์ Critical Sectoin Ploblem์ด๋ผ๋ ์ฉ์ด๋ฅผ ํตํด ๊ทธ๋ฌํ ์กฐ๊ฑด๋ค์ ์ง์ผ์ผ ํ๋ค๋ ๊ฒ์ ํ์ด๋ด์๋ค. Critical Section Pleblem์ด๋ ๊ณต์ ์์์ ์ ๊ทผํ๋ ์ฝ๋ ์์ญ์ธ Critical Section ๋ํด์ ํ๋์ ํ๋ก์ธ์ค๊ฐ ์ด๋ฏธ ํด๋น ์์ญ์ ์๋ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์์ ์ Critical Section์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ํ๋ ๊ฒ์ ๋งํ๋ค.
Critical Section Ploblem์ ๋ง์กฑ์ํค๊ธฐ ์ํ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
- Mutual Exclusion
- ํ๋์ ํ๋ก์ธ์ค๊ฐ ์ด๋ฏธ Critical Section์ ์๋ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์์ ๋ง์ Critical Section์ ์ ๊ทผํ ์ ์๋ค.
- Progress
- ๋ง์ฝ ์๋ฌด๋ฐ ํ๋ก์ธ์ค๊ฐ Critical Section์ ์๋ค๋ฉด, ์์์ ํ๋ก์ธ์ค๋ Critical Section์ ๋ค์ด๊ฐ ์ ์์ด์ผ ํ๋ค.
- Bounded Wating
- ํ๋์ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด Critical Section์ ๊ณ์ ์ฐจ์งํจ์ผ๋ก ์ธํด ๋ฌดํ์ ์ผ๋ก ๋๊ธฐํ๋ ํ์์ด ์์ด์ผ ํ๋ค.
- ์ฌ์ค ์ ๊ฑฐ์ ๋ฐ์ํ์ง ์๋๋ค.
Software Solution
์ฝ๋ ์์ญ์์ Critical Section Ploblem์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค. ๋ฏธ๋ฆฌ ๋งํด๋์ง๋ง, ์ด๋ ๊ฒ ์ํํธ์จ์ด์ ์ธ ์์ญ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์ข์ง ์์ผ๋ฉฐ ๊ทธ ์ด์ ๋ฅผ ํจ๊ป ์ดํด๋ณด์.
Software Solution 1
do {
while (turn != i) ;
// critical section
turn = j;
// remainder sectoin
} while (TRUE);
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ Entry Section์ while๋ฌธ์ ๋๊ณ , turn์ด๋ผ๋ ๋ณ์๋ฅผ ํตํด ํ์ฌ fence์ ์ ๊ทผํ ์ ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ดํดํ๊ธฐ ์ฝ๊ณ , mutual exclusion์ ์งํฌ ์ ์์ผ๋, ๋ ๋ฒ์งธ ์กฐ๊ฑด์ธ Progress๋ฅผ ์งํฌ ์ ์๋ค.
Software Solution 2
do {
flag[i] = true;
turn = j;
while (flag [j] and turn == j) ;
// critical section
flag[i] = false;
// remainder section
} while (TRUE);
Peterson's Algorithm์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์ ๋ฐฉ์์ 3๊ฐ์ ์กฐ๊ฑด์ ๋ชจ์ฃผ ๋ง์กฑํ๋ค. turn๊ณผ flag๋ผ๋ ๋ณ์์ ๋ฐฐ์ด์ ๋์ด ์ฒ๋ฆฌํ๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ์ค์ง ํ๋ก์ธ์ค๊ฐ ๋ ๊ฐ์ธ ๊ฒฝ์ฐ์์๋ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฏ๋ก ์ญ์๋ ์ฐ์ด์ง ์๋๋ค.
Software Solution 3
do {
choosing[i] = true;
number[i] = max(number[0], number[1], ..., number[n-1]) + 1;
choosing[i] = false;
for(j = 0; j < n; j++) {
while(choosing[j]);
while((number[j] != 0) && (number[j], j) < (number[i], i));
}
// critical section
number[i] = 0;
// remainder section
} while (TRUE);
Bakery Algorithm์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์์ด๋ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์๋ค. ๋ค๋ง, ์ฝ๋๋ง ๋ณด์๋ ๊ต์ฅํ ๋ง๊ณ , ๊ฐ๋จํ critical section์ ์ํํ๋ ๋ฐ ๋๋ฌด๋ ๋ง์ ์ค๋ฒํค๋๊ฐ ์๋ชจ๋๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฐฉ๋ฒ๋ ์ฌ์ฉํ์ง ์๋๋ค.
๊ฒฐ๊ตญ, ์ํํธ์จ์ด ์์ญ์์ critical section ploblem์ ํด๊ฒฐํ๊ธฐ๋ ๋ฌด๋ฆฌ๊ฐ ์๋ค. ๊ทธ๋์ ํ๋์จ์ด๋ฅผ ํตํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ ๋ฐ ์ด๋ ๋ค์ ํฌ์คํ ์์ ์ดํด๋ณด๊ฒ ๋ค.