๐Ÿ€ Knowledge/์šด์˜์ฒด์ œ(OS)

[์šด์˜์ฒด์ œ] Testset ์ธ์ŠคํŠธ๋Ÿญ์…˜

TIlearn 2024. 4. 6. 12:32

 

 

์ด์ „์— 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 ์ œ์–ด๊ถŒ์„ ์ฐพ์•„์˜ฌ ์ˆ˜ ์—†๋‹ค.