2023. 3. 31. 22:38γCS/CS μ€ν°λ
λμμ± νλ‘κ·Έλλ°μ μμ±ν λ, νλ‘κ·Έλλ¨Έλ κ΅μ₯ν μΈμ¬ν μ£Όμκ° νμνλ€.
λ¨μν λμμ± λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν μνΈ λ°°μ μ κ°μ κΈ°λ²μ μ¬μ© μ
μ΄λ‘ μΈν μ±λ₯ μ νμ κ·Έ μΈμ λ€μν μλ‘μ΄ λ¬Έμ λ€μ μ§λ©΄ν μ μκΈ° λλ¬Έμ΄λ€.
κ·Έμ€ κ°μ₯ μ λͺ ν μ€λ₯κ° λ°λ‘ λ°λλ½μ΄λ€.
λ°λλ½μ΄λ?
κ΅μ°© μνλΌκ³ λ λΆλ₯΄λ λ°λλ½μ λμμ± νλ‘κ·Έλλ°μμ λ°μνλ κ°μ₯ μ λͺ ν μ€λ₯ μ€ νλμ΄λ€.
μ μ΄λ―Έμ§λ λ°λλ½μ΄ λ°μνλ μν©μ λν΄ μ μ€λͺ νκ³ μλ€.
μ μ΄λ―Έμ§μμ λ μ€λ λλ κ°κ° 곡μ μμμ λν λ½μ νλν μνμμ
μλ‘κ° μ΄λ―Έ νλν 곡μ μμμ λν μμ λ₯Ό μν΄ λκΈ° μνμ λΉ μ§κ² λλ€.
μ΄λ° λκΈ° μν©μ ν΄μλμ§ λͺ»ν μ± κ²°κ΅ λ μ€λ λ λͺ¨λ μλνμ§ μκ² λλ€.
λ°λλ½μ΄ λ°μ 쑰건
λ°λλ½μ΄ λ°μνκΈ° μν΄μλ λ€μμ 4κ°μ§ μ‘°κ±΄μ΄ μΆ©μ‘±λμ΄μΌ νλ€.
- μνΈ λ°°μ (Mutual Exclusion)
- μ μ λ° λκΈ°(Hold and Wait)
- λΉμ μ (Non-Preemption)
- μν λκΈ°(Circular Wait)
μ΄λ₯Ό νμ΄μ μ€λͺ νλ©΄,
κ° μ°λ λλ μ€μ€λ‘κ° νμλ‘ νλ 곡μ μμμ λν λ μμ μΈ μ μ΄κΆ(λ½)μ νλνλ μν© μμμ, μ€λ λκ° μ΄λ―Έ νλν μ μ΄κΆμ κ°μ§μ± λ€λ₯Έ 곡μ μμμ λν μ μ΄κΆμ μꡬν΄μΌ νλ€. λ§μ½ λ€λ₯Έ μ€λ λμμ μ΄λ―Έ μ μ μ€μ΄λΌλ©΄, 곡μ μμμ΄ λ°νλ λκΉμ§ λκΈ°νλ€. μ΄λ λ€λ₯Έ μ€λ λκ° μ μ ν μμμ λΊμ΄μ¬ μλ μλ€. λ§μ§λ§μΌλ‘, μ€λ λλ€ κ°μ λκΈ°κ° μν ννλ₯Ό λ μ΄μΌ νλ€.
λ°λλ½μ μλ°©
μν λκΈ° ν΄μ
κ°μ₯ λ§μ΄ μ¬μ©λκ³ , λ μ μ©ν΄λ³Όλ§ν λ°©μμΌλ‘ μνλκΈ°κ° λ°μνμ§ μλλ‘ λ‘μ§μ μμ±νλ λ°©λ²μ΄ μλ€.
μ΄λ₯Ό μν΄μλ, 곡μ μμμ νλνλ μμλ₯Ό μ¬μ μ μ§μ ν μ μλ€.
μλ₯Ό λ€μ΄ μ€λ λ 1κ³Ό μ€λ λ 2κ° κ°κ° 곡μ μμ A, Bμ μ κ·Όν λ,
μ€λ λ 1κ³Ό 2κ° κ°κ° Aμ Bλ₯Ό λ¨Όμ νλν μ± λ€λ₯Έ νλλ₯Ό λκΈ°ν λ λ°λλ½μ΄ λ°μνλ€.
μ΄λ° μν©μμ λ²μ΄λκΈ° μν΄ λ¬΄μ‘°κ±΄ Aλ₯Ό νλν΄μΌ Bμ λν μμ²μ ν μ μλλ‘ κ°μ νλ κ²μ΄λ€.
κ·Έλ κ² λλ©΄ μν λκΈ° λ¬Έμ κ° ν΄κ²°λμ΄ λ°λλ½μ μλ°©ν μ μλ€.
μ μ λ° λκΈ° ν΄μ
ν΄λΉ λ°©μμ μꡬλλ λͺ¨λ 곡μ μμμ λν΄, μ΄λ₯Ό μμμ μΌλ‘ νλ²μ νλνλλ‘ λ‘μ§μ μμ±νλ κ²μ΄λ€.
λ§μΉ νΈλμμ μ²λΌ λ§μ΄λ€.
λ§μ½ μꡬλλ 곡μ μμ μ€ νλλΌλ νλνμ§ λͺ»νλ€λ©΄,
λ€λ₯Έ μμμ λν νλκΉμ§λ μλ μΌλ‘ λ§λ€μ΄μ μ΄λ₯Ό ν΄κ²°ν μ μλ€.(λ‘€λ°±)
λΉμ μ ν΄μ
ν΄λΉ λ°©μμ νΉμ μ°λ λκ° μ¬λ¬κ°μ λ½μ μ»κ³ μν λ νλλ₯Ό μ»μ μν©μμ
κ·Έ λ€μ λ½μ μ»μ λ λ§μ½ ν΄λΉ λ½μ΄ μ΄λ―Έ λ€λ₯Έ μ€λ λμ μ μ μ€μ΄λ©΄ κΈ°μ‘΄μ νλνλ λ½μ λͺ¨λ μ·¨μνκ³
λ½ νλ λ‘μ§μ λ€μ μννλ κ²μ΄λ€.
λ§μ½ λ€λ₯Έ μ€λ λμμ μ΄μ λΉμ·ν λ°©μμΌλ‘ μμλ λ€λ₯΄κ² λ½μ νλνλ€ν΄λ λ°λλ½ λ¬Έμ λ ν΄μλλ€.
λΉλ‘ λ€λ₯Έ μ€λ λκ° νλν λ½μ κ°μ λ‘ λΊλ μ μ κΈ°λ₯μ μΆκ°νμ§λ μμ§λ§,
λ°λλ½μ΄ λ°μν μ μλ μν©μμ λ°λ‘ λκΈ°μ λΉ μ§μ§ μκ³ ν΄λΉ μν©μ νμΆνκ² ν΄μ€λ€.
μνΈ λ°°μ ν΄μ
ν΄λΉ λ°©μμ λ°λλ½ λ¬Έμ λ₯Ό μννκΈ° μν΄, μνΈ λ°°μ λ°©μμ μ΅μννκΈ° μν μ κ·Ό λ°©μμ΄λ€.
μ¦ λ½μ μ΅μννλ κ²μΈλ°, μ΄λ₯Ό μν΄ λΉκ΅ κ΅ν λ°©μ(Compare and Swap)μ μ¬μ©ν μ μλ€.
λΉκ΅ κ΅ν λ°©μμ λ€μκ³Ό κ°μ΄ λ‘μ§ μμ±μ΄ μ΄λ£¨μ΄μ§λ€.
import threading
# 곡μ λ³μ
count = 0
# μ€λ λ ν¨μ
def atomic_increment():
global count
for i in range(100000):
# λ½μ μ¬μ©νμ§ μκ³ , λΉκ΅-κ΅ν μ°μ°μ μ¬μ©νμ¬ count λ³μλ₯Ό μ¦κ°μν΄
while True:
old_count = count
new_count = old_count + 1
if old_count == count:
count = new_count
break
# μ€λ λ μμ±
worker_1 = threading.Thread(target=atomic_increment)
worker_2 = threading.Thread(target=atomic_increment)
# μ€λ λ μ€ν
worker_1.start()
worker_2.start()
# μ€λ λ μ’
λ£ λκΈ°
worker_1.join()
worker_2.join()
# κ²°κ³Ό μΆλ ₯
print(count) # 200000
λ‘μ§μ 보면
곡μ μμμ μνλ₯Ό 볡μ¬νλ λ³μλ₯Ό νλ λ§λ ν μνν μ°μ°μ μ΄μ μ²λ¦¬νλ€.
λ§μ½ κ·Έ λκΉμ§λ 볡μ¬ν κ°κ³Ό 곡μ μμμ κ°μ΄ λμΌνλ€λ©΄(λ€λ₯Έ μ€λ λλ₯Ό ν΅ν μ°μ°μ΄ μ²λ¦¬λμ§ μμλ€λ©΄)
μ°μ° κ²°κ³Όλ₯Ό 곡μ μμμ λμ νλ€.
ν΄λΉ λ°©μμ λ½μ μ΅μννλλ° λμμ μ£Όμ§λ§,
λ§μ½ μνν΄μΌν μ°μ°μ κ·λͺ¨κ° ν¬λ€λ©΄ 곡μ μμμ μνμ μ΄λ₯Ό 볡μ¬ν κ°μ΄ μΌμΉν νλ₯ μ΄ μ μ΄μ Έ
무ν 루νλ₯Ό νμΆνλ λΉμ¨μ΄ μ€ μ μκ³ , λ μ΄μ΄ λμλ©΄ λμμ± λ¬Έμ κ° μ¬μ ν λ°μν μ μκΈ° λλ¬Έμ λ§λ₯μ μλλ€.
λ°λλ½μ ννΌ
μ€μΌμ€λ§μ ν΅ν λ°©μ
μ€λ λ 1κ³Ό μ€λ λ 2κ° λ°λλ½ λ°μ κ°λ₯μ±μ΄ μ‘΄μ¬νλ€λ κ²μ μ¬μ μ μΈμ§ν μ μλ€λ©΄,
ν΄λΉ μν©μμλ μ€μΌμ€λ§μ ν΅ν΄ λ°λλ½μ νΌν μ μλ€.
μ€λ λ 1κ³Ό μ€λ λ 2κ° λμμ μ€νλλ μν©μ΄ λ¬Έμ κ° λλ κ²μ΄κΈ° λλ¬Έμ,
μ€μΌμ€λ¬κ° μ΄λ₯Ό μΈμ§νκ³ μ€λ λ 1μ΄ μ€νλλ λμμλ μ€λ λ 2λ₯Ό μ€νμν€μ§ μμΌλ©΄ λλ κ²μ΄λ€.
λ€λ§ ν΄λΉ λ°©μμ μ€λ λ κ° λ³λ ¬ μ²λ¦¬λ₯Ό μ ν΄ν μ μκΈ° λλ¬Έμ μ±λ₯μ μ΄μκ° λ°μν μλ μλ€.
'CS > CS μ€ν°λ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
νμ΄μ§ κ΅μ²΄ μ μ± (0) | 2023.04.04 |
---|---|
μΈκ·Έλ©ν μ΄μ & νμ΄μ§ κΈ°λ² (0) | 2023.04.04 |
Race Condition (0) | 2023.03.30 |
Mutex & Semaphore (0) | 2023.03.26 |
CPU μ€μΌμ€λ§ (0) | 2023.03.25 |