OS - Process Synchronization1

๋ฏผ์ฐฌํ™ยท2023๋…„ 10์›” 17์ผ
0

CS - OS(์šด์˜์ฒด์ œ)

๋ชฉ๋ก ๋ณด๊ธฐ
6/6
post-thumbnail

๐Ÿš€ OS - CPU Scheduling 2 ์—์„œ ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๐Ÿงฉ Process Synchronizition ๋ฌธ์ œ

  • ๊ณต์œ  ๋ฐ์ดํ„ฐ์˜ ๋™์‹œ ์ ‘๊ทผ์€ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
  • ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•ด์„œ๋Š” ํ˜‘๋ ฅ ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ•„์š”

๐Ÿงฉ Race Condition

Race Condition(๊ฒฝ์Ÿ ์ƒํƒœ) ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋™์‹œ์— ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ์ƒํ™ฉ์—์„œ, ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค.
๊ณต์œ  ๋ฐ์ดํ„ฐ์˜ Concurrent access(๋™์‹œ ์ ‘๊ทผ) ์€ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Race condition์„ ๋ง‰๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ˜‘๋ ฅ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ ๋™๊ธฐํ™”(Synchronization) ์ด ํ•„์š”ํ•˜๋‹ค.

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์Ÿ์ƒํƒœ๋Š” ๋ณดํ†ต MultiProcessor system, ์ฆ‰ CPU๊ฐ€ ๋งŽ๊ณ  ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ(๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฒŒ์–ด์ง„๋‹ค.๋˜ํ•œ ์šด์˜์ฒด์ œ ์ปค๋„ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๋ฃจํ‹ด์ด ๊ฒน์น ๋•Œ๋„ ๋ฒŒ์–ด์ง„๋‹ค.

๐Ÿงฉ OS์—์„œ Race Condition์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

  • Kernel ์ˆ˜ํ–‰ ์ค‘ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ์‹œ
  • Process๊ฐ€ System call์„ ํ•˜์—ฌ Kernel mode๋กœ ์ˆ˜ํ–‰์ค‘์ธ๋ฐ context switch๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
  • Multiprocessor์—์„œ shared memory ๋‚ด์˜ kernel data

์ปค๋„ ๋ชจ๋“œ๋กœ ์ˆ˜ํ–‰ ์ค‘ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

์–‘์ชฝ ๋‹ค ์ปค๋„ ์ฝ”๋“œ์ด๋ฏ€๋กœ kernel address space๋ฅผ ๊ณต์œ 

์˜๋„๋œ ๋™์ž‘์€ count++์™€ count--๊ฐ€ ๋ชจ๋‘ ๋ฐ˜์˜๋˜์–ด count๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ๋งŒ์•ฝ load ํ›„ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ธํ„ฐ๋ŸฝํŠธ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  count++๋งŒ ๋ฐ˜์˜๋œ๋‹ค.

์ด๋Š” ์ปค๋„ ๋ชจ๋“œ์˜ ์ˆ˜ํ–‰์ด ๋๋‚˜๊ธฐ ์ „์—๋Š” ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฐ›์ง€ ์•Š๋„๋ก(disable/enable)์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Process๊ฐ€ System call์„ ํ•˜์—ฌ Kernel mode๋กœ ์ˆ˜ํ–‰์ค‘์ธ๋ฐ context switch๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ

๋‘ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์ง€๋งŒ, ์‹œ์Šคํ…œ ์ฝœ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋‘˜ ๋‹ค ์ปค๋„ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋„ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„์ค‘์— CPU๋ฅผ ๋นผ์•—์œผ๋ฉด race condition์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋Š” ์ปค๋„ ๋ชจ๋“œ๋ฅผ ์ˆ˜ํ–‰์ค‘์ผ๋• CPU๊ฐ€ preept ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ , ์ปค๋„ ๋ชจ๋“œ์—์„œ ์œ ์ € ๋ชจ๋“œ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ์—๋Š” preept๋˜๋„๋ก ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Multiprocessor์—์„œ shared memory ๋‚ด์˜ kernel data ( CPU๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ ํ™˜๊ฒฝ )

์–ด๋–ค CPU๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ Count๋ฅผ ์ €์žฅํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๊ฒฐ๊ด๊ฐ’์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์‹ฑ๊ธ€ ํ”„๋กœ์„ธ์„œ์ธ ๊ฒฝ์šฐ 1๋ฒˆ์—์„œ์™€ ๊ฐ™์ด ์ธํ„ฐ๋ŸฝํŠธ disable/enable ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ์˜ ๊ฒฝ์šฐ ์ธํ„ฐ๋ŸฝํŠธ ์ œ์–ด๋กœ๋Š” ํ•ด๊ฒฐ์ด ์•ˆ๋œ๋‹ค.

ํ•œ ๋ฒˆ์— ํ•œ CPU๋งŒ ์ปค๋„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋‚˜ ์ด๋Š” ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋งŒ์•ฝ ๋‘ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ race condition์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•œ ๋ฒˆ์— ํ•œ CPU๋งŒ ์ปค๋„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ, ์ปค๋„ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ lock/unlock์„ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์—์„œ ์ด์ œ ๋ฌธ์ œ์ƒํ™ฉ๋“ค์€ ์‚ดํŽด๋ณด์•˜๊ณ , ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ „์ œ ํ•˜์—, ์ฆ‰ ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ์ฒด ๋‘˜์ด ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ์‹œ๋„๋ฅผ ํ•œ๋‹ค๋Š” ์ „์ œ ํ•˜์— ๊ทธ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ’€ ๊ฒƒ์ธ์ง€ ์ด์ œ๋ถ€ํ„ฐ ๋ณผ ๊ฒƒ์ด๋‹ค.

๐Ÿงฉ Critical Section(์ž„๊ณ„ ๊ตฌ์—ญ)

Critical section์€ ์ฝ”๋“œ ์ƒ์—์„œ race condition์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋ถ€๋ถ„์„ ๋งํ•œ๋‹ค. ์ฆ‰ ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์ด๋‹ค.
Critical section์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์กฐ๊ฑด๋“ค์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿงฉ Critical Section ํ•ด๊ฒฐ ์กฐ๊ฑด

  • Mutual Exclusion (์ƒํ˜ธ ๋ฐฐ์ œ)
    : ์ด๋ฏธ ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ Critical Section์—์„œ ์ž‘์—… ์ค‘์ด๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” Critical section์— ์ง„์ž…ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  • Progress (์ง„ํ–‰)
    : Critical section์—์„œ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋‹ค๋ฉด, Critical Section์— ์ง„์ž…ํ•˜๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ง„์ž…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • Bounded Waiting (ํ•œ์ • ๋Œ€๊ธฐ)
    : ํ”„๋กœ์„ธ์Šค๊ฐ€ Critical Section์— ๋“ค์–ด๊ฐ€๊ธฐ ์œ„ํ•ด ์š”์ฒญํ•œ ํ›„๋ถ€ํ„ฐ ๊ทธ ์š”์ฒญ์ด ํ—ˆ์šฉ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์ด Critical Section์— ๋“ค์–ด๊ฐ€๋Š” ํšŸ์ˆ˜์— ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด Critical Section์— ์ง„์ž…ํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฌดํ•œ์ • ๊ธฐ๋‹ค๋ ค์„œ๋Š” ์•ˆ๋œ๋‹ค. (Starvation๋ฌธ์ œ ๋ฐฉ์ง€)

๐Ÿงฉ Critical section ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

critical section ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์€ Lock์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฆ‰, ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ๋“ค์–ด๊ฐ„๋‹ค๋ฉด lock์„ ๊ฑธ์–ด๋†“์•„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด์˜ค์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์—์„œ ๋น ์ ธ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉด lock์„ ํ•ด์ œํ•˜๊ณ  ๋™์‹œ์— ๋™๊ธฐํ™” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ๋™๊ธฐํ™” ์‹ ํ˜ธ๋Š” ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ critical section์„ ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ž„๊ณ„๊ตฌ์—ญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ 3๊ฐ€์ง€ ์กฐ๊ฑด์ธ ์ƒํ˜ธ ๋ฐฐ์ œ, ํ•œ์ • ๋Œ€๊ธฐ, ์ง„ํ–‰์˜ ์œตํ†ต์„ฑ(progress)์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” lock, unlock, ๋™๊ธฐํ™” ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

์˜ˆ์ œ ์ฝ”๋“œ

#include <stdio.h>
typedef enum { false , true} boolean;
extern boolean lock = false;
extern int balance;

int main(){
    while(lock == true);
    lock = true;
    balance = balance + 10;
    lock = false;
}

c ์–ธ์–ด๋Š” ๋ถˆ๋ฆฐํ•จ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด typedef๋กœ ์ •์˜ํ–ˆ๋‹ค.

critical section์— ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋“ค์–ด๊ฐˆ ๋ณ€์ˆ˜๋Š” balance์ด๊ณ , ์ž ๊ธˆ์€ lock์œผ๋กœ ๊ฑธ์–ด๋†“๋Š”๋‹ค. false์ด๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด๊ฐ€ balance๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ณ , true์ด๋ฉด ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ํ•œ๋‹ค.

์ด์ œ ์•„๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ์‚ดํŽด๋ณด๋ฉฐ ์ œ์‹œํ•œ ํ•ด๊ฒฐ๋ฒ•๊ณผ ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•ด๋ณด์ž.

Erroneous Algorithm 1

๋จผ์ € turn ๋ณ€์ˆ˜ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์˜€์„ ๋•Œ์˜ ๋ชจ์Šต์ด๋‹ค. turn์ด 0์ผ๋•Œ p0, turn์ด 1์ผ๋•Œ p1์ด critical section์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ๋˜ํ•œ ๊ฐ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์„ ๋‚˜์˜ฌ๋•Œ turn๊ฐ’์„ ๋ฐ”๊ฟ” ์ƒ๋Œ€๋ฐฉ ํ”„๋กœ์„ธ์Šค์˜ ์ง„์ž…์„ ํ—ˆ๋ฝํ•œ๋‹ค.
ํ•˜์ง€๋งŒ, ์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€ ๊ฒฝ์šฐ turn ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ mutual exclusion์„ ๋ณด์žฅํ•˜์ง€๋งŒ, progress๋Š” ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.
๊ทธ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์— ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ฐ˜๋“œ์‹œ ๊ต๋Œ€๋กœ critical section์— ์ง„์ž…ํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ๋ฌด์กฐ๊ฑด ์ƒ๋Œ€ํŽธ์ด critical section์— ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๋‚˜์™€์•ผ์ง€๋งŒ ๋‚ด ์ฐจ๋ก€๊ฐ€ ์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๋ ค๋Š” ๋นˆ๋„๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๋จ„์•… p0 ์ด ๋”์šฑ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐ€๊ณ  ์‹ถ์ง€๋งŒ, ๊ทธ๋ ‡๋‹ค ํ•˜๋”๋ผ๊ณ  p1์ด ํ•œ๋ฒˆ ์ž„๊ณ„๊ตฌ์—ญ์— ๋ฌด์กฐ๊ฑด ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๋‚˜์™€์•ผ์ง€๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ progress ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Erroneous Algorithm 2

๋‘๋ฒˆ์งธ๋กœ flag ๋ณ€์ˆ˜๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ์ด๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰๋œ๋‹ค. ๋จผ์ € loop ์— ์ง„์ž…ํ•˜๋ฉด์„œ flag๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ critical section์— ๋“ค์–ด๊ฐ€๊ฒ ๋‹ค๊ณ  ์•Œ๋ฆฐ๋‹ค.
while(flag[j]);๋ฅผ ํ†ตํ•ด ์ƒ๋Œ€ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ flag๊ฐ€ true๊ฐ’์„ ๊ฐ€์ง€๋Š”์ง€ ํ™•์ธํ•˜๊ณ , true์ผ ๊ฒฝ์šฐ ๋Œ€๊ธฐํ•œ๋‹ค.
์ƒ๋Œ€ ํ”„๋กœ์„ธ์Šค์˜ flag๊ฐ€ false๊ฐ€ ๋˜์—ˆ์„ ๋•Œ, critical section์— ์ง„์ž…ํ•˜๊ฒŒ ๋œ๋‹ค.
critical section์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์˜ค๋ฉด, ์ž์‹ ์˜ flag๋ฅผ false๋กœ ๋งŒ๋“ค์–ด critical section์— ๋“ค์–ด๊ฐˆ ์ƒ๊ฐ์ด ์—†์Œ์„ ์•Œ๋ฆฐ๋‹ค.

์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์ด์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋งŒ์•ฝ ํ”„๋กœ์„ธ์Šค i๊ฐ€ ๋ณธ์ธ์˜ flag๋ฅผ true๋กœ ๋งŒ๋“  ์ƒํƒœ์—์„œ CPU๋ฅผ ๋ป‡๊ธด๋‹ค. ๊ทธ ์ƒํ™ฉ์—์„œ CPU๊ฐ€ ํ”„๋กœ์„ธ์Šค j์—๊ฒŒ ๊ฐ„๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ์„ธ์Šค j๋„ flag๋ฅผ true๋กœ ๋งŒ๋“ ๋‹ค.
์ด ์ƒํ™ฉ์—์„œ๋Š” ์–‘ ํ”„๋กœ๊ทธ๋žจ ๋ชจ๋‘ flag๋งŒ true๋กœ ๋งŒ๋“ค๊ณ  ์•„๋ฌด๋„ critical section์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์€ ์ƒํ™ฉ์ด๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ์„œ๋กœ while๋ฌธ์˜ flag๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด ์ƒ๋Œ€๋ฐฉ์˜ flag๊ฐ€ ๋ชจ๋‘ true์ธ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๋‚˜์™€์•ผ์ง€๋งŒ flag๊ฐ’์„ ๋ฐ”๊พธ์ง€๋งŒ, ์•„๋ฌด๋„ critical section์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋‹ˆ flag๊ฐ’์ด ๋ฐ”๋€” ์ผ์ด ์—†๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ ์•„๋ฌด๋„ critical section์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๊ณ  ๊ณ„์† ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ mutual exclusion์€ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ์•„๋ฌด๋„ critical section์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

Erroneous Algorithm 3 (Peterson's Algorithm)

์œ„์˜ ๋‘๊ฐ€์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด, turn๊ณผ flag ๋ณ€์ˆ˜๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ ํ”ผํ„ฐ์Šจ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ”„๋กœ์„ธ์Šค p0๊ณผ p1์ด ์žˆ๋‹ค. ๋จผ์ € p0์€ flag๋ฅผ true๋กœ , turn์€ 1๋กœ ์„ค์ •ํ•œ๋‹ค. while(flag[1] && turn = 1); ์„ ๋ณด๋ฉด flag[1] = true์ด๊ณ , turn == 1์ด๋ฉด ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” p1์ด flag๊ฐ€ true๋ผ๋ฉด p1์ด ๋จผ์ € ์‹คํ–‰๋˜๋„๋ก ๋Œ€๊ธฐํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. p1์˜ flag๊ฐ€ false๋ผ๋ฉด, p0์ด critical section์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•ž์—์„œ ๋งํ•œ 3๊ฐ€์ง€ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

โ—๏ธ Mutual exclusion :
p0๊ณผ p1์ด ๋™์‹œ์— ์ž„๊ณ„ ์˜์—ญ์— ๋“ค์–ด๊ฐ„๋‹ค๋Š” ๊ฒƒ์€ flag[0] = flag[1] = true๋ผ๋Š” ๊ฒƒ์ธ๋ฐ, turn์€ 0๋˜๋Š” 1์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ๋ฐ–์— ์—†์œผ๋ฏ€๋กœ ๋‘ฅ๋ฆฌ ๋™์‹œ์— ์ž„๊ณ„๊ตฌ์—ญ์— ์ง„์ž…ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํ˜ธ ๋ฐฐ์ œ๋Š” ๋ณด์žฅํ•œ๋‹ค.
โ—๏ธ Progress & bounded waiting :
p1๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ, flag[1] == false ์ด๋‹ค. ์ฆ‰ p0์ด ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
p1๊ฐ€ while๋ฌธ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„ ๋•Œ, turn์€ 0์ด๊ฑฐ๋‚˜ 1์ด๋‹ค. ๋งŒ์•ฝ turn์ด 0์ด๋ฉด, p0์ด ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, turn์ด 1์ด๋ฉด p1์ด ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
p1๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ์„ ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉด p1์€ flag[1]์„ false๋กœ ์„ค์ •ํ•˜๊ณ , p1๊ฐ€ turn์„ 0์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— p0๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

โ—๏ธ ๋”ฐ๋ผ์„œ ์„ธ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋ถ€ํ•ฉํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์™„๋ฒฝํ•  ๊ฒƒ ๊ฐ™์€ ํ”ผํ„ฐ์Šจ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋„ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

Busy Waiting(spin lock)
๋งŒ์•ฝ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ๋“ค์–ด๊ฐ€์žˆ๋Š” ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU๋ฅผ ์žก์œผ๋ฉด while๋ฌธ์„ ๋Œ๊ฒŒ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ƒํ™ฉ์—์„œ๋Š” ์ ˆ๋Œ€ ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋ณธ์ธ์˜ CPUํ• ๋‹น์‹œ๊ฐ„๋™์•ˆ ๊ณ„์† while๋ฌธ์„ ์ฒดํฌํ•˜์ง€๋งŒ ์ ˆ๋Œ€ ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜๊ฐ€ ์—†๋‹ค.
์ด ๊ฒฝ์šฐ ์ƒ๋Œ€๋ฐฉ์— CPU๋ฅผ ์žก์€ ๋‹ค์Œ while๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์„ ๋งŒ๋“ค์–ด์ค˜์•ผ์ง€๋งŒ ๋น ์ ธ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ Busy waiting์ด๋ผ๊ณ  ํ•œ๋‹ค.


์œ„์—์„œ๋Š” ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด์ ์ธ ์ ‘๊ทผ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ๋Š” ํ•˜๋‚˜์˜ instruction๋งŒ ์ฃผ์–ด์ง€๋ฉด critical section ๋ฌธ์ œ๋Š” ์•„์ฃผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋œ๋‹ค.

๐Ÿงฉ Synchronization Hardware

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

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

๋ณดํ†ต ์ด๋Ÿฐ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ instruction์œผ๋กœ Test_and_set์„ ๊ผฝ๋Š”๋‹ค. ์ด instruction์€ a๋ผ๋Š” ๊ฐ’์„ ์ฝ์–ด์˜ค๊ณ  ์ด ๊ฐ’์„ 1๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” instruction์ด๋‹ค.

ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ์ด๊ฒŒ ์ง€์›์ด ๋œ๋‹ค๋ฉด critical section์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— lock์„ ๊ฑธ๊ณ , ๋น ์ ธ๋‚˜์˜ฌ ๋•Œ lock์„ ํ‘ธ๋Š” ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๋œ๋‹ค.

profile
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊ฟ‰๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€