π Multi Process && Multi Thread
λ©ν° νλ‘μΈμ€
λ©ν° νλ‘μΈμ€(Multi Process)λ νλμ νλ‘κ·Έλ¨μ μ¬λ¬ κ°μ νλ‘μΈμ€λ‘ λλμ΄ λμμ μ€ννλ λ°©μμ΄λ€.
μμμ μ€λͺ
νλ―μ΄ νλ‘μΈμ€λ κ°κ° λ
립λ λ©λͺ¨λ¦¬ 곡κ°(Address Space)μ κ°μ§λ€.
λ°λΌμ μ¬λ¬ νλ‘μΈμ€κ° λμμ μ€νλλλΌλ μλ‘μ λ©λͺ¨λ¦¬μ μ§μ μ κ·Όν μ μλ€.
μλ₯Ό λ€μ΄ μΉ λΈλΌμ°μ λ₯Ό μκ°ν΄λ³΄μ.
ν¬λ‘¬(Chrome)μ κ° νμ νλμ νλ‘μΈμ€λ‘ μ€ννλ€.
μ΄λ€ νμμ μ€λ₯κ° λ°μν΄λ λ€λ₯Έ νμ΄ μ’
λ£λμ§ μλ μ΄μ λ λ°λ‘ μ΄ λλ¬Έμ΄λ€.
μ΄ν΄νκΈ° μ½κ² λ§₯λλ λλ₯Ό λΉμ λ‘ λ€μ΄λ³΄μ
νλ‘μΈμ€κ° λ§₯λλ λ κ°κ² νλλΌλ©΄, λ©ν° νλ‘μΈμ€λ λ§₯λλ λ μ§μ μ μ¬λ¬ κ° μ¬λ κ²κ³Ό λΉμ·νλ€.
κ°λ¨μ , νλμ , μ μ΄μ μ²λΌ
κ° κ°κ²λ μμ ν λ
립λ 곡κ°μμ μ΄μλλ€.
λ§μ½ νλμ μμ λ¬Έμ κ° μ겨 λ¬Έμ λ«λλΌλ κ°λ¨μ μ΄λ μ μ΄μ μ μ μμ μΌλ‘ μ΄μλλ€.
μ΄μ²λΌ λ©ν° νλ‘μΈμ€λ κ° νλ‘μΈμ€κ° μλ‘ λ
립μ μΌλ‘ λμνκΈ° λλ¬Έμ μμ μ±μ΄ λλ€.
νμ§λ§ λ©ν° νλ‘μΈμ€ κ΅¬μ‘°κ° νμ μ’μ κ²λ§μ μλλ€.
νλ‘μΈμ€λ μλ‘ μμ ν λ
립λ λ©λͺ¨λ¦¬ 곡κ°μ μ¬μ©νκΈ° λλ¬Έμ
νλ‘μΈμ€λ₯Ό μλ‘ μμ±νλ λ°μλ λΉκ΅μ λ§μ λΉμ©μ΄ λ€μ΄κ°λ€.
λν μ¬λ¬ νλ‘μΈμ€λ₯Ό λμμ μ€ννλ €λ©΄
μ΄μ체μ κ° CPUλ₯Ό λ²κ°μκ°λ©° ν λΉν΄ μ£Όμ΄μΌ νλ€.
μ¬κΈ°μ λ±μ₯νλ κ°λ
μ΄ λ°λ‘ Context Switchingμ΄λ€.
Context Switchingμ CPUκ° ν νλ‘μΈμ€λ₯Ό μ€ννλ€κ° λ€λ₯Έ νλ‘μΈμ€λ‘ μμ
μ λ°κΎΈλ κ³Όμ μ λ§νλ€.
μ‘°κΈ λ μ½κ² μ΄ν΄νκΈ° μν΄ λ€μ λ§₯λλ λ μμλ₯Ό λ€μ΄λ³΄μ.
μκΉ λ©ν° νλ‘μΈμ€λ₯Ό μ¬λ¬ κ°μ λ§₯λλ λ μ§μ μ΄λΌκ³ μ€λͺ
νλ€.
μ΄λ²μλ μ§μ ν λͺ
μ΄ μ¬λ¬ μλμ μλνλ μν©μ μκ°ν΄λ³΄μ.
μλ A μ£Όλ¬Έ λ°κΈ° β μ κΉ λ©μΆ€
μλ B μ£Όλ¬Έ λ°κΈ° β μ κΉ λ©μΆ€
μλ C κ³μ° β λ€μ A νλ²κ±° λ§λ€κΈ°
μ΄λ κ² μ§μμ΄ κ³μ μΌμ λ°κΏκ°λ©° μ²λ¦¬νλ©΄ κ²μΌλ‘ 보기μλ μ¬λ¬ μλμ λμμ μλνλ κ²μ²λΌ 보μΈλ€.
νμ§λ§ μΌμ λ°κΏ λλ§λ€ μ§μμ μ΄μ μ£Όλ¬Έμ΄ μ΄λκΉμ§ μ§νλλμ§ κΈ°μ΅ν΄μΌ νκ³ , λ€μ μ£Όλ¬Έ λ΄μ©μ νμΈν΄μΌ νκ³ , νμν μ¬λ£λ₯Ό λ€μ νμΈν΄μΌ νλ€.
μ΄μ²λΌ μμ
μ λ°κΏ λλ§λ€ μ€λΉ κ³Όμ μ΄ νμν κ²μ΄ λ°λ‘ Context Switchingμ΄λ€.
μ΄μ체μ μμλ λΉμ·νλ€.
CPUκ° ν νλ‘μΈμ€λ₯Ό μ€ννλ€κ° λ€λ₯Έ νλ‘μΈμ€λ‘ λ°λ λλ CPU λ μ§μ€ν° μν μ μ₯, νλ‘κ·Έλ¨ μ€ν μμΉ μ μ₯, λ€μ νλ‘μΈμ€ μν λΆλ¬μ€κΈ°μ κ°μ μμ
μ΄ νμνλ€.
μ΄ κ³Όμ μ΄ λ°λ‘ Context Switching λΉμ©μ΄λ€.
κ·Έλμ λ©ν° νλ‘μΈμ€λ μμ μ±μ΄ λμ λμ μ΄λ¬ν μ ν λΉμ©μ΄ λ°μνλ€λ νΉμ§μ΄ μλ€.
λ©ν° νλ‘μΈμ€ vs λ©ν° νλ‘μΈμ
λ°μμ΄ λΉμ·ν΄μ λμ΄ κ·Έλ₯ μ΅μ μ°¨μ΄λΌκ³ μκ°ν μ μλλ° μμ°ν λ€λ₯΄λ€.
νλ‘μΈμ€(process)λ νλ‘κ·Έλ¨μ μ€ν μνλ₯Ό λ§νκ³ , νλ‘μΈμ(processer)λ CPU μ½μ΄λ₯Ό μΌμ»«λλ€.
λ°λΌμ λ©ν° νλ‘μΈμ€λ νλμ νλ‘κ·Έλ¨μμ μ¬λ¬ κ°μ νλ‘μΈμ€λ₯Ό μ€ννλ κ²μ μλ―Ένκ³ , λ©ν° νλ‘μΈμλ μ¬λ¬ κ°μ CPU μ½μ΄κ° νλμ μμ€ν
μμ λμμ μ€νλλ κ²μ μλ―Ένλ€.
κ°λ°μμ κ΄μ μμ λ³Έ Multi Process
μ΄λ‘ μ μΈ μ€λͺ
μ μΆ©λΆν νμΌλ μ΄μ κ°λ°μμ κ΄μ μμ ν λ² μκ°ν΄λ³΄μ.
βκ·Έλμ λ©ν° νλ‘μΈμ€κ° μ°λ¦¬κ° μ½λ©νλ λ° μ€μ λ‘ λμμ΄ λλ κ±ΈκΉ?β
γ
γ
λΉμ°νλ€.
νΉν CPU μ°μ°μ΄ λ§μ μμ
μμλ λ©ν° νλ‘μΈμ€κ° ν° λμμ΄ λλ€.
μλ₯Ό λ€μ΄ Pythonμμλ multiprocessingμ΄λΌλ λͺ¨λμ μ΄μ©ν΄ μλ‘μ΄ νλ‘μΈμ€λ₯Ό μμ±ν μ μλ€.
μ½λλ₯Ό νλ² μ΄ν΄λ³΄μ.
import multiprocessing
def hello():
print("νλ‘μΈμ€ μ€ν")
if __name__ == "__main__":
p1 = multiprocessing.Process(target=hello)
p2 = multiprocessing.Process(target=hello)
p1.start()
p2.start()
p1.join()
p2.join()
μ΄ μ½λλ hello()λΌλ ν¨μλ₯Ό μ€ννλ λ κ°μ νλ‘μΈμ€λ₯Ό μμ±νλ€.
start()λ₯Ό νΈμΆνλ©΄ μλ‘μ΄ νλ‘μΈμ€κ° μμ±λλ©΄μ ν¨μκ° μ€νλκ³ ,
join()μ ν΄λΉ νλ‘μΈμ€κ° λλ λκΉμ§ κΈ°λ€λ¦¬λ μν μ νλ€.
μ¦ νλμ νλ‘κ·Έλ¨ μμμ μ¬λ¬ κ°μ νλ‘μΈμ€κ° λμμ μ€νλλ κ΅¬μ‘°κ° λλ κ²μ΄λ€.
μ€μ κ°λ°μμλ λλμ λ°μ΄ν° μ²λ¦¬, μ΄λ―Έμ§ μ²λ¦¬, λ¨Έμ λ¬λ νμ΅, μμΉ κ³μ°κ³Ό κ°μ CPU μ°μ° μμ
κ³Ό κ°μ μν©μμ λ©ν° νλ‘μΈμ€λ₯Ό μ¬μ©νλ€.
μλ₯Ό λ€μ΄ μ΄λ―Έμ§ 1000μ₯μ μ²λ¦¬ν΄μΌ νλ€κ³ κ°μ ν΄λ³΄μ.
νλ‘μΈμ€λ₯Ό νλλ§ μ¬μ©νλ©΄ μ΄λ―Έμ§λ₯Ό νλμ© μμλλ‘ μ²λ¦¬ν΄μΌ νλ€.
νμ§λ§ λ©ν° νλ‘μΈμ€λ₯Ό μ¬μ©νλ©΄
νλ‘μΈμ€ 1 β μ΄λ―Έμ§ 1~250 μ²λ¦¬
νλ‘μΈμ€ 2 β μ΄λ―Έμ§ 251~500 μ²λ¦¬
νλ‘μΈμ€ 3 β μ΄λ―Έμ§ 501~750 μ²λ¦¬
νλ‘μΈμ€ 4 β μ΄λ―Έμ§ 751~1000 μ²λ¦¬
μ΄μ²λΌ νλμ ν° μμ
μ μ¬λ¬ κ°μ νλ‘μΈμ€λ‘ λλμ΄ μ²λ¦¬ν μ μλ€.
μ΄λ κ² λλ©΄ κ° νλ‘μΈμ€κ° μλ‘ λ€λ₯Έ CPU μ½μ΄μμ λμμ μμ
μ μνν μ μκΈ° λλ¬Έμ μ 체 μ²λ¦¬ μλλ₯Ό ν¬κ² ν₯μμν¬ μ μλ€.
μ¦ λ©ν° νλ‘μΈμ€λ λ¨μν νλ‘κ·Έλ¨μ μ¬λ¬ κ° μ€ννλ κ°λ
μ΄ μλλΌ, ν° μμ
μ μ¬λ¬ κ°μ μμ μμ
μΌλ‘ λλμ΄ λ³λ ¬λ‘ μ²λ¦¬νκΈ° μν λ°©λ²μ΄λΌκ³ λ³Ό μ μλ€.
νΉν λ°μ΄ν° μ²λ¦¬, μμ μ²λ¦¬, λ¨Έμ λ¬λ νμ΅μ²λΌ CPU μ°μ°μ΄ λ§μ μμ
μμλ μ΄λ¬ν κ΅¬μ‘°κ° νλ‘κ·Έλ¨μ μ±λ₯μ ν¬κ² ν₯μμν€λ μ€μν μμκ° λλ€.
λ©ν° μ€λ λ
λ©ν° μ€λ λ(Multi Thread)λ νλμ νλ‘μΈμ€ μμμ μ¬λ¬ κ°μ μ€λ λλ₯Ό λμμ μ€ννλ λ°©μμ΄λ€.
μμμ μ€λͺ
νλ―μ΄ μ€λ λλ νλ‘μΈμ€κ° ν λΉλ°μ μμμ μ΄μ©νλ μ€ν νλ¦μ λ¨μμ΄λ€.
λ©ν° νλ‘μΈμ€κ° μ¬λ¬ κ°μ κ°κ²λ₯Ό μ΄μνλ ꡬ쑰μλ€λ©΄
λ©ν° μ€λ λλ κ°κ²λ νλμ§λ§ μ§μμ΄ μ¬λ¬ λͺ
μΈ κ΅¬μ‘°λΌκ³ μκ°νλ©΄ λλ€.
λ§₯λλ λ μμλ‘ λ€μ μκ°ν΄λ³΄μ.
μ§μμ΄ ν λͺ
λΏμ΄λΌλ©΄
μλ A μ£Όλ¬Έ λ°κΈ°
β νλ²κ±° λ§λ€κΈ°
β κ°μνκΉ νκΈ°κΈ°
β κ³μ°
β μλ B μ£Όλ¬Έ λ°κΈ°
μ΄λ κ² λͺ¨λ μΌμ μμλλ‘ μ²λ¦¬ν΄μΌ νλ€.
νμ§λ§ μ§μμ΄ μ¬λ¬ λͺ
μ΄λΌλ©΄ μν©μ΄ λ¬λΌμ§λ€.
μ§μ 1 β μ£Όλ¬Έ λ°κΈ°
μ§μ 2 β νλ²κ±° λ§λ€κΈ°
μ§μ 3 β κ³μ°
μ΄λ κ² κ°μ κ°κ² μμμ μ¬λ¬ μμ
μ΄ λμμ μ§νλ μ μλ€.
μ΄κ²μ΄ λ°λ‘ λ©ν° μ€λ λ ꡬ쑰μ΄λ€.
λ©ν° μ€λ λλ νλμ νλ‘μΈμ€ μμμ μ€νλκΈ° λλ¬Έμ
Code, Data, Heap μμμ μλ‘ κ³΅μ νλ€.
κ·Έλμ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ κ³Όμ μ΄ λΉ λ₯΄κ³ νλ‘μΈμ€λ₯Ό μλ‘ μμ±νλ κ²λ³΄λ€ ν¨μ¬ κ°λ³λ€.
λ©ν° μ€λ λμ νΉμ§
β’ μ€λ λ μμ± λΉμ©μ΄ μλ€
β’ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ λ€
β’ λ°μ΄ν° 곡μ κ° μ½λ€
β’ νλ‘κ·Έλ¨ μλ΅μ±μ΄ μ’μμ§λ€
μλ₯Ό λ€μ΄ μΉ μλ²λ₯Ό μκ°ν΄λ³΄μ.
μ¬λ¬ μ¬μ©μκ° λμμ μ μνλ©΄ κ° μμ²μ νλμ μ€λ λκ° μ²λ¦¬ν μ μλ€.
μμ² 1 β Thread 1
μμ² 2 β Thread 2
μμ² 3 β Thread 3
μ΄λ κ² μ¬λ¬ μμ²μ λμμ μ²λ¦¬ν μ μκΈ° λλ¬Έμ μΉ μλ²μ μ²λ¦¬ μ±λ₯μ΄ ν¬κ² ν₯μλλ€.
νμ§λ§ λ©ν° μ€λ λ ꡬ쑰μλ λ¨μ μ΄ μ‘΄μ¬νλ€.
μ€λ λλ κ°μ νλ‘μΈμ€ μμμ λ©λͺ¨λ¦¬λ₯Ό 곡μ νκΈ° λλ¬Έμ
μ¬λ¬ μ€λ λκ° λμμ κ°μ λ°μ΄ν°λ₯Ό μμ νλ©΄ λ¬Έμ κ° λ°μν μ μλ€.
μ΄λ λ±μ₯νλ κ°λ
μ΄ λ°λ‘ Race Condition(κ²½μ μν)μ΄λ€.
Race Condition
Race Conditionμ μ¬λ¬ μ€ν νλ¦μ΄ κ°μ λ°μ΄ν°λ₯Ό λμμ μμ νλ € ν λ λ°μνλ λ¬Έμ λ₯Ό λ§νλ€.
μ΄λ¦ κ·Έλλ‘ λκ° λ¨Όμ μ€νλλλμ λ°λΌ κ²°κ³Όκ° λ¬λΌμ§λ μν©μ΄λ€.
λ€μ λ§₯λλ λ μμλ‘ μκ°ν΄λ³΄μ.
μ§μ λ λͺ
μ΄ κ°μ μ£Όλ¬Έμλ₯Ό λ³΄κ³ μλ€κ³ κ°μ νμ.
νμ¬ μ£Όλ¬Έμμλ μ΄λ κ² μ ν μλ€.
νλ²κ±° μ¬κ³ : 10κ°
μλ λ λͺ
μ΄ λμμ νλ²κ±°λ₯Ό μ£Όλ¬Ένλ€.
μ§μ A β μ¬κ³ νμΈ β 10κ°
μ§μ B β μ¬κ³ νμΈ β 10κ°
μ§μ A β 1κ° νλ§€ β μ¬κ³ 9κ°
μ§μ B β 1κ° νλ§€ β μ¬κ³ 9κ°
νμ§λ§ μ€μ λ‘λ νλ²κ±°κ° 2κ° νλ ΈκΈ° λλ¬Έμ μ¬κ³ λ 8κ°κ° λμ΄μΌ νλ€.
μ΄μ²λΌ μ¬λ¬ μ€ν νλ¦μ΄ λμμ κ°μ λ°μ΄ν°λ₯Ό μμ νλ©΄μ
λ°μ΄ν°κ° κΌ¬μ΄λ λ¬Έμ κ° λ°μν μ μλ€.
μ΄κ²μ΄ λ°λ‘ Race Conditionμ΄λ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ©ν° μ€λ λ νκ²½μμλ λκΈ°ν(Synchronization) κΈ°λ²μ μ¬μ©νλ€.
λνμ μΈ λ°©λ²μΌλ‘λ Mutex, Semaphore, Lockλ±μ΄ μ‘΄μ¬νλ€.
μ΄λ¬ν κΈ°λ²λ€μ ν λ²μ νλμ μ€λ λλ§ μμμ μ κ·Όνλλ‘ μ ννμ¬
λ°μ΄ν° μΆ©λμ λ°©μ§νλ μν μ νλ€. μ΄μ λν΄μλ μΆν μμΈν μ€λͺ
μ ν΄λ³΄κ² λ€.
μ 리
μ§κΈκΉμ§ λ©ν° νλ‘μΈμ€μ λ©ν° μ€λ λμ κ°λ
μ μ΄ν΄λ³΄μλ€.
λ©ν° νλ‘μΈμ€λ νλ‘μΈμ€λ§λ€ λ
립λ λ©λͺ¨λ¦¬ 곡κ°μ μ¬μ©νκΈ° λλ¬Έμ μμ μ±μ΄ λμ§λ§
νλ‘μΈμ€ μμ± λΉμ©κ³Ό Context Switching λΉμ©μ΄ ν¬λ€.
λ°λ©΄ λ©ν° μ€λ λλ κ°μ νλ‘μΈμ€ μμμ λ©λͺ¨λ¦¬λ₯Ό 곡μ νκΈ° λλ¬Έμ
λ λΉ λ₯΄κ³ ν¨μ¨μ μΌλ‘ μμ
μ μ²λ¦¬ν μ μμ§λ§
Race Conditionκ³Ό κ°μ λκΈ°ν λ¬Έμ κ° λ°μν μ μλ€.
λ°λΌμ μ€μ μμ€ν
μμλ νλ‘κ·Έλ¨μ νΉμ±κ³Ό λͺ©μ μ λ°λΌ
λ©ν° νλ‘μΈμ€μ λ©ν° μ€λ λλ₯Ό μ μ ν μ ννκ±°λ
λ λ°©μμ ν¨κ» μ¬μ©νλ ꡬ쑰λ₯Ό μ¬μ©νλ€.
μ°λ¦¬κ° μ무 μκ° μμ΄ λλ₯΄λ λ²νΌ νλ λ€μλ, μλ§μ νλ‘μΈμ€μ μ€λ λκ° λμμ μμ§μ΄κ³ μλ€.