1. λκΈ°ν(Synchronization)λ
νλ ₯νμ¬ μ€νλλ νλ‘μΈμ€λ€μ μ€ν μμμ μμμ μΌκ΄μ±μ 보μ₯ν΄μΌ νκΈ°μ λ°λμ λκΈ°ν λμ΄μΌ νλ€.
μ¦, νλ‘μΈμ€ λκΈ°νλ νλ‘μΈμ€λ€ μ¬μ΄μ μν μκΈ°λ₯Ό λ§μΆλ κ²μ μλ―Ένλ€.
- μ€ν μμ μ μ΄: νλ‘μΈμ€λ₯Ό μ¬λ°λ₯Έ μμλλ‘ μ€ννκΈ°
- μνΈ λ°°μ : λμμ μ κ·Όν΄μλ μ λλ μμμ νλμ νλ‘μΈμ€λ§ μ κ·Όνκ² νκΈ°
+) μ€λ λλ λκΈ°ν λμμ΄λ€.
1) μ€ν μμ μ μ΄λ₯Ό μν λκΈ°ν
λμμ μ€νλλ νλ‘μΈμ€λ₯Ό μ¬λ°λ₯Έ μμλλ‘ μ€ννλ κ²
2) μνΈ λ°°μ λ₯Ό μν λκΈ°ν
μνΈλ°°μ λ 곡μ λΆκ°λ₯ν μμμ λμ μ¬μ©μ νΌνκΈ° μν κ². e.g. μμ°μ-μλΉμ λ¬Έμ
2. λ°°κ²½
μμ°μ-μλΉμ λ¬Έμ μμ μμ°μμ μλΉμ νλ‘μΈμ€λ 곡μ λ©λͺ¨λ¦¬λ₯Ό μ΄μ©νμ¬ κ³΅ν΅λ λ³μμ λ²νΌλ₯Ό 곡μ νλ€.
κ°κ°μ νλ‘μΈμ€λ₯Ό λ 립μ μΌλ‘ μννλ©΄ μ¬λ°λ₯΄κ² λμνμ§λ§, 곡μ λ³μμ κ°μ΄ κ²°κ³Όμ μν₯μ μ£ΌκΈ°μ λ³νμΌλ‘ μνλλ©΄ μ€νλλ μμμ λ°λΌ μ¬λ°λ₯΄κ² λμνμ§ μμ μ μλ€.
λν νμ΄μ¬κ³Ό κ°μ κ³ κΈ νλ‘κ·Έλλ° μΈμ΄μ ν λ¬Έμ₯μ μ»΄νμΌλ¬μ μν΄ μ¬λ¬ κ°μ κΈ°κ³ λͺ λ Ήμ΄λ‘ λ²μλκΈ°μ μ°λ¦¬κ° λ΄€μλλ ν λ¬Έμ₯μ΄μ¬λ μ»΄ν¨ν°λ΄λΆμ μΌλ‘λ μ¬λ¬ μ€μ μλ―Έν μ μλ€. λ°λΌμ, μΈνΈλ½νΈλ ν κΈ°κ³ λͺ λ Ήμ΄μ λͺ λ Ήμ΄ μ£ΌκΈ°κ° λλ μμ μ μ²λ¦¬λλ€.
λ³μ counterμ λν΄ κΈ°κ³μ μΌλ‘ λ―μ΄λ³΄μ. register1, register2λ CPU λ΄λΆ λ μ§μ€ν°λ₯Ό μλ―Ένλ€.
- μμ°μκ° counter ++
register1 = counter;
register1 = register1 + 1;
counter = register1;
- μλΉμκ° counter - -
register2 = counter;
register2 = register - 1;
counter = register2;
μ΄κΈ° counterμ κ°μ΄ 5λΌκ³ νμ.
μ΄λ λ³ν μνμ κ²°κ³Όλ‘ λ€μν μν©μ΄ μκΈΈ μ μλ€. μλ₯Όλ€μ΄
T0 : μμ°μ register1 = counter; {register1 = 5, counter = 5 }
T1 : μμ°μ register1 = register1 + 1; {register1 = 6, counter = 5 }
T2 : μλΉμ register2 = counter; {register2 = 5, counter = 5 }
T3 : μλΉμ register2 = register2 - 1; {register2 = 4, counter = 5 }
T4 : μμ°μ counter = register1; {counter = 6 }
T5 : μλΉμ counter = register2; {counter = 4 }
μ΄μ²λΌ λ³νμΌλ‘ μνλλ μ¬λ¬ νλ‘μΈμ€κ° 곡ν΅λ λ°μ΄ν°λ₯Ό μ‘°μν λ κ²°κ³Όκ° μ κ·Ό μμμ μν΄ κ²°μ λλ©΄ κ²½ν© μν, κ²½μ 쑰건(race condition)μ΄ μ‘΄μ¬νλ€κ³ νλ€.
race conditionμ΄ λ°μνλ©΄ μμ°μ μλΉμ λ¬Έμ μ²λΌ λ°μ΄ν°μ μΌκ΄μ±μ΄ κΉ¨μ§λ λ¬Έμ κ° λ°μνλ€.
μ¬λ¬ νλ‘μΈμ€κ° λ³νμΌλ‘ μνλμ΄ λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νλ κ²μ νλ‘μΈμ€ λκΈ°νλΌ νλ€.
3. μκ³ κ΅¬μ λ¬Έμ
곡μ μμ: μ μ λ³μ, νμΌ, μ μΆλ ₯μ₯μΉ, 보쑰기μ΅μ₯μΉ . λ±λ . κ°μ΄μμ νλ‘μΈμ€λ₯Ό λμμ μ€ννλ©΄ λ¬Έμ κ° λ°μνλ μμ
μκ³ κ΅¬μ(critical section): νλ‘μΈμ€μ "μ½λ"μ μΌλΆλΆμΌλ‘μ, λ€λ₯Έ νλ‘μΈμ€μ 곡λμΌλ‘ μ¬μ©νλ λ³μ, ν μ΄λΈ, νμΌ λ±μ λ³κ²½νλ λΆλΆ
μκ³ κ΅¬μμ μ€νμ μνΈλ°°νμ (mutually exclusive)μΌλ‘ μ€νλμ΄μΌ νλ€. μ΄ λ§μ ν νλ‘μΈμ€κ° μκ³ κ΅¬μ μ€νμμ λ€λ₯Έ νλ‘μΈμ€λ μκ³ κ΅¬μμ μ§μ ν μ μμ΄μΌ ν¨μ λ§νλ€.
ν νλ‘μΈμ€κ° μκ³κ΅¬μμ λ€μ΄κ°λ©΄ λ€λ₯Έ νλ‘μΈμ€λ μκ³κ΅¬μ λ°μμ κΈ°λ€λ €μΌ νλ©°, μκ³κ΅¬μμ λ€μ΄κ° νλ‘μΈμ€κ° λμμΌ λ°μ μλ νλ‘μΈμ€κ° λ€μ΄κ° μ μλ€.
μ΄μ λ°λΌ κ° νλ‘μΈμ€λ μκ³κ΅¬μ μ§μ μ μ νκ°κ° νμνλ€.
μ΄λ μ΄ νκ°λ₯Ό μμ²νλ μ½λλ₯Ό μ§μ ꡬμ (entry section)μ΄λΌ νκ³ ,
νκ°λ₯Ό λ°μ μκ³κ΅¬μμ μ€νν νμλ λ€λ₯Έ νλ‘μΈμ€λ€μ΄ μ§μ ν μ μλλ‘ ν΄μΌνλ©°, μ΄ μ½λλ₯Ό μΆκ΅¬ ꡬμ (exit section) μ΄λΌ νλ€.
μ§μ ꡬμ, μκ³ κ΅¬μ, μΆκ΅¬ ꡬμμ μ μΈν μ½λλ₯Ό μλ₯ ꡬμ(remainder section)μ΄λΌ νλ€.
init
μ§μ
쑰건( Entiry code )
Critical Section
μΆκ΅¬( Exit code )
Remainder section
μκ³ κ΅¬μ λ¬Έμ λ₯Ό ν΄κ²°νλ λ©μ»€λμ¦μ 3κ°μ§ μκ±΄μ΄ λͺ¨λ μΆ©μ‘±λμ΄μΌ νλ€.
- μνΈ λ°°μ (mutual exclusive = mutex): ν νλ‘μΈμ€κ° μκ³κ΅¬μμμ μ€ννκ³ μμΌλ©΄ μ΄λ€ νλ‘μΈμ€λ μκ³ κ΅¬μμ μ§μ ν μ μμ΄μΌ νλ€.
- μ§ν(progress): μκ³ κ΅¬μμ μ€ννκ³ μλ νλ‘μΈμ€κ° μμ λ, λͺ κ°μ νλ‘μΈμ€κ° μκ³ κ΅¬μμ μ§μ νκ³ μ νλ©΄ μ΄λ€μ μ§μ μμλ μ΄λ€μ μν΄μλ§ κ²°μ λμ΄μΌ νλ€. λν μ΄ κ²°μ μ΄ λ¬΄νμ μ°κΈ°λμ΄μλ μλλ€.
- νκ³ λκΈ°(bounded waiting): ν νλ‘μΈμ€κ° μμ μ μκ³ κ΅¬μμ μ§μ νκ³ μ μμ²μ ν νλΆν° μ΄ μμ²μ΄ νμ©λ λκΉμ§ λ€λ₯Έ νλ‘μΈμ€κ° κ·Έλ€μ μκ³ κ΅¬μμ μ§μ ν μ μλ νμκ° μ νλμ΄μΌ νλ€.
νΉν μνΈ λ°°μ λ μ λ§ μ€μνλ€.
λκ°μ νλ‘μΈμ€κ° μλ€κ³ κ°μ νμ P0. P1
μλλ νλ‘μΈμ€λ€μ μΌλ°μ μΈ κ΅¬μ‘°
do {
entry section //lock
critical section
exit section //unlock
remainder section
} while (1);
4. μκ³ κ΅¬μ λ¬Έμ ν΄κ²° μκ³ λ¦¬μ¦
Algorithm 1
Synchronization variable
int turn; //turn = λꡬ차λ‘μΈκ°
initially turn = 0; // Pi can enter its critical section if(turn == i)
Process P0
do {
while (turn != 0); //0μ΄ μλλ©΄ 1λ² μ°¨λ‘ -> κΈ°λ€λ¦Ό
critical section
turn = 1; //μ΄μ 1λ²μ°¨λ‘λ‘ λ³κ²½ν΄μ€
remainder section
} while (1);
Process P1
do {
while (turn != 1);
critical section
turn = 0;
remainder section
} while (1);
μ΄ μκ³ λ¦¬μ¦μ λ¬Έμ μ μ mutual exclusion λ§μ‘± / progress λ§μ‘± x
Algorithm 2
Synchronization variable
boolean flag[2]; // 2κ°μ flagλ₯Ό κ°μ§λ€ (λ³ΈμΈμ΄ csμ λ€μ΄κ°μ λ§νλ€)
initially flag[λͺ¨λ] =false;
Process Pi
do {
flag[i] = true; //Pretend I am in
while (flag[j]); //μμ λκ΅°κ° μλ? μμΌλ©΄ κΈ°λ€λ¦°λ€
critical section
flag[i] = false; //Pretend I am out
remainder section
}while (1);
μ΄λν mutual exclusionμ λ§μ‘± / progress λ§μ‘± x
νλ‘μΈμ€ Aκ° μκ³ κ΅¬μμ λ€μ΄κ°κΈ° μν΄ flagλ₯Ό trueλ‘ λ°κΎΌ μμ μ context switchingμ΄ λ°μνμ¬ νλ‘μΈμ€ Bμκ² CPUκ° λμ΄κ°λ©΄, νλ‘μΈμ€ Bλ flagλ₯Ό trueλ‘ λ°κΏ¨λλ° λ€μ context switchκ° λ°μνμ¬ νλ‘μΈμ€ Aκ° CPUλ₯Ό μ‘λλ€λ©΄ μ΄λ λꡬλ μκ³κ΅¬μμ λ€μ΄κ° μ μκ² λλ€.
Algorithm 3 (Peterson's Algorithm)
Combined synchronization variables of algorithms 1 and 2 -> flag, turn λͺ¨λ μ¬μ©
do {
flag[i] = true; // λ΄κ° μκ³ κ΅¬μμ λ€μ΄κ°κ²
turn = j; // μλλ°© turnμΌλ‘ λ³κ²½
while (flag[i] && turn == j); //2κ°μ§λ₯Ό λͺ¨λ λ§μ‘±νλμ§ νμΈ
critical section
flag[i] = false;
remainder section
}while (1);
μλλ°©μ΄ μκ³ κ΅¬μμ λ€μ΄κ° μμ§ μκ³ , λ€μ΄κ° μ€λΉλ νμ§ μμΌλ©΄ λ΄κ° λ€μ΄κ°κ² λ€λ λ΄μ©
μκ³ κ΅¬μ ν΄κ²° μν 3κ°μ§λ₯Ό λͺ¨λ λ§μ‘±νμ§λ§, Busy Waiting(=Spin lock)μ΄ λ°μνλ€. μ΄λ CPUμ λ©λͺ¨λ¦¬λ₯Ό μ°λ©΄μ κΈ°λ€λ¦¬λ κ²μ μλ―Ένλ€.
μ¦, μκ³ κ΅¬μμ λ€μ΄κ°κΈ° μν΄ μλλ°©μ΄ CPUλ₯Ό κ°μ§κ³ flag λ³μλ₯Ό falseλ‘ λ°κΏμΌ νλλ°, λ΄κ° CPUλ₯Ό μ‘κ³ μλ μν©μμλ μλλ°©μ μλ―Έμμ΄ whileλ¬Έμ κ³μ λλ©° CPU ν λΉ μκ°μ λλΉνλ κ²μ΄λ€.
5. νλμ¨μ΄μ λ°©λ²
μκ³κ΅¬μ λ¬Έμ κ° λ°μνλ μ΄μ λ λ°μ΄ν°λ₯Ό μ½κ³ μ°λ λμμ΄ νλμ λͺ λ Ήμ΄κ° μλκΈ° λλ¬Έμ΄λ€.
λ°λΌμ μ΄ λͺ λ Ήμ΄λ€μ νλλ‘ λ§λλ μμ μ νλ©΄ λλ€. λͺ λ Ήμ΄ νλλ§μΌλ‘ atomicνκ² λ°μ΄ν°λ₯Ό μ½κ³ μ°λ κ²μ νλ©΄ ν΄κ²° κ°λ₯νλ€.
Test & Set
Synchronization variable
booleanlock = false;
Process Pi
do {
while (Test_and_Set(lock));
critical section
lock = false;
remainder section;
}while (1);
맀κ°λ³μλ₯Ό μ½κ³ , κ·Έ λ³μλ₯Ό 1λ‘ λ°κΏμ£Όλ μν μ νλ€.
lockμ΄ 0μ΄λΌλ©΄, whileλ¬Έμ νμΆνκ³ lockμ΄ 1μ΄ λλ€. lockμ΄ 1μ΄λΌλ©΄, whileλ¬Έμ λκ³ lockμ κ·Έλλ‘ 1μ΄λλ€.
reference
'π»ββοΈμ κ³΅κ³΅λΆ > μ΄μ체μ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
6. μ€μΌμ€λ§ (0) | 2024.05.01 |
---|---|
2. μ»΄ν¨ν° μμ€ν ꡬ쑰 (0) | 2024.05.01 |
1. μ΄μ체μ λ (0) | 2024.05.01 |