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

[์šด์˜์ฒด์ œ] ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”, Race Condition, Critical Section

TIlearn 2024. 3. 31. 17:46

 

 

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ž‘ํ•˜๋‹ค ๋ณด๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋ฐ–์— ์—†๋‹ค. ์šด์˜์ฒด์ œ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ถฉ๋Œ์— ๋Œ€ํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ด ๋†“์•˜๋‹ค. 

 

 

๋จผ์ € ๋™๊ธฐํ™”๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์š”ํ•œ ์šฉ์–ด๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.

 

 

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. 1๋ฒˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ _chin_์˜ ์ƒํƒœ๋ฅผ 1๋กœ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค.
  2. ์ด๋•Œ 2๋ฒˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ _chin_์˜ ์ƒํƒœ๋ฅผ 2๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋”ฐ๋ผ์„œ 1์ด์—ˆ๋˜ ์ƒํƒœ๊ฐ€ 2๋กœ ๋ณ€ํ•œ๋‹ค.
  3. 1๋ฒˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ _chout_์— _chin_์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ 2๊ฐ€ ์ €์žฅ๋œ๋‹ค.
  4. 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์„ ํ•ด๊ฒฐํ•˜๊ธฐ๋ž€ ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋“œ์›จ์–ด๋ฅผ ํ†ตํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฐ ์ด๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.