π¦Multitasking 201 1νΈ
https://luavis.me/server/multitasking-201-1λ°μ±λ¬Έ
μ¬ νν΄μλ κ°μΈμ μΌλ‘ λ§μ μΌλ€μ΄ μμμ΅λλ€. ν΄μ μμμ μ΄μ§μ€λΉλ‘ λΆν° μμλμκ³ TLλ‘ λ§λ¬΄λ¦¬ μ§μ΄μΌνλ νλ‘μ νΈλ€λ μμμ΅λλ€. νμ¬λ μλ‘μ΄ μ§μ₯μμ λΉκ΅μ νλ μΌκ³Όλ λ€λ₯Έ λ€μν νλ«νΌμ 맑μΌλ©΄μ μΌνκ³ μλλ° λ³νΉλ μμνκ³ νμ¬μΌλ λ§€μ° λ°λΉ μ νμ νκ³λλ©΄μ λ μ€μ€λ‘ 곡λΆν΄μΌνλ λ°©ν₯λ μ΄μ§ μμ΄μ λΈλ‘κΉ μ κ²μ리 νμ΅λλ€.
μ΄ λΈλ‘κ·Έλ μ€μ€λ‘ 무μΈκ° κΉκ² 곡λΆνκ±°λ μ€νν΄λ³΄κ³ λ κ²°κ³Όλ₯Ό μ΄μΌκΈ°νκ³ μΆμμ§λ§ μ΅κ·Όμ 곡λΆνλ RLμ΄λ μκ³ λ¦¬μ¦ μͺ½μ λ΄κ° μ μλ€κ³ ν λ§ν μ μ₯μ΄ μλκ² κ°μμ μ°κΈ° μ’ λΆλλ¬μ κΈ μ°κΈ°λ ννΌνκ² λκ³ μ μ°λ€ 보λ λΈλ‘κ·Έμ κ±°λ¦¬κ° λ©μ΄μ§κ² κ°μ΅λλ€.
κ·Έλλ μλλΆν° μ¨μ€λ λλ©μΈλ μ¬μ¬ λ§λ£κΈ°κ°μ΄ λ€κ°μμ μ΄μ λΆν° λ°κΎΈκ³ μΆμλ .kr λλ©μΈλ λ²λ Έκ³ , μ°λ§μ λ§μμ λ§μμ κ°λ€λ¬κ³ μ΄μ μ μμ±νλ κΈμ μ λ¦¬ν΄ μ¬λ¦¬κ³ , μμΌλ‘λ μ‘°κΈ λ κ°λ²Όμ΄ μ£Όμ λ κ°λ³κ² μΈ μ μλλ‘ νκ³ λ°°μ°κ³ λκΌλκ²λ€μ λν΄μλ κ°λ¨ν μ μ΄λ³΄λλ‘ νλ €ν©λλ€. μ¬μ€ μ΄μ μ μ μλ κΈλ€μ΄ κΈμ μ²μ μ¨λ³΄λ μ μ₯μ΄κΈ°λ νκ³ λ²μν¬μΈκ²λ λ§κ³ (μ§κΈμ΄λΌκ³ λ€λ₯Έκ±΄ μλμ§λ§) λ―Έμνλ μ λ€μ΄ λ§μμ μ’ μμ 보μνλ μμ λ μ§νν΄λ³΄κ³ μΆμ§λ§β¦ μ΄κ±΄ μκ°μ΄ λ§μ΄ λ€μ΄μ μ΄λ»κ² λ μ§ λͺ¨λ₯΄κ² λ€μ. κ·Έλλ κ΄λ ¨ ν€μλλ‘ κ²μνλ©΄ λ§μΆ€ κ²μμΈμ§ λͺ¨λ₯΄κ² μ§λ§ μλ¨ λ ΈμΆλμ΄μ (β¦) λΆλλ¬μμλΌλ κ³ μ³λ³ΌκΉ ν©λλ€.
λ³Έλ¬Έ
ν CPUμ μ¬λ¬ μ½μ΄κ° μλ multi-core ννμ νλ‘μΈμκ° μ°μ νμ€μ΄ λλ©΄μ νλ²μ νλμ μμ μ μ²λ¦¬νμ§ μκ³ μμ μ λ€μ€μΌλ‘ μ²λ¦¬νλ(multitasking) κ²μ μμ£Ό μ€λμ λΆν° μ¬μ©λμκ³ κ΅¬ννλ λ°©λ²λ λ§€μ° λ€μν©λλ€. μμ§λμ΄κ° κ°μ₯ μ½κ² multitaskingμ ꡬννλ λ°©λ²μ μ μ΄λ μ μκ²λ threadμΌ κ²μ λλ€. κ³ μ μ μΈ λ°©λ²μ΄μ§λ§ λͺ¨λ μΈμ΄μ νλ«νΌμμ μ§μνλ λ°©μμ multitaskingμ μ²λ¦¬νλ λ°©λ²μ λλ€.
νμ§λ§ multitaskingμ ꡬννλ λ°©λ²μ threadλ₯Ό μ΄μ©νλ κ²λ§ μλκ²μ μλκ³ λ€μν ν¨ν΄μ νμ©νμ¬ κ΅¬νν μ μμ΅λλ€. multitaskingμ κ΄λ ¨λ μ©μ΄λ λ°©λ²λ€μ λν΄μλ μ λ κ²½νμ μΌλ‘ μ»μλ μ§μμ΄λΌ μ€μ€λ‘λ μ λ¦¬κ° μ μλμ΄μμ΅λλ€. κ·Έλμ μ΄λ²μ κ°λ κ³Ό μ©μ΄λ₯Ό νλ‘κ·Έλλ° μΈμ΄μ λ°νμμμλ μ΄λ»κ² ꡬνλμ΄ μλμ§λ μμλ³΄λ €ν©λλ€. μ΄ κΈμ μ리μ¦μμλ Concurrent vs Parallel, Preemptive vs Non-preemptive multitaskingμ κ°λ μ λν΄μ μμλ³΄κ³ μ΄μ΄μ Coroutine, Generator, Thread, Async/Await, Reactiveμ κ°λ λ€κ³Ό Pythonκ³Ό Go μΈμ΄μμλ κ° κ°λ μ μ΄λ»κ² λ°νμμ ꡬννλμ§ μ»€λ λ 벨μμ λμμ λν΄μ μ€λͺ ν μμ μ λλ€.
Concurrentμ Parallelμ λμ§μ±
μ°μ Concurrentμ μμμ¬μ λ»μ νμΈνλ©΄ λ€μκ³Ό κ°μ΅λλ€.
Concurrent
the fact of two or more events or circumstances happening or existing at the same time.
볡μμ μ¬κ±΄μ΄λ μν©μ΄ κ°μ μκ°μ λ²μ΄μ§κ±°λ μ‘΄μ¬νλ κ² μ΄λΌλ ν΄μμ΄ κ°λ₯ν©λλ€. κ°μ μκ°μ΄λΌλ λ§μ΄ μ‘°κΈ μ 맀νμ§λ§ μλ μμ λ₯Ό μκ°ν΄λ³΄λ©΄ μ΄ν΄κ° μ½μ΅λλ€.
κ·Έ μ¬λμ λμμ μ리 3κ°λ₯Ό ν μ μλ€.
μλ₯Ό λ€μ΄ μ리λ₯Ό νλλ° νμ€νλ νκ³ μ€ν μ΄ν¬λ ꡬμ°λ©΄μ μΉν¨λ κ°μ΄ ꡬμ μλμκ² μλΉν μ μλ€λ©΄ μ΄ μ¬λμ λμμ±μ κ°λ μ리μ¬λΌκ³ λ³Ό μ μμ΅λλ€.
λμλΌλ λ§μ μ μ΄μ λ¨μ΄μ νμ λ»μμ λνλ λ― (concurrentλΌλ μμ΄λ λ§μ°¬κ°μ§λ‘) κ°μ μκ°μ 볡μμ μΌμ μ²λ¦¬νλ κ²½μ° λΆμΌ μ μμ΅λλ€. μμ λ¬Έμ₯μ CSμμ μ¬μ©νλ μ©μ΄λ‘ μ΄μ§ λ°κΎΈλ©΄.. μλμ κ°μ΅λλ€.
μ컀 νλκ° λμμ μμ² 100κ°λ₯Ό μ²λ¦¬νλ€.
νλμ μμ»€κ° λμμ μμ²μ 100κ° μ²λ¦¬νλ©΄ λμμ±μ κ°λ μ컀λΌκ³ λ³Ό μ μμ΅λλ€. μΌλ°μ μΈ μλ° μλ²λ‘ 보면 νμ μ컀 νλ‘μΈμκ° μμκ²μ΄κ³ μ컀λ§λ€ μ¬μ©κ°λ₯ν μ€λ λ νμ΄ λ°λ‘ μκΈ°μ, νλμ μ컀λ νμ λμμ 볡μμ μμ²μ μ²λ¦¬ν μ μμ΅λλ€. λ°λΌμ νλμ μ컀λ νμ λμμ±μ κ°κ³ μλ€ λ§ν μ μμ΅λλ€.
λ€μμ μμ μ λμμ μ²λ¦¬νλ κ²μ λκ°μ§ λ°©λ²μ΄ μμ΅λλ€. μμ μκ° ν΄μΌν μΌμ λλ μ λμμ μμ νλ λ°©λ²μ΄ μκ³ μ μ΄μ 볡μμ μμ μκ° λμμ μ²λ¦¬νλ λ°©λ²μ΄ μμκ² μ λλ€.
μκΉ μλ₯Ό λ€μλ μ리μ μλ₯Ό λ€μλ©΄ ν΄μΌνλ μ리λ μ΄ 3κ°λΌλ©΄ νλͺ μ μ리μ¬κ° κ°μ€λ μ§κ° κ°κ³ μλ κ°μ©μ±μ μΆ©λΆν λμ΄λ΄μ μ€ν μ΄ν¬μ νμ€νλ₯Ό μ μ ν νμ΄λ°μ λ§μΆ°κ°λ©΄μ λ§λ€μ΄λ΄κ³ κ·Έμ λμμ μ€λΈμ μΉν¨λ κ΅½λλ€λ©΄ λμμ μΌμ λμμ μ²λ¦¬νλ€κ³ λ³Ό μ μμ΅λλ€. νμ§λ§ μ΄λ° λ°©λ² λ§κ³ 3κ°μ μ리λ₯Ό μ μ΄μ μλ‘ λ€λ₯Έ 3κ°μ μ£Όλ°©μμ μλ‘ λ€λ₯Έ 3λͺ μ μ리μ¬κ° κ°κ° νλͺ μ© μμ λ§μ μ리λ₯Ό μ§ννλ€λ©΄? μ΄ λν λμμ μ리λ₯Ό λ§λ€μλ€κ³ λ³Ό μ μμ΅λλ€.
μμ μμ μμ νμλ λμμ±μ κ°κΈ° μν΄μ λ³λ ¬μ μΌλ‘ μΌμ μ²λ¦¬νλ€κ³ λ³Ό μ μμ΅λλ€. λ κ°λ μ λΉκ΅νλ©΄ λμμ±μ(concurrency)λ νμ λ€λ₯Έ μμ μ μν΄μ μ보ν μ μλ μν(interruptability)λ₯Ό λ§ν©λλ€. λ³λ ¬μ±(parallelism)μ λ€λ₯Έ μμ λ€μ΄ λͺ¨λ λ 립μ μΌλ‘ μ²λ¦¬λκ³ μλ μν(independentability)λ₯Ό μΌμ»«μ΅λλ€.
λ§μΉ νλͺ μ μ리μ¬κ° λμ μμ μ νλ©΄ μ€ν μ΄ν¬λ₯Ό λ€μ§κ³ λλ©΄ νμ€νλ₯Ό μ΄ν΄λ³΄λ©° μμ€λ₯Ό λ£μ΄μ£Όκ³ κ·Έ λ€μμλ μ€λΈμ μμ΄μ΄ λλ μλμ λ£κ³ μΉν¨μ μ€λΈμ λ£λκ² κ°μ΄ λ§μ λλ€. νμ§λ§ λ³λ ¬μ±μ κ°λ λ°©λ²μΈ νμμ λ°©λ²μ λͺ¨λ μμ μ¦ μλ¦¬κ° κ°μ λ 립μ±μ κ°κ³ κ°κ°μ μ리μ¬κ° μ리νκ² λ©λλ€.
μ΄λ₯Ό CSμμ λ°λΌλ³΄λ©΄ λ€μ νλ‘μΈμ (multiprocessor, ννκ²λ λ©ν° μ½μ΄)λ₯Ό μ΄μ©ν΄μ λ€μμ μΌμ μ²λ¦¬νλ©΄ λ³λ ¬μ μΌλ‘ λμμ± μκ² μΌμ μ²λ¦¬νλ λ°©λ²μ λλ€. λ§μ½ νλμ νλ‘μΈμ(μ΄λ μ±κΈμ½μ΄)μμ λ€μμ μΌμ μ²λ¦¬νλ€λ©΄ μ΄λ λμμ±μ΄ μλ€κ³ μ΄μΌκΈ°ν μλ μμ§λ§ κ° μμ μ΄ λ 립λμ΄μ μ²λ¦¬λμ§λ μκΈ° λλ¬Έμ λ³λ ¬μ μ΄λΌκ³ μ΄μΌκΈ°ν μ μμ΅λλ€.
κ·Έλ¬λ©΄ λ³λ ¬μ μΌλ‘ μΌμ μ²λ¦¬νλ©΄ νμ λμμ±μ κ°μκΉμ? κΌ κ·Έλ μ§λ§μ μμ΅λλ€.
λ³λ ¬μ μ΄λ λμμ μ΄μ§ μμλ
λ³λ ¬λ‘ μΌμ μ²λ¦¬ν΄λ νμ λμμ μ΄μ§ μμ΅λλ€. μμ μ리μλ₯Ό λ€μ νλ² λ μΈμ©νλ©΄ 3λͺ μ μ리μ¬κ° μ리νλλ° λ§μ½ κ°μ€λ μΈμ§κ° νλλΌλ©΄ (β¦) μλ‘ λ²κ°μ κ°λ©΄μ μ¬μ©νλ©΄μ μ리ν΄μΌνκΈ° λλ¬Έμ λμμ±μ κ°κΈ° νλλλ€. μ΄λ CSμμλ critical sectionμ΄λΌκ³ μ΄μΌκΈ°ν©λλ€. 곡μ λ³μλ±μ λ¬Έμ λ‘ μΈν΄μ λ³λ ¬μ μΌλ‘ μΌμ μ²λ¦¬νμ§λ§ λ€λ₯Έ μΌμ΄ μ²λ¦¬κ° λλκΈ°λ₯Ό mutexλ₯Ό μ΄μ©ν΄μ κΈ°λ€λ¦¬κ³ μ²λ¦¬λμΌν©λλ€. μ΄λ λ³λ ¬μ μΌλ‘ μΌμ μ²λ¦¬νκ³ λ μμΌλ λμμ μ²λ¦¬λλκ²μ μλκ² λ©λλ€. λ°λΌμ λμμ±κ³Ό λ³λ ¬μ±μ΄ κΌ subsetκ΄κ³μ μλ€κ³ λ³Ό μλ μμ΅λλ€.