λ°μ΄ν°μ μ κ·Ό
β μ μ₯κ³Ό μ°μ°νλ κ³³μ΄ λ€λ¦
Race Condition
β’
μ¬λ¬ μ£Όμ²΄κ° νλμ λ°μ΄ν°μ λμμ μ κ·Όνλ €κ³ ν λ
storage box λ λ©λͺ¨λ¦¬ μ£Όμ 곡κ°, λ©λͺ¨λ¦¬, λμ€ν¬
execution box λ CPU νλ‘μΈμ€, CPU, μ»΄ν¨ν° λ΄λΆ
β λ©ν°νλ‘μΈμ or 곡μ λ©λͺ¨λ¦¬ μ¬μ© λ±μΌλ‘ μΈν΄ race condition λ°μ
OS μμ race condition μ΄ λ°μνλ κ²½μ°
1.
kernel μν μ€ interrupt λ°μ μ
β’
interrupt handler vs kernel
β’
load νκ³ increase νκ³ store νλ μΈ κ°μ μΈμ€νΈλμ
μ΄ μνλλ λμ λ°μ
β’
컀λ λͺ¨λ running μ€ interrupt κ° λ°μνμ¬ interrupt μ²λ¦¬ λ£¨ν΄ μν β μμͺ½ λ€ μ»€λ μ½λμ΄λ―λ‘ kernel address space 곡μ
β’
ν΄κ²° λ°©λ²μΌλ‘λ interrupt λ₯Ό disable μν€κ³ λμ interrupt μ€ν
2.
process κ° system call μ νμ¬ kernel mode λ‘ μν μ€μ context switch κ° μΌμ΄λλ κ²½μ°
β’
ν΄κ²° λ°©λ²μΌλ‘λ 컀λ λͺ¨λμμ μν μ€μΌ λλ ν λΉ μκ°μ΄ μ§λλ CPU λ₯Ό preempt νμ§ μκ³ μ»€λ λͺ¨λμμ μ¬μ©μ λͺ¨λλ‘ λμκ° λ preempt νλ€.
3.
multiprocessor μμ shared memory λ΄μ kernel data
β’
ν΄κ²° λ°©λ²μΌλ‘λ 컀λ λ΄λΆ κ° κ³΅μ λ°μ΄ν°μ μ κ·Όν λλ§λ€ κ·Έ λ°μ΄ν°μ λν lock, unlock μ νλ€.
Process Synchronization λ¬Έμ
β’
곡μ λ°μ΄ν°(shared data) μ λν λμ μ κ·Ό(concurrent access) μ λ°μ΄ν°μ λΆμΌμΉ λ¬Έμ λ₯Ό λ°μμν¬ μ μλ€.
β’
μΌκ΄μ±(consistency) μ μ§λ₯Ό μν΄ νλ ₯ νλ‘μΈμ€ κ°μ μ€ν μμλ₯Ό μ ν΄μ£Όλ λ©μ»€λμ¦μ΄ νμ
Race Condition
β’
μ¬λ¬ νλ‘μΈμ€λ€μ΄ λμμ 곡μ λ°μ΄ν°μ μ κ·Όνλ μν©
β’
λ°μ΄ν°μ μ΅μ’
μ°μ° κ²°κ³Όλ λ§μ§λ§μ κ·Έ λ°μ΄ν°λ₯Ό λ€λ£¬ νλ‘μΈμ€μ λ°λΌ λ¬λΌμ§λ€.
β’
race condition μ λ§κΈ° μν΄ concurrent process λ λκΈ°ν(synchronize) λμ΄μΌ νλ€.
μ¬μ©μ νλ‘μΈμ€ P1 μν μ€ timer interrupt κ° λ°μν΄μ context switch κ° μΌμ΄λ P2 κ° CPU λ₯Ό μ‘λλ€λ©΄?
The Critical-Section Problem(μκ³κ΅¬μ)
β’
μ¬λ¬ νλ‘μΈμ€κ° 곡μ λ°μ΄ν°λ₯Ό λμμ μ¬μ©νκΈ°λ₯Ό μνλ κ²½μ°
β’
κ° νλ‘μΈμ€μ code segment μλ 곡μ λ°μ΄ν°μ μ κ·Όνλ μ½λμΈ critical section μ΄ μ‘΄μ¬
β’
count++ λ±μ΄ critical section μ μμ
β’
ν΄κ²°μ±
{
entry section;
critical section;
exit section;
}
C
볡μ¬
μκ³ κ΅¬μμ λ€μ΄κ°κΈ° μ μ lock λ±μΌλ‘ λ€λ₯Έ νλ‘μΈμ€μ μ κ·Όμ λ§λλ€.
ν΄κ²°λ² 쑰건
β’
Mutual Exclusion(μνΈ λ°°μ )
β¦
νλμ νλ‘μΈμ€κ° critical section λΆλΆμ μν μ€μ΄λ©΄ λ€λ₯Έ λͺ¨λ νλ‘μΈμ€λ€μ critical section μ λ€μ΄κ°λ©΄ μλλ€.
β’
Progress
β¦
μ무λ critical section μ μμ§ μμ μνμμ critical section μ λ€μ΄κ°κ³ μ νλ νλ‘μΈμ€κ° μμΌλ©΄ critical section μ λ€μ΄κ° μ μλ€.
β’
Bounded Waiting(μ ν λκΈ°)
β¦
νλ‘μΈμ€κ° critical section μ λ€μ΄κ°λ €κ³ μμ²ν νλΆν° κ·Έ μμ²μ΄ νμ©λ λκΉμ§ λ€λ₯Έ νλ‘μΈμ€λ€μ΄ critical section μ λ€μ΄κ°λ νμμ νκ³κ° μμ΄μΌ νλ€.
β¦
μκ³ κ΅¬μμ λ€μ΄κ°κ³ μ νλ νλ‘μΈμ€κ° 3κ° μκ³ μκ³ κ΅¬μμ 2κ°μ νλ‘μΈμ€λ§ λ²κ°μκ°λ©΄μ λ€μ΄κ°λ κ²½μ° ν΄λΉ 쑰건μ μΆ©μ‘±νμ§ λͺ»ν¨
Algorithm 1
do {
while (turn != 0);
critical section
turn = 1;
} while (1);
C
볡μ¬
β’
do while κ³Ό turn μΌλ‘ ꡬλΆ
β’
progress 쑰건μ λ§μ‘±νμ§ λͺ»νλ€.
β¦
νλ‘μΈμ€ 0μ΄ 1μ΄μ 10λ² critical section μ λ€μ΄κ°κ³ νλ‘μΈμ€ 1μ΄ 1μ΄μ 1λ² critical section μ λ€μ΄κ°λ©΄ νλ‘μΈμ€ 0μ 1μ΄μ 1λ²λ°μ critical sectionμ λ€μ΄κ°μ§ λͺ»νλ€. νλ‘μΈμ€ 1μ΄ λ€μ΄κ°μ 0μΌλ‘ λ°κΏμ€μΌ νκΈ°λλ¬Έμ
Algorithm 2
do {
flag[i] = true;
while (flag[j]);
critical section
flag[i] = false;
} while (1);
C
볡μ¬
β’
flag[j] κ° true κ° μλ λ νλ‘μΈμ€ i κ° criticaal section μ λ€μ΄κ° μ μλ€.
β’
progress 쑰건μ λ§μ‘±νμ§ λͺ»νλ€.
β¦
i μ j λμμ flagλ₯Ό true λ‘ λ§λ€λ©΄ λ νλ‘μΈμ€ λͺ¨λ while μμ λκΈ°
Algorithm 3 (Petersonβs Algorithm)
do {
flag[i] = true;
turn = j;
while (flag[j] && turn ==j);
critical section
flag[i] = false;
} while (1);
C
볡μ¬
β’
Algorithm 1, 2 λ₯Ό κ²°ν©ν κ²
β’
쑰건μ λͺ¨λ λ§μ‘±ν¨
β’
busy waiting(spin lock) λ¬Έμ
β¦
κ³μ CPU μ memory λ₯Ό μ°λ©΄μ wait
Synchronization Hardware
β’
νλμ¨μ΄λ‘ test & modify λ₯Ό atomic νκ² μνν μ μλλ‘ μ§μνλ κ²½μ° λ¬Έμ κ° μ½κ² ν΄κ²° κ°λ₯
β¦
곡μ λ°μ΄ν°μ μ½λ μμ
κ³Ό μ°λ μμ
μ νλ²μ μννλ©΄ ν΄κ²° κ°λ₯
β¦
test_and_set(a) λΌλ μΈμ€νΈλμ
Semaphores
β’
Semaphore S:
β¦
integer(μμμ κ°―μ)
β¦
P, V μ°μ°μ μν΄μλ§ μ κ·Ό κ°λ₯
β¦
atomic μ°μ°
β’
P(S):
β¦
while (Sβ€0) wait;
β¦
Sβ;
β¦
μΈλ§ν¬μ΄ λ³μ κ°μ νλνλ μ°μ°
β¦
S κ°μ΄ μμκ° λ λκΉμ§ busy-wait
β’
V(S):
β¦
S++;
β¦
λ°λ©νλ μ°μ°
do {
P(mutex); /* mutext λ mutual exclusion */
critical section
V(mutex);
} while (1);
C
볡μ¬
β’
busy wait λ°©μ(spin lock)
β’
block & wakeup λ°©μ(sleep lock) μΌλ‘ ν΄κ²° κ°λ₯
Block & Wakeup λ°©μ
β’
Semaphore λ₯Ό integer λ³μ κ°(value)κ³Ό queue λ³μ κ°(L)μΌλ‘ μ μ
β’
value κ°μ΄ λ¨μν 곡μ κ°λ₯ μμ κ°μκ° μλλΌ, 곡μ κ°λ₯νμ§ μν©μ λνλΈλ€. μμλ©΄ 곡μ λΆκ°, μμλ©΄ 곡μ κ°λ₯
β’
P(S):
S.value--;
if (S.value < 0 ) {
add this process to S.L;
block();
}
C
볡μ¬
β¦
value κ° λΆμ‘±νλ©΄ block λ¨
β’
V(S):
S.value++;
if (S.value <= 0) {
remove a process P from S.L;
wakeup(P);
}
C
볡μ¬
β¦
λ¨μν μμμ λ°λ©νκ³ λλλκ² μλλΌ νΉμ μ λ€μ΄ μλ νλ‘μΈμ€κ° μλ€λ©΄ κΉ¨μ
busy-wait vs block & wakeup
β’
critical section μ κΈΈμ΄κ° 짧μΌλ©΄ busy-wait λ°©μλ μ’μ
β’
μΌλ°μ μΌλ‘λ block & wakeup
binary semaphore(mutex)
β’
μμμ κ°μ΄ νλμΈ κ²½μ°(κ°μ΄ 0, 1)
β’
μ£Όλ‘ lock/unlock μ μ¬μ©
counting semaphore
β’
μμμ κ°μκ° μ¬λ¬κ° μμ λ
β’
resource counting μ μ¬μ©
Deadlock and Starvation
Deadlock
λ μ΄μμ νλ‘μΈμ€κ° μλ‘ μλλ°©μ μν΄ μΆ©μ‘±λ μ μλ event λ₯Ό 무νν κΈ°λ€λ¦¬λ νμ
β’
μΈλ§ν¬μ΄ S, Q λ κ°κ° μμ λ μ΄λ€ μΌμ νκΈ° μν΄ λ κ° λͺ¨λ νλν΄μΌ μΌμ ν μ μλ κ²½μ° λ°λλ½ λ°μ
β’
P0 μ΄ P(S) λ₯Ό μ»κ³ CPU λ₯Ό P1 μ΄ κ°μ Έκ°.
β’
P1 μ΄ P(Q) λ₯Ό μ»κ³ P(S) λ₯Ό μ»μΌλ €κ³ ν λ 무νμ λκΈ°
β’
ν΄κ²°λ°©λ²: S, Q λ₯Ό μ»λ μμλ₯Ό νλλ‘ μ ν΄μ£Όλ©΄ λλ€.
Starvation
νΉμ ν νλ‘μΈμ€κ° μμν μμμ μ»μ§ λͺ»νκ³ κΈ°λ€λ¦¬λ νμ
β’
νΉν μΌλΆ νλ‘μΈμ€λ§ μμμ κ°μ§κ³ νΉμ νλ‘μΈμ€λ§ λͺ»κ°μ§λ νμ. λ°λλ½μ κ΄λ ¨λ λͺ¨λ νλ‘μΈμ€κ° λͺ¨λ λͺ»κ°μ§.
Classical Problems of Synchronization
Bounded-Buffer Problem(Producer-Consumer Problem)
Producer μ Consumer κ° μ¬λ¬ κ°
1.
μμ°μλ μλΉμ 2κ°κ° νλ²μ μμ λ
β’
λ°μ΄ν°λ₯Ό λμμ λ£μΌλ €κ³ ν¨
β’
λ°μ΄ν°λ₯Ό λμμ κΊΌλ΄λ €κ³ ν¨
β’
곡κ°(buffer)μ λ½μ κ±Έμ΄μ μ§ν
2.
bufferκ° κ°λ μ°Όμ λ
a.
λ°μ΄ν°λ₯Ό μ§μ΄ λ£μ buffer κ° μλ€
b.
κ·Έλμ μμ°μλ λκΈ°
β’
λκΈ°ν λ³μλ‘λ 1. binary semaphore μ 2. integer semaphore
λ³μλ full = 0, empty = n, mutex = 1; λ‘ μμ
β’
P(empty) μμ empty κ° 0μ΄ μλλΌλ©΄ λ²νΌ νλ‘μΈμ€ νλ ν mutex λ₯Ό 0μΌλ‘ λ°κΏ(λ½)
β’
V(mutex) λ‘ λ°λ© ν V(full) λ‘ full λ³μμ 1μ μ¦κ°μν΄
Readers and Writers Problem
β’
DB μμ λ°μ
β’
ν νλ‘μΈμ€κ° db μ write μ€μΌ λ λ€λ₯Έ process κ° μ κ·Όνλ©΄ μλ¨
β’
read λ λμμ μ¬λΏμ΄μ ν΄λ λ¨
β’
ν΄κ²°μ±
:
β¦
writer κ° db μ μ κ·Ό νκ°λ₯Ό μμ§ μ»μ§ λͺ»ν μνμμλ λͺ¨λ λκΈ°μ€μΈ reader λ€μ λ€ db μ μ κ·Όνκ² ν΄μ€λ€.
β¦
writer λ λκΈ°μ€μΈ reader κ° νλλ μμ λ db μ κ·Όμ΄ νμ©λ¨
β¦
μΌλ¨ writer κ° db μ μ κ·Ό μ€μ΄λ©΄ reader λ€μ μ κ·Όμ΄ κΈμ§λ¨
β¦
writer κ° db μμ λΉ μ Έλκ°μΌλ§ reader μ μ κ·Όμ΄ νμ©
β’
곡μ λ°μ΄ν°
β¦
db μ체
β¦
read count
β’
mutex λ readcount μ λν λ°°νλ½μ μ»κΈ° μν μΈλ§ν¬μ΄ λ³μ
β’
starvation μ΄ λ°μν μ μμ. μμ(μ νΈλ± μ‘΄μ¬ μ΄μ )
Dining Philosophers Problem
β’
semaphore chopstick[5];
β’
μ²μμ λͺ¨λ values λ 1
β’
μκ°νλ μ
무μ λ°₯λ¨Ήλ μ
무 2κ° μμ
β’
λ¬Έμ μ :
β¦
λ°λλ½ λ°μ κ°λ₯μ±
βͺ
λ€ κ°κ° μΌμͺ½ μ κ°λ½ μ‘μμ λ
β’
ν΄κ²°μ±
β¦
4λͺ
μ μ² νμλ§ ν
μ΄λΈμ μμ μ μλλ‘
β¦
μ κ°λ½μ λ κ° λͺ¨λ μ§μ μ μμ λμλ§ μ κ°λ½μ μ§μ μ μκ²
β¦
μ§μ μ² νμλ μΌμͺ½, νμ μ² νμλ μ€λ₯Έμͺ½ μ κ°λ½ λΆν° μ§λλ‘ λΉλμΉ μ λ΅
β¦
β’
self[5] λ μ§μ μ μλ κΆν, μ΄κΈ°ν κ°μ 0
β’
μ΄ λΆλΆμ΄ μΌλ°μ μΈ μΈλ§ν¬μ΄μ μ² νκ³Όλ λ€λ¦
β¦
μμμ κ°μλ₯Ό μ΄κΈ°κ°μΌλ‘ νκ³ κ·Έ μμμ κ°μκ° 1μ΄κ±°λ 1μ΄μμΌ λλ₯Ό κΆνμΌλ‘ λ΄
β¦
κΆνμ μ£Όλκ² V(self[i]) β 0μ΄μλ κ°μ 1λ‘ λ°κΏ
Monitor
β’
Semaphore μ λ¬Έμ μ
β¦
μ½λ©νκΈ° νλ¦
β¦
μ νμ±μ μ
μ¦μ΄ μ΄λ €μ
β¦
μλ°μ νλ ₯μ΄ νμ
β¦
νλ²μ μ€μκ° λͺ¨λ μμ€ν
μ μΉλͺ
μ μΈ μν₯
β’
μΈμ΄ μ°¨μμμ λκΈ°ν λ¬Έμ ν΄κ²°
β’
λμ μνμ€μΈ νλ‘μΈμ€ μ¬μ΄ abstract data type μ μμ ν 곡μ λ₯Ό 보μ₯νκΈ° μν high-level λκΈ°ν construct
monitor monitor_name {
procedure body P1 (...) {
...
}
procedure body P2 (...) {
...
}
procedure body Pn (...) {
...
}
{
initialization code
}
}
Java
볡μ¬
β’
κ°μ²΄μ§ν₯ μΈμ΄λ€μ κ°μ²΄λ₯Ό μ€μ¬μΌλ‘ operation λ€μ΄ μ μλλ€.
β’
곡μ λ°μ΄ν°μ μ κ·ΌνκΈ° μν΄μλ λ΄λΆμ procedure λ₯Ό ν΅ν΄μλ§ κ³΅μ λ°μ΄ν°μ μ κ·Όν μ μλ€.
β’
β’
νλ‘κ·Έλλ¨Έκ° λ°μ΄ν°μ λ½μ κ±Έ νμκ° μλ€.
β’
λͺ¨λν°κ° μμ²μ μΌλ‘ νλ‘μμ κ° λμμ μ€νν μ μλλ‘ νλ€.
β’
μ¬λ¬ νλ‘μΈμ€κ° λμμ μ κ·Όν΄λ λͺ¨λν°κ° μμμ queue μ μ€ μΈμ°κ³ νλ‘μμ λ₯Ό μμ°¨μ μΌλ‘ μ€νμμΌμ€λ€.
β’
λͺ¨λν° λ΄μμλ νλ²μ νλμ νλ‘μΈμ€λ§ νλ κ°λ₯
β’
νλ‘κ·Έλλ¨Έκ° λκΈ°ν μ μ½ μ‘°κ±΄(lock)μ λͺ
μμ μΌλ‘ μ½λ©ν νμκ° μλ€.
β’
νλ‘μΈμ€κ° λͺ¨λν° μμμ κΈ°λ€λ¦΄ μ μλλ‘ νκΈ° μν΄ condition variable(x, y) μ μ¬μ©
β’
condition variable μ wait μ signal μ°μ°μ μν΄μλ§ μ κ·Όμ΄ κ°λ₯νλ€.
β’
wait()
β¦
x.wait() μ invoke ν νλ‘μΈμ€λ λ€λ₯Έ νλ‘μΈμ€κ° x.signal() μ invoke νκΈ° μ κΉμ§ suspend λ¨
β’
signal()
β¦
x.signal()μ μ ννκ² νλμ suspend λ νλ‘μΈμ€λ₯Ό resume νλ€.
β¦
suspend λ νλ‘μΈμ€κ° μμΌλ©΄ μ무 μΌλ μΌμ΄λμ§ μλλ€.
β’
μμ°μ μλΉμ λͺ¨λν° μ½λ
β¦
P(mutex), V(mutex) μ²λΌ λ½μ κ±Έκ³ ν΄μ νλ μ½λκ° μ¬λΌμ‘λ€.
β’
μμ¬νλ μ² νμ
test λ©μλ μμ self[i].signal() μ μΈμ μ² νμκ° putdown μ κΉ¨μμ£ΌκΈ° μν μ©λ