1. μ°λ λ (Thread)λ?
- νλ‘κ·Έλ¨(νλ‘μΈμ€)μ μ€ν λ¨μμ΄λ©°, νλμ νλ‘μΈμ€λ μ¬λ¬κ°μ μ°λ λλ‘ κ΅¬μ±μ΄ κ°λ₯νλ€.
- νλμ νλ‘μΈμ€λ₯Ό ꡬμ±νλ μ°λ λλ€μ νλ‘μΈμ€μ ν λΉλ λ©λͺ¨λ¦¬, μμ λ±μ 곡μ νλ€.
- νλ‘μΈμ€μ κ°μ΄ μ€ν, μ€λΉ, λκΈ° λ±μ μ€ν μνλ₯Ό κ°μ§λ©° μ€ν μνκ° λ³ν λλ§λ€ μ°λ λ λ¬Έλ§₯κ΅ν(context switching)μ μννλ€.
- κ° μ°λ λλ³λ‘ μμ λ§μ μ€νκ³Ό λ μ§μ€ν°λ₯Ό κ°μ§λ€.
2. νλ‘μΈμ€ μ μ°λ λ
(1) Process
- νλ‘μΈμ€λ μ€ν μ€μΈ νλ‘κ·Έλ¨μΌλ‘ λ©λͺ¨λ¦¬μ μ μ¬λμ΄ μ΄μ체μ λ‘λΆν° CPUμ μμ€ν μμμ ν λΉ λ°μ μ μλ κ²μ λ§νλ€.
(2) Thread
- μ°λ λλ νλ‘μΈμ€μ μ€ν λ¨μλΌκ³ ν μ μλ€.
- ν νλ‘μΈμ€ λ΄μμ λμλλ μ¬λ¬ μ€ν νλ¦μΌλ‘ νλ‘μΈμ€ λ΄μ μ£Όμ 곡κ°μ΄λ μμμ 곡μ ν μ μλ€.
- μ΄ κ²½μ° κ°κ°μ μ°λ λλ λ 립μ μΈ μμ μ μνν΄μΌ νκΈ° λλ¬Έμ κ°μμ μ€νκ³Ό PC λ μ§μ€ν° κ°μ κ°κ³ μλ€.
(3) Process & Thread
- κΈ°λ³Έμ μΌλ‘ νλμ νλ‘μΈμ€κ° μμ±λλ©΄ νλμ μ°λ λκ° κ°μ΄ μμ±λλ€. μ΄λ₯Ό λ©μΈ μ°λ λλΌκ³ λΆλ₯΄λ©°, μ°λ λλ₯Ό μΆκ°λ‘ μμ±νμ§ μλ ν λͺ¨λ νλ‘κ·Έλ¨ μ½λλ λ©μΈ μ°λ λμμ μ€νλλ€. κ° νλ‘μΈμ€λ λ³λμ μ£Όμ 곡κ°μμ μ€νλλ©° ν νλ‘μΈμ€λ λ€λ₯Έ νλ‘μΈμ€μ λ³μλ μλ£ κ΅¬μ‘°μ μ κ·Όν μ μμ΅λλ€. ν νλ‘μΈμ€κ° λ€λ₯Έ νλ‘μΈμ€μ μμμ μ κ·Όνλ €λ©΄ νλ‘μΈμ€ κ° ν΅μ (IPC, inter-process communication)μ μ¬μ©ν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄ νμ΄ν, νμΌ, μμΌ λ±μ΄ μ΄μ ν΄λΉν©λλ€.
- μ°λ λλ ν νλ‘μΈμ€ λ΄μμ λμλλ μ¬λ¬ μ€νμ νλ¦μΌλ‘ νλ‘μΈμ€ λ΄μμ κ°κ° Stackλ§ λ°λ‘ ν λΉ λ°κ³ Code, Data, Heap μμμ 곡μ νλ€. μ°λ λλ ν νλ‘μΈμ€ λ΄μμ λμλλ μ¬λ¬ μ€νμ νλ¦μΌλ‘ νλ‘μΈμ€ λ΄μ μ£Όμ 곡κ°μ΄λ μμλ€μ κ°μ νλ‘μΈμ€ λ΄μ μ°λ λλΌλ¦¬ 곡μ νλ©΄μ μ€νλλ€. λ°λΌμ ν μ°λ λκ° νλ‘μΈμ€ μμμ λ³κ²½νλ©΄ λ€λ₯Έ μ΄μ μ°λ λλ κ·Έ λ³κ²½ κ²°κ³Όλ₯Ό μ¦μ λ³Ό μ μλ€.
3. Multi-Process & Multi-Thread
(1) Multi-Process
- νλμ μμ©νλ‘κ·Έλ¨μ μ¬λ¬ κ°μ νλ‘μΈμ€λ‘ ꡬμ±νμ¬ κ° νλ‘μΈμ€κ° νλμ μμ (ν μ€ν¬)μ μ²λ¦¬νλλ‘ νλ κ²μ΄λ€.
- Context Switching κ³Όμ μμ μΊμ¬ λ©λͺ¨λ¦¬ μ΄κΈ°ν λ± λ¬΄κ±°μ΄ μμ
μ΄ μ§νλκ³ λ§μ μκ°μ΄ μλͺ¨ λλ λ±μ μ€λ²ν€λκ° λ°μνκ² λλ€. νλ‘μΈμ€λ κ°κ°μ λ
립λ λ©λͺ¨λ¦¬ μμμ ν λΉλ°μκΈ° λλ¬Έμ νλ‘μΈμ€ μ¬μ΄μμ 곡μ νλ λ©λͺ¨λ¦¬κ° μμ΄ Context Switchingκ° λ°μνλ©΄ μΊμ¬μ μλ λͺ¨λ λ°μ΄ν°λ₯Ό λͺ¨λ 리μ
νκ³ λ€μ μΊμ¬ μ 보λ₯Ό λΆλ¬μμΌ νκΈ°
λλ¬Έμ΄λ€.
* Context Switchingλ? - CPUμμ μ¬λ¬ νλ‘μΈμ€λ₯Ό λμκ°λ©΄μ μμ μ μ²λ¦¬νλ λ° μ΄ κ³Όμ μ Context SwitchingλΌ νλ€. - ꡬ체μ μΌλ‘ λμ μ€μΈ νλ‘μΈμ€κ° λκΈ°λ₯Ό νλ©΄μ ν΄λΉ νλ‘μΈμ€μ μν(Context)λ₯Ό 보κ΄νκ³ λκΈ°νκ³ μλ λ€μ μμμ νλ‘μΈμ€κ° λμνλ©΄μ μ΄μ μ 보κ΄νλ νλ‘μΈμ€μ μνλ₯Ό 볡ꡬνλ μμ μ λ§νλ€.
(2) Multi-Thread
- νλμ μμ©νλ‘κ·Έλ¨μ μ¬λ¬ κ°μ μ°λ λλ‘ κ΅¬μ±νκ³ κ° μ°λ λλ‘ νμ¬κΈ νλμ μμ μ μ²λ¦¬ νλλ‘ νλ κ²μ΄λ€.
- μλμ°, 리λ μ€ λ± λ§μ μ΄μ체μ λ€μ΄ λ©ν° νλ‘μΈμ±μ μ§μνκ³ μμ§λ§ λ©ν° μ°λ λ©μ κΈ°λ³ΈμΌλ‘ νκ³ μλ€.
- μΉ μλ²λ λνμ μΈ λ©ν° μ°λ λ μμ© νλ‘κ·Έλ¨μ΄λ€.
- μ°λ λλ νλ‘μΈμ€ λ΄μ Stack μμμ μ μΈν λͺ¨λ λ©λͺ¨λ¦¬λ₯Ό 곡μ νκΈ° λλ¬Έμ ν΅μ μ λΆλ΄μ΄ μ λ€.
- μ°λ λ μ¬μ΄μ μμ λμ΄ μμ Context Switchingμ΄ λΉ λ₯΄λ€.
** μ°λ λ κ°μ μμ 곡μ λ μ μ λ³μ(λ°μ΄ν° μΈκ·Έλ¨ΌνΈ)λ₯Ό μ΄μ©νλ―λ‘ ν¨κ» μμ©ν λ μΆ©λμ΄ λ°μν μ μλ€.
4. GIL (Global Interpreter Lock)μ΄λ?
- μ»΄ν¨ν° μΈμ΄μμ μ¬μ©λλ 맀컀λμ¦μ΄λ€. Pythonμ μ½λκ° μ€νλ λ interpreterλ₯Ό ν΅ν΄ μ€ν(bytecode)λλλ°, μ΄λ μ€νλκΈ°ν μ€λ λλ₯Ό νλμ μ€λ λκ° νλ²μ μ€νν μ μλλ‘νλ κ²μ΄ GILμ΄λ€.
- λμ²λΌ μ μ κ°λ°μλΌλ©΄ λλ체 무μ¨μ리μΈμ§ νλλ μλΏμ§ μμ κ² μ μμ΄λ€. 5λ²μ 보μ
5. GIL κ·Έλ¦¬κ³ μκ³κ΅¬μ
(1) μ°λ λ μμ (Thread Safe)
- λ©ν° μ€λ λ νλ‘κ·Έλλ°μμ μΌλ°μ μΌλ‘ μ΄λ€ ν¨μλ λ³μ, νΉμ κ°μ²΄κ° μ¬λ¬ μ€λ λλ‘λΆν° λμμ μ κ·Όμ΄ μ΄λ£¨μ΄μ Έλ νλ‘κ·Έλ¨μ μ€νμ λ¬Έμ κ° μμμ λ»νλ€. λ³΄λ€ μλ°νκ²λ νλμ ν¨μκ° ν μ€λ λλ‘λΆν° νΈμΆλμ΄ μ€ν μ€μΌ λ, λ€λ₯Έ μ€λ λκ° κ·Έ ν¨μλ₯Ό νΈμΆνμ¬ λμμ ν¨κ» μ€νλλλΌλ κ° μ€λ λμμμ ν¨μμ μν κ²°κ³Όκ° μ¬λ°λ‘ λμ€λ κ²μΌλ‘ μ μνλ€.
- μμ μ΄λ―Έμ§λ μ°λ λκ° μμ νμ§ μμ μν©μμ λ²μ΄μ§λ μΌμ΄λ€. 곡μ μμμ μ΄μ©ν΄ μ°λ λλ€μ΄ λμ μ κ·Όν κ²½μ° μ°λ λλΌλ¦¬ κ²½μ μν(Race condition)κ° λμ΄ μ ν λ§λ μλλ κ²°κ³Όκ°μ΄ λμ¨λ€λ κ° DeadLock(κ΅μ°©μν)μ λΉ μ Έλ²λ¦΄ μ μλ€. μκ³κ΅¬μ(Critical section)μ μ΄λ λ μ΄μμ μ€λ λκ° λμμ μ κ·Όν΄μλ μλλ 곡μ μμμ μ κ·Όνλ μ½λμ μΌλΆλ₯Ό λ§νλ€.
- λ°λΌμ λ©ν° μ°λ λ νκ²½μμλ μ°λ λ μμ μ μνλ₯Ό μ μ§μΌμ€μΌνλ€.
(2) GIL μν
- μμμ 보μλ―μ΄, μκ³κ΅¬μμ μ°λ λλ€μ΄ νκΊΌλ²μ μ κ·Όνμ§ λͺ»νκ² νλλ‘ λ€μν 맀컀λμ¦μ΄ μ‘΄μ¬νλ€.
- κ·Έ μ€μμ Pythonμ Mutex λ°©λ²μ μ°¨μ©νμ¬ Interpreter μ°¨μμμ Lockμ κ±Έμ΄λ²λ € μ체μ μΌλ‘ μ±κΈμ°λ λλ‘ μ°μ΄λλ‘ λ§λ€μλλ° κ·Έκ² λ°λ‘ GILμ΄λΌλ κ²μ΄λ€.