[์ด์์ฒด์ ] Testset ์ธ์คํธ๋ญ์
์ด์ ์ Race Condition์ ํด๊ฒฐํด์ฃผ๊ธฐ ์ํด Atomic Operation์ ํด์ฃผ๊ฑฐ๋, ์ํํธ์จ์ด์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก Mutual Exclusion์ ๋ณด์ฅํด์ฃผ์๋ค. ํ์ง๋ง, ์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ ์ค์ ๋ก ์ํํ๊ฑฐ๋ ๋ง์ ์ค๋ฒํค๋๋ฅผ ๋๋ฐํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ์ ์ฐ์ง ์๋๋ค.
๋ฐ๋ผ์ ์ค์ ๋ก๋ ํ๋์จ์ด์ ๋์์ ๋ฐ์ Mutual Exclusion์ ๋ณด์ฅํด์ฃผ๋๋ฐ ์ด์ ๋ํด ์์ธํ ์ดํด๋ณด๋๋ก ํ์.
Testset ์ธ์คํธ๋ญ์
์ด์ ์ ์ดํด๋ณด์๋ ์ํํธ์จ์ด์ ์ธ ์ฝ๋ ๋จผ์ ํ์ธํด๋ณด์.
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);
๋ชจ๋ ํ๋ก์ธ์ค๋ง๋ค ์์ ๊ฐ์ ์ฝ๋๊ฐ ํ์ฌ๋์ด ์์ผ๋ฉฐ, ๊ฐ ํ๋ก์ธ์ค์์ Flag๋ฅผ ํตํด ๋ด๊ฐ ์ง๊ธ Critical ์์ญ์ ๋ค์ด๊ฐ ์์์ ํ์ธ์์ผ์ฃผ์ด์ผ ํ๋ค.
์ด์ ์ ๋งํ๋ ๋ฐ์ ๊ฐ์ด ์ด๋ฌํ ์ฝ๋๋ ๋ง์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํค๊ณ , ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์๋๋ค.
ํ๋์จ์ด์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก Mutual Exclusion์ ํด๊ฒฐํด ๋ณด๋๋ก ํ์.
boolean testset(i) {
if (i == 0) {
i = 1;
return 1;
} else {
return 0;
}
}
๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์์ ์ด Critical Section์ ๋ค์ด๊ฐ ์๋ ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ ๋์ , ํ๋์จ์ด์์ Critical Section์ ์๋ฆฌ๊ฐ ์ฑ์์ ธ ์๋ ์ง ํ์ธํ๋ค.
์ฆ, ํด๋น testsetํจ์์ ๋ณ์๋ค์ ํ๋์จ์ด ์์ญ์์ ๊ตฌํ๋์ด ์๋ค.
_testset_ ํจ์๊ฐ ์คํ๋๋ ๋์, ํ๋์จ์ด์ ์ง์์ ๋ฐ์ interrupt๊ฐ ๋ฐ์ํ์ง ์๊ณ atomic ํ๊ฒ ์คํํ๋ค. ์ด๋ Mutual Exclusion์ ์ํด Critical Section ์ ์ฒด๋ฅผ atomicํ๊ฒ ์คํ์ํค๋ ๊ฒ๊ณผ๋ ์์ ํ ๋ค๋ฅธ ์๋๋ค. ๋ํ ์ฌ์ฉ์ ๋จ์์ atomic ํ๊ฒ ์คํํ์ง ์๊ณ , ํ๋์จ์ด ๋จ์์ atomicํ๊ฒ ์คํํ๊ธฐ์ ๋ณด๋ค ์์ ํ๋ค.
const int n = /* number of processes */
int bolt;
void P(int i) {
while (true) {
while(!testset(bolt))
/* critical section */
bolt = 0;
/* remainder */
}
}
void main() {
bolt = 0;
parbegin (P(1), P(2), ... , P(n));
}
์ด์ testset์ entry section์ ๋ฃ์ด์ฃผ์๋ค. ๋ณด๋ค ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ก์ผ๋ฉฐ ์ ๋ณด๋ค ๊ด์ฌ์ฌ๊ฐ ๋ถ๋ฆฌ๋์๋ค.
Testset ์ธ์คํธ๋ญ์ ์ ์ฅ/๋จ์
์ฅ์
- ์ฑ๊ธ ํ๋ก์ธ์ค์ด๋ , ๋ฉํฐ ํ๋ก์ธ์ค์ด๋ ์๊ด์์ด Mutual Exclusion์ ์งํฌ ์ ์๋ค.
- ๊ฐ๋จํ๊ณ , ์๋ณํ๊ธฐ ์ฝ๋ค.
๋จ์
- Busy wating์ ์ฌ์ ํ ์๋ค.
- ์ด๋ก ์์ผ๋ก Bounded Wating์ด ์ง์ผ์ง์ง ์์ ์ ์๋ค.
- ์ค์ ๋ก๋ ๊ฑฐ์ ์๋ค๊ณ ํ๋ค.
- DeadLock์ด ๋ฐ์ํ ์ ์๋ค.
- ์ฐ์ ์์๊ฐ ๋ฎ์ ํ๋ก์ธ์ค์ ๋์ ํ๋ก์ธ์ค ์ฌ์ด์์ ๋ฐ์ํ๋ค. ๋ฐ์ํ๋ ์ํฉ์ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑ์์ผ์ผ ํ๋ค.
- ๋ฎ์ ํ๋ก์ธ์ค๊ฐ ์ธํฐ๋ฝํธ๋ก ์ธํด ๋์ ํ๋ก์ธ์ค๋ก CPU ์ ์ด๊ถ์ด ๋บ๊ธด ์ํฉ
- ์ด๋, ๋ฎ์ ํ๋ก์ธ์ค๊ฐ Critical Section์ ์๋ ์ํฉ
- ๋์ ํ๋ก์ธ์ค๋ Busy Watingํ๋ฉฐ Critical Section์ผ๋ก ๋ค์ด๊ฐ ์ ์๋ค.
- ํ์ง๋ง ๋ฎ์ ํ๋ก์ธ์ค ๋ํ ์ฐ์ ์์๊ฐ ๋ฎ์ CPU ์ ์ด๊ถ์ ์ฐพ์์ฌ ์ ์๋ค.
- ์ฐ์ ์์๊ฐ ๋ฎ์ ํ๋ก์ธ์ค์ ๋์ ํ๋ก์ธ์ค ์ฌ์ด์์ ๋ฐ์ํ๋ค. ๋ฐ์ํ๋ ์ํฉ์ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑ์์ผ์ผ ํ๋ค.