
λκΈ°(Synchronous)λ μ νν 무μμ μλ―Ένλκ±ΈκΉ?
μ΄λ² ν¬μ€ν
μμλ I/Oμ λ€νΈμν¬ λ± μ λ°μ μΌλ‘ λ€μν λͺ¨λΈμμ μ¬μ©νλ κ°λ
μΈ λκΈ°(Synchronous)
κ° μ νν 무μμ μλ―Ένλ κ²μΈμ§, κ·Έλ¦¬κ³ λκΈ° λ°©μκ³Ό λΉλκΈ° λ°©μμ μ°¨μ΄μ λν΄μ νλ² μ΄μΌκΈ° ν΄λ³΄λ €κ³ νλ€. κ·Έλ¦¬κ³ μ΄ λ κ°μ§ κ°λ
κ³Ό λ§μ΄ νΌλλλ κ°λ
μΈ λΈλ‘νΉ(Blocking)
κ³Ό λ
ΌλΈλ‘νΉ(Non-Blocking)
μ λν΄μλ κ°λ¨νκ² μ§κ³ λμ΄κ° μμ μ΄λ€.
본격μ μΈ ν¬μ€ν
μ λ€μ΄κ°κΈ°μ μμ νκ°μ§ νμ€νκ² μ΄μΌκΈ°νκ³ μΆμ κ²μ λκΈ°μ λΉλκΈ°λ νλ‘μΈμ€μ μν μμ 보μ₯μ λν 맀컀λμ¦
μ΄κ³ λΈλ‘νΉκ³Ό λ
ΌλΈλ‘νΉμ νλ‘μΈμ€μ μ ν΄ μνμ λν κ°λ
μΌλ‘ μμ ν λ³κ°μ κ°λ
μ΄λΌλ κ²μ΄λ€.
μ무λλ λκΈ°μ λΈλ‘νΉ
, λΉλκΈ°μ λ
ΌλΈλ‘νΉ
μ μλ 맀컀λμ¦μ΄ λ μ§κ΄μ μ΄κΈ° λλ¬Έμ λ§μ μ¬λλ€μ΄ μ΄ κ°λ
λ€μ κ°μ κ² νΉμ λΉμ·ν κ²μΌλ‘ μ€ν΄νκ³ μλλ°, λ°©κΈ μ΄μΌκΈ° νλ―μ΄ μ΄ λκ°μ§ κ°λ
μ μλ‘ μ ν λ€λ₯Έ κ³³μ μ΄μ μ λ§μΆ κ°λ
λ€μ΄λ―λ‘ μλ‘ μ§μ μ μΈ κ΄λ ¨μ κ±°μ μλ€κ³ λ΄λ λλ€. λ¨μ§ μ‘°ν©νμ¬ μ¬μ©λλ κ² λΏμ΄λ€.

출처 - Boost application performance using asynchronous I/O, IBM
μ΄λ―Έ λ§μ λ₯λ ₯μ λΆλ€μ΄ μ΄ μ£Όμ μ λν΄μ μ μ 리ν΄λμ ν¬μ€ν λ€μ΄ μμ§λ§, λλΆλΆ μ΄ κ°λ λ€μ λ¬Άμ΄μ ν¨κ» λ€λ£¨κ³ μκΈ° λλ¬Έμ μ΄ κ°λ λ€μ μ²μ μ νκ±°λ μ»΄ν¨ν° 곡νμ λν΄ μ λͺ¨λ₯΄λ μ¬λμ μ΄ κ°λ λ€μ΄ μλ‘ λκ° μ°κ΄μ΄ μλ κ²μΌλ‘ μ€ν΄νκΈ° μ½λ€. νμ§λ§ λ§μ ν¬μ€ν μμ μ΄ μ£Όμ λ€μ λ¬Άμ΄μ λ€λ£¨λ μ΄μ λ λ¨μ§ μ΄ κ°λ λ€μ ꡬνν ꡬν체μμ μ΄ λ κ°μ§ κ°λ μ΄ ν¨κ» μ¬μ©λκ³ μκΈ° λλ¬Έμ μ΄ κ°λ μ λΆλ¦¬ν΄μ λ°λ‘ μ€λͺ νλ κ²μ΄ λ μ΄λ ΅κΈ° λλ¬Έμ΄λ€.
κ·Έλμ νμλ μ΄μ© μ μμ΄ μ΄ κ°λ
λ€μ ν¨κ» μ€λͺ
νκΈ°λ νμ§λ§, μ§κ΄μ μΈ κ°λ
μΈ λΈλ‘νΉ & λ
ΌλΈλ‘νΉ
보λ€λ μ’ λ μΆμμ μΈ κ°λ
μΈ λκΈ° & λΉλκΈ°
μ μ΄μ μ λ§μΆ°μ μ§νν κ²μ΄λ€.
λκΈ°λ μ νν λ λ»νλ κ±ΈκΉ?
λκΈ°μ κ΄λ ¨λ ν¬μ€ν
λ€μ μ½μ΄λ³΄λ©΄ μ¬λλ§λ€ λκΈ°λΌλ λ¨μ΄λ₯Ό ν΄μν κ²°κ³Όκ° κ°μ§κ°μμ΄λ€. μ΄λ€ μ¬λμ λμμ λ°μνλ κ²
, μ΄λ€ μ¬λμ νΉμ ν ν΄λμ μ ν΄ ν΅μ νλ κ²
, μ΄λ€ μ¬λμ μνλ₯Ό λμΌνκ² λ§λλ κ²
λ± λκΈ°λΌλ λ¨μ΄μ μ°μμκ° λ€μν λ§νΌ λ€μν ν΄μλ€μ΄ μ‘΄μ¬νλ€. λλ체 λκ° λ§λ κ±΄μ§ μκΈ°κ° νλ€λ€.
νμ λν μ²μ λκΈ°λΌλ κ°λ
μ λ°°μΈ λ λκΈ°λΌλ λ¨μ΄μ 맀컀λμ¦μ΄ μ μλΏμ§ μμμ νΌλμ€λ¬μ μλ€. λ λΈλ‘νΉ
κ°μ λ¨μ΄λ λꡬκ°μ΄ μΌμμμ μ ν μ μλ μ€ν¬μΈ μμλ μ¬μ©νκ³ μλλ°λ€κ° λκ°λ₯Ό λ§λλ€
λΌλ λ»μ΄ λ°λ‘ μλΏκΈ° λλ¬Έμ μ‘°κΈ μ΄ν΄νκΈ° μ¬μ΄ νΈμ΄μ§λ§ λκΈ°λ μλλ€.
μΌμμμ μ£Όλ‘ μ νλ λκΈ°μ μ°μμ μ€ λνμ μΈ μλ λκΈ°ν(Synchronization)
μ λκ° μμ κ² κ°λ€. μμ΄ν°μ μμ
μ λ£μ λ μμ΄ν μ¦μμ μ¬μ©νλ λκΈ°ν κΈ°λ₯ κ°μ κ² λ§μ΄λ€. μ΄λ λκΈ°νλΌλ νμλ μλ‘ λ€λ₯Έ μνλ₯Ό κ°μ κ²μΌλ‘ λ§λλ κ²
μ μλ―Ένλ€.

νμ§λ§ μ»΄ν¨ν° 곡νμμλ λλΆλΆ λκΈ°λ₯Ό λμμ λ°μνλ κ²
μ΄λΌκ³ λ§ μ€λͺ
νκ³ μκΈ° λλ¬Έμ λλμ΄ μ‘°κΈ λ€λ₯΄λ€. λ¬Όλ‘ λ°μ΄ν°λ² μ΄μ€ λκΈ°ν
μ κ°μ΄ λμΌν μλ―Έλ‘ μ¬μ©λλ κ²½μ°λ μμ§λ§, λ§μ ν¬μ€ν
μ΄ I/Oλ λ€νΈμν¬μ λν λ΄μ©μ λ€λ£¨κ³ μκΈ° λλ¬Έμ μ μμ μλ―Έλ‘ ν΄μλλ κ²½μ°κ° λ§λ€.
λκΈ°μ λΉλκΈ°λΌλ λ¨μ΄ μ€ λΉλκΈ°λ λκΈ°κ° μλλ€
λΌλ μλ―Έμ΄κΈ° λλ¬Έμ μ°λ¦¬λ λκΈ°
κ° μ νν 무μμ λ§νλ κ²μΈμ§μ μ΄μ μ λ§μΆ°μ μκ°ν΄λ΄μΌνλ€. κ·Έλμ νμλ λκΈ°
λΌλ λ¨μ΄κ° μ νν 무μμ μλ―Ένλμ§λΆν° νλ² μ΄μΌκΈ°ν΄λ³΄λ €κ³ νλ€.
μ λκΈ°λ μ΄λ κ² λ€μν ν΄μμ κ°μ§λ κ²μΌκΉ?
λ¨μ΄μ λμμ€λ₯Ό νμ ν΄μΌνλ€
κ³ λ±νκ΅ λ μΈμ΄ μμμ΄λ μΈκ΅μ΄ μμμ 곡λΆν λ μ§λ¬Έ μμ λ΅μ΄ μλ€
λΌλ λ§μ λ€μ΄λ³Έ μ μ΄ μμ κ²μ΄λ€. 곡νμ΄λ κ³Όν λΆμΌμμ μ¬μ©λλ μ©μ΄λ μ£Όλ‘ μμ΄μμ νμλμκ³ , μ΄λ₯Ό νκ΅μ΄λ‘ λ²μνλ κ³Όμ μμ μ€νλ € λ»μ μκΈ°κ° μ΄λ €μ΄ λ¨μ΄λ‘ λ²μλλ κ²½μ°κ° μκΈ° λλ¬Έμ μλ³ΈμΈ μμ΄ λ¨μ΄μ λ»μ μ λλ‘ νμ
νλ κ²μ΄ μ€μνλ€.
κ°μκΈ° λΆμκΈ°κ° μΈκ΅μ΄ μμμ΄ λ κ² κ°μ§λ§, νμλ κ°μΈμ μΌλ‘ μ΄λ° κ³Όμ λν μ€μνλ€κ³ μκ°νλ€. μ΄ κ³Όμ μ ν΅ν΄ μ λκΈ°λΌλ λ¨μ΄κ° μν©μ λ°λΌ λ€λ₯Έ μλ―Έλ₯Ό κ°μ§ μ μλμ§ μ μ μκΈ° λλ¬Έμ΄λ€.

λ¨Όμ λκΈ°(εζ)
λΌλ λ¨μ΄μ νμλ₯Ό 보면 κ°μ λ(ε)
, κΈ°μ½ν κΈ°(ζ)
λ₯Ό μ¬μ©νκ³ μμΌλ©°, μΌλ°μ μΌλ‘ μ°λ¦¬κ° μ
μ¬ λκΈ°, κ΅°λ λκΈ° λ±μ μ΄μΌκΈ° ν λ μ°λ λκΈ°μ κ°μ λ¨μ΄λ€. μ΄ λ¨μ΄μ νμλ§ λ³΄λ©΄ κ°μ κΈ°κ°
λλ κ°μ μ£ΌκΈ°
λΌλ λ»μ΄λ€. μμ μ°λ¦¬κ° μΌλ°μ μΌλ‘ μ¬μ©νλ λκΈ°νμ μλ―Έλμ μ‘°κΈ λ€λ₯Έ κ² κ°λ€.
μ°λ¦¬κ° μμ΄ν°κ³Ό μμ΄ν μ¦λ₯Ό λκΈ°ννλ κ²μ΄ μ΄ λ λμμ κΈ°κ°μ΄λ μ£ΌκΈ°λ₯Ό κ°κ² λ§μΆλ κ²μ μλμ§ μμκ°? κ²λ€κ° μΌλ°μ μΌλ‘ νκ΅μ΄μμ ~ν
λΌκ³ ν¨μ μμ λΆμ λ¨μ΄μ μλ―Έλ₯Ό κ·Έλλ‘ κ°μ Έκ°λ κ²½μ°κ° λ§μμ λ ν·κ°λ¦°λ€.
νμ§λ§ μ¬μ€ μ°λ¦¬κ° λκΈ°μ λ²μμΌλ‘ λ§μ΄ μ¬μ©νλ Synchronous
λ μ΄μ§ λ€λ₯Έ λμμ€λ₯Ό κ°μ§κ³ μλ€.
synchronous [adjective]
: happening, existing, or arising at precisely the same timeWebster https://www.merriam-webster.com/dictionary/synchronous
μ, μΌλ¨ Synchronousλ λκΈ°μ λ€λ₯΄κ² νμ©μ¬λ€. κ·Έλμ μ¬μ€ νκ΅μ΄λ‘ μ νν λ²μνλ©΄ λκΈ°μ μΈ
κ³Ό κ°μ λ»μ΄ λμ΄μΌ νμ§λ§, νκ΅μ΄λ‘ νμ©μ¬λ₯Ό λ¨λ
μΌλ‘ μ¬μ©νλ κ²½μ°λ λ³λ‘ μκΈ° λλ¬Έμ κ·Έλ₯ νΈμμ λͺ
μ¬λ‘ λ²μνλ κ² κ°λ€. κ·Έλ¬λ μ΄λ° κ³Όμ μμ νκ΅μ΄ λ¨μ΄μ μμ΄ λ¨μ΄μ λμμ€κ° λ¬λΌμ§λ κ²½μ°κ° λ°μνλ€.
κ·Έλ¦¬κ³ μλ―Έλ₯Ό 보면 μ νν κ°μ μκ°μ λ°μ, μ‘΄μ¬νλ κ²
μ΄λΌκ³ νλ€. κ·Έλ¦¬κ³ μ΄ λ¨μ΄λ νμ©μ¬μ΄κΈ° λλ¬Έμ 무μ
μ΄ μ ννκ² κ°μ μκ°μ λ°μνλμ§λ μ νμμ§ μλ€. κ·ΈλΌ μ΄μ λκΈ°νλ₯Ό μλ―Ένλ λͺ
μ¬μΈ Synchronization
μ μ¬μ μ μλ―Έλ₯Ό νλ² μ΄ν΄λ³΄μ.
synchronization
: the state of being synchronousWebster https://www.merriam-webster.com/dictionary/synchronization
Synchronizationμ Synchronousν μν
λΌκ³ νλ€. μ¦, λκΈ°μ λκΈ°νλ κ·Όλ³Έμ μΌλ‘ κ°μ λ»μ΄λΌλ λ§μ΄λ€. κ°μ λ¨μ΄λ₯Ό 곡μ νλ μ΄ λ λ¨μ΄κ° νκ΅μ΄λ‘ λ³νλλ©° λ€λ₯Έ λ»μ΄ λλ κ²μ μμ΄λ₯Ό νκ΅μ΄λ‘ λ²μνλ κ³Όμ μμ μμ΄ νΉμ μ λμμ€λ₯Ό μ λλ‘ νννκΈ°κ° μ΄λ ΅κΈ° λλ¬Έμ λ°μνλ λ¬Έμ μ΄λ€.
κ²λ€κ° μ΄ λ¨μ΄λ€μ μνμΈ Synchro
λ λ¨μ΄ μμ²΄κ° λ»μ μλ―Ένλ λ³νμ μΈ λ¨μ΄μ΄κΈ° λλ¬Έμ νκ΅μ΄λ‘ λ²μνκΈ°λ μ½μ§ μλ€.(νκ΅μ΄λ‘ μΉλ©΄ βμ λ§€νλ€βκ°μ λλμ΄λ€. μ΄λ°κ±΄ λ°λλ‘ μμ΄λ‘ λ²μνκΈ° μ½μ§ μλ€.)
Synchronize, Synchronization, Synchronous λ± Synchro
λ₯Ό 곡μ νλ μ΄ λ¨μ΄λ€μ΄ 곡ν΅μ μΌλ‘ κ°μ§λ λμμ€λ λ°λ‘ λμμ λκ°μ΄ μ§νλλ λλ
μ΄λ€. κ·Έκ²μ΄ μνμ΄λ λμμ΄λ μ¬κ±΄μ΄λ λμμ λκ°μ΄ μ§νλλ λλμ λ§νλ κ²μ΄λ€.

μ¦, μμ΄ν°κ³Ό μμ΄ν μ¦μ μνλ₯Ό λμΌνκ² λ§λλ κ²μ μμ
μ΄ λλ¨κ³Ό λμμ μμ΄ν°κ³Ό μμ΄ν μ¦κ° κ°μ μν
κ° λλ―λ‘ Synchronousν μνκ° λ κ²μ΄κ³ , μΌλ°μ μΌλ‘ μ»΄ν¨ν° 곡νμμ μ΄μΌκΈ°νλ λκΈ°μ ν΄μμΈ λμμ λ°μνλ μ¬κ±΄
λν Synchronousν μ¬κ±΄μ΄λΌκ³ ν μ μλ κ²μ΄λ€.
μ¬μ§μ΄ μ΄ λ¨μ΄λ€μ μ΄μμΈ Syn-
μ λ¨μν Together
λΌλ μλ―Έλ₯Ό λ΄ν¬νλ λ¨μ΄μ΄κΈ° λλ¬Έμ μ΄λ° μν©μμλ μ¬μ©ν μ μλ€.
He and I are out of sync in everything
κ·Έμ λλ λͺ¨λ λ©΄μμ λ§μ§ μλλ€
μ΄λ κ² νκ΅μ΄λ‘ μ§μνκΈ° μ΄λ €μ΄ λ¨μ΄λ λμμ€λ₯Ό ν΅ν΄μ λ»μ μ΄ν΄νλ νΈμ΄ λ μ’λ€. κ΅μλλ€μ΄λ κ³Όνμλ€μ΄ νκ΅μ΄λ‘ λ§νλ μ€κ°μ μμ΄ λ¨μ΄λ₯Ό μμ΄κ°λ©΄μ μ¬μ©νλ κ²μ μ΄λ° μ΄μ λ μλ€κ³ μκ°νλ€. μ¬μ€ νκ΅μ΄μ λκΈ°
λΌλ μλ―Έμλ§ μ΄μ μ λ§μΆλ©΄ Synchro
μμ λ³νλ λ¨μ΄λ€ κ°μ 곡ν΅μ μ μ°μνκΈ°κ° μ½μ§ μλ€.
λ€μ μ 리νμλ©΄, Synchro-
λ₯Ό μ¬μ©νλ λ¨μ΄λ€μ λͺ¨λ λμμ λκ°μ΄ μ§νλλ λλ
μ λμμ€λ₯Ό κ°μ§λ λ¨μ΄μ΄λ€. κ²°κ΅ μ°λ¦¬κ° μνμ ν΅μΌμ μλ―Ένλ λκΈ°νλ μ»΄ν¨ν° 곡νμμ λ§νλ λμμ λ°μν μ¬κ±΄μ΄λ λͺ¨λ κ°μ λμμ€λ₯Ό κ°μ§κ³ μλ€λ κ²μ΄λ€.
μ»΄ν¨ν° 곡νμμμ λκΈ°
λ§μ ν¬μ€ν
μμ λκΈ°μ μλ―Έλ₯Ό μ€λͺ
ν λ νμ¬ μμ
μ μμ²κ³Ό μλ΅μ΄ λμμ λ°μνλ κ²
μΌλ‘ μ€λͺ
νκ³ μμ§λ§, νμλ μ΄ λμ
λΌλ λ¨μ΄κ° κ°μ§λ μλ―Έμ λ€λ₯΄κ² μμ²κ³Ό μλ΅ μ¬μ΄μλ μΌμ ν μκ°μ΄ μ‘΄μ¬ν μ λ°μ μκΈ° λλ¬Έμ λκ° λͺ¨μμ΄ λκ»΄μ§λ€κ³ μκ°νλ€.
μ¬μ€ λμ
λΌλ λ¨μ΄λ λμλ€λ°μ
μμμ μ©λ²κ³Ό κ°μ΄ λ°λμ μ°°λμ μκ°λ§μ μλ―Ένλ κ²μ΄ μλκΈ° λλ¬Έμ μ΄λ κ² μ€λͺ
ν μλ μκΈ΄ νμ§λ§, μΌλ°μ μΈ λμ
λΌλ λ¨μ΄μ μ©λ²μ μκ°ν΄λ³΄λ©΄ μ§κ΄μ μ΄μ§ μλ€κ³ μκ°νλ€.
κ·Έλμ νμλ λμμ λ°μνλ κ²μ νμ¬ μμ
μ μμ²κ³Ό μλ΅μ΄ μλλΌ νμ¬ μμ
μ μλ΅κ³Ό λ€μ μμ
μ μμ²
μ΄λΌκ³ μ€λͺ
νλ κ² λ λ§μ§ μλ μΆλ€.(μ μ΄μ Synchronousλ νμ©μ¬λΌ μ£Όμ΄κ° μλ€)

μ¦, νμ¬ μμ
μ μλ΅μ΄ λ°μν¨κ³Ό λμμ λ€μ μμ
μ μμ²νλ€λ κ²μ μμ
μ΄ μ΄λ ν μμλ₯Ό κ°μ§κ³ μ§νλλ€λ κ²
μ μλ―Ένλ€. κ·Έλ¦¬κ³ μ΄ μλ΅μ΄λΌλ κ²λ μ¬μ€ κ·μ λΆνλ©΄ κ·κ±Έμ΄κ³ μ½μ λΆνλ©΄ μ½κ±Έμ΄λ‘, λ€νΈμν¬ λͺ¨λΈμμλ μλ²μ μλ΅μΌ μλ μκ³ I/O λͺ¨λΈμμλ νλ‘μΈμ€ μ μ΄κΆμ λ°λ©μΌ μλ μλ€.
κ·ΈλΌ λ¨Όμ μ°λ¦¬κ° κ°μ₯ ννκ² μ ν μ μλ λκΈ° λ°©μμ μλ₯Ό νλ² λ³΄μ.
λκΈ° λ°©μ + λΈλ‘νΉ λ°©μ
μ°λ¦¬κ° κ°μ₯ ννκ² μ νλ λκΈ° λ°©μμ μλ λ°λ‘ λκΈ° & λΈλ‘νΉ
λ°©μμ΄λ€. λκΈ° λ°©μμ΄κΈ° λλ¬Έμ μμ
μ νλ¦λ μμ°¨μ μΌλ‘ μ§νλλ κ²μ΄ 보μ₯λκ³ , λΈλ‘νΉ λ°©μμ΄κΈ° λλ¬Έμ μ΄λ ν μμ
μ΄ μ§ν μ€μΌ λλ λ€λ₯Έ μμ
μ λμμ μ§νν μκ° μλ€.
function employee () {
for (let i = 1; i < 101; i++) {
console.log(`μ§μ: μΈν λμ λΆνκΈ° ${i}λ² μν`);
}
}
function boss () {
console.log('μ¬μ₯: μΆκ·Ό');
employee();
console.log('μ¬μ₯: ν΄κ·Ό');
}
boss();
μ¬μ₯: μΆκ·Ό
μ§μ: μΈν λμ λΆνκΈ° 1λ² μν
μ§μ: μΈν λμ λΆνκΈ° 2λ² μν
...
μ§μ: μΈν λμ λΆνκΈ° 100λ² μν
μ¬μ₯: ν΄κ·Ό
μ΄ μ½λλ₯Ό 보면 μ°λ¦¬λ μμ°μ€λ½κ² μ΄ μμ
λ€μ΄ μμλ₯Ό κ°μ§κ³ μ§νλ κ²μ΄λΌλ κ²μ μ μ μλ€. λ΄λΆμ μΌλ‘λ νλμ μ½ μ€νμ μμ
μ λ£κ³ Last In First Out
μΌλ‘ μ§νλκΈ° λλ¬Έμ΄λΌλ κ²μ μκ³ μμ§λ§, μ¬κΈ°μλ κ·Έλ° λ΄λΆ λ‘μ§λ³΄λ€λ κ·Έλ₯ μμ
μ΄ μμλλ‘ μ§νλλ€λ κ²μ΄λΌλ κ²μλ§ μ§μ€νμ.

μμ νλ‘μΈμ€μΈ boss
ν¨μλ μΆκ·Ό μμ
μ μνν λ€ νμ νλ‘μΈμ€μΈ employee
ν¨μμκ² μΈν λμ λΆνκΈ° μμ
μ μμ²νκ³ μκ³ , μ΄ μΈν λμ λΆνκΈ° μμ
μ΄ μλ£λκ³ λμμΌ boss
ν¨μλ ν΄κ·Ό μμ
μ μννλ€.
μ½κ² λ§ν΄μ μμ
μ μν¨ λμΈ μμ νλ‘μΈμ€λ μμ
μ νλ λμΈ νμ νλ‘μΈμ€κ° μ’
λ£λ λκΉμ§ μ λ ν΄κ·Όν μ μλ€λ κ²μ΄λ€. μ΄ μμ μ κ°μ΄ λκΈ° λ°©μκ³Ό λΈλ‘νΉ λ°©μμ ν¨κ» μ¬μ©νλ 맀컀λμ¦μ μΌλ°μ μΌλ‘ μ¬λλ€μ΄ λκΈ°
λ°©μμ΄λΌκ³ νλ©΄ κ°μ₯ λ¨Όμ λ μ¬λ¦¬λ λ°©μμ΄κ³ μ§κ΄μ μΌλ‘ μ΄ν΄νκΈ°λ μ¬μ΄ νΈμ΄λ€.
κ·Έλ λ€λ©΄ μ΄ μμ μ κ°μ΄ λκΈ°μ μΈ μμ
μ νλ¦μ μ μ§νλ©΄μ employee
ν¨μκ° μΈνμ λμμ λΆνλ λμ boss
ν¨μκ° λ€λ₯Έ μΌμ ν μλ μμκΉ?
λκΈ° λ°©μ + λ ΌλΈλ‘νΉ λ°©μ
λ¬Όλ‘ ν μ μλ€. λκ° μ΄μ°λ건 λκΈ°
λΌλ κ²μ μμ
λ€μ΄ μμ°¨μ μΈ νλ¦μ κ°μ§κ³ μλ€λ κ²μ μλ―ΈνκΈ° λλ¬Έμ μ΄ μ μ λ§ μ§μΌμ§λ€λ©΄ λλ¨Έμ§λ μ΄λ»κ² μ§μ§κ³ λ³Άλ κ°μ λκΈ° λ°©μμ΄λΌλ κ²μ λ³νμ§ μκΈ° λλ¬Έμ΄λ€. κ·Έλμ λκΈ° === λΈλ‘νΉ
μ΄λΌκ³ λ§ν μ μλ κ²μ΄λ€.
JavaScriptμ μ λλ μ΄ν°λ₯Ό μ¬μ©νλ©΄ μμ μ μμλ₯Ό μ§ν€λ©΄μλ μμ νλ‘μΈμ€κ° λ€λ₯Έ μμ μ νλλ‘ λ§λ€ μ μλ€.
function* employee () {
for (let i = 1; i < 101; i++) {
console.log(`μ§μ: μΈν λμ λΆνκΈ° ${i}λ² μν`);
yield;
}
return;
}
function boss () {
console.log('μ¬μ₯: μΆκ·Ό');
const generator = employee();
let result = {};
while (!result.done) {
result = generator.next();
console.log(`μ¬μ₯: μ νλΈ μμ²...`);
}
console.log('μ¬μ₯: ν΄κ·Ό');
}
boss();
μ¬μ₯: μΆκ·Ό
μ§μ: μΈν κΉμ λΆνκΈ° 1λ² μν
μ¬μ₯: μ νλΈ μμ²...
μ§μ: μΈν λμ λΆνκΈ° 2λ² μν
μ¬μ₯: μ νλΈ μμ²...
...
μ§μ: μΈν λμ λΆνκΈ° 100λ² μν
μ¬μ₯: μ νλΈ μμ²...
μ¬μ₯: ν΄κ·Ό
μ΄ μμ λ₯Ό 보면 μμ νλ‘μΈμ€μΈ boss
ν¨μλ μΆκ·Όν ν νμ νλ‘μΈμ€μΈ employee
λ₯Ό νΈμΆνμ¬ μΈν λμ λΆνκΈ° μμ
μ μν€κ³ μ£ΌκΈ°μ μΌλ‘ μ΄ μμ
μ΄ λλ¬λμ§λ₯Ό κ²μ¬νκ³ μλ€.
κ·Έλ¦¬κ³ μμ§ μμ
μ΄ λλμ§ μμλ€λ©΄ μμ λν μ΄μ¬ν μ νλΈ μμ²
μ μννλ κ²μ λ³Ό μ μλ€. μ΄ μ½λλ λΆλͺ
ν λκΈ°μ μΈ νλ¦μ κ°μ§κ³ μ§ννκ³ μμ§λ§ boss
ν¨μ λν μ€κ°μ€κ° μμ μ μμ
μ μννκ³ μμΌλ―λ‘ λΈλ‘νΉμ΄ μλλΌ λ
ΌλΈλ‘νΉ
λ°©μμ μ¬μ©νκ³ μλ κ²μ΄λ€.

μ΄ μμ μμλ λκΈ° & λΈλ‘νΉ λ°©μκ³Ό λ§μ°¬κ°μ§λ‘ boss
ν¨μλ employee
ν¨μμ μμ
μ΄ λλκΈ° μ κΉμ§λ μ λ ν΄κ·Όν μ μλ€. μμ
μ μμκ° μ§μΌμ§κ³ μλ κ²μ΄λ€. μ¦, λκΈ°
λ°©μμ΄λΌλ κ²μ μμ
μ μμ°¨μ μΈ νλ¦λ§ μ§μΌμ§λ€λ©΄ λΈλ‘νΉ
μ΄λ λ
ΌλΈλ‘νΉ
μ΄λ μ무 μκ΄μ΄ μλ€κ³ ν μ μλ€.
μ»΄ν¨ν° 곡νμμμ λΉλκΈ°
νμλ λκΈ° λ°©μμ νμ¬ μμ
μ μλ΅κ³Ό λ€μ μμ
μ μμ²μ νμ΄λ°μ΄ μΌμΉνλ κ²μ΄λΌκ³ μ΄μΌκΈ° νλ€. λΉλκΈ°
λ°©μμ λ§ κ·Έλλ‘ λκΈ° λ°©μμ΄ μλλΌλ μλ―Έμ΄κΈ° λλ¬Έμ λ°λλ‘ μκ°νλ©΄ λλ€. μ¦, νμ¬ μμ
μ μλ΅κ³Ό λ€μ μμ
μ μμ²μ νμ΄λ°μ΄ μΌμΉνμ§ μμλ λλ κ²μ΄λ€.

λκΈ° λ°©μμ μμ νλ‘μΈμ€κ° νμ νλ‘μΈμ€μκ² μμ μ μ§μν λ μμ μ μ’ λ£ μμ μ μκ³ μμ΄μΌνλ€. νμ νλ‘μΈμ€μ μμ μ΄ μλ£λμ΄ κ²°κ³Όλ¬Όμ λ±μ΄λ΄λ νΉμ μμ μ΄ μμ§ μ§ν μ€μ΄λ μμ μ μ’ λ£ μμ μ νμ μμ μ μν¨ λμΈ μμ νλ‘μΈμ€κ° μ κ²½μ°κ³ μλ€.
νμ§λ§ λΉλκΈ° λ°©μμ λ€λ₯΄λ€. μμ νλ‘μΈμ€λ μμ μ μΌλ¨ μ§μνμΌλ©΄ κ·Έ λ€μλΆν°λ μμ μ΄ μ§ν μ€μ΄λ μ’ λ£κ° λμλ μ κ²½μ°μ§μλλ€. λκΈ° λ°©μμ μ€λͺ νμ λμ λ§μ°¬κ°μ§λ‘ μ΄λ μμ νλ‘μΈμ€κ° μμ μ μμ μ ν μ μλ μλλ λ³κ°μ λ¬Έμ μ΄λ€.
λν μμ νλ‘μΈμ€κ° νμ νλ‘μΈμ€μ μμ
μ’
λ£ μ¬λΆλ₯Ό μ κ²½μ°μ§ μκΈ° λλ¬Έμ μμ
μ μ’
λ£κ° μμ°¨μ μΌλ‘ μ΄λ£¨μ΄μ§λ κ²μ 보μ₯νμ§ μλλ€. κ·ΈλΌ λ¨Όμ , μ°λ¦¬μκ² μ΅μν λ°©μμΈ λΉλκΈ° & λ
ΌλΈλ‘νΉ
λ°©μλΆν° νλ² μ΄ν΄λ³΄μ.
λΉλκΈ° λ°©μ + λ ΌλΈλ‘νΉ λ°©μ
λΉλκΈ° λ°©μκ³Ό λ ΌλΈλ‘νΉ λ°©μμ μ‘°ν©ν λ°©λ²μ μ°λ¦¬μκ² κ΅μ₯ν μ΅μν λ°©μμ΄λ€. λΉλκΈ° λ°©μμ΄κΈ° λλ¬Έμ μμ νλ‘μΈμ€λ νμ νλ‘μΈμ€μ μμ μλ£ μ¬λΆλ₯Ό λ°λ‘ μ κ²½μ°μ§ μλλ€. μ΄ν νμ νλ‘μΈμ€μ μμ μ΄ μ’ λ£λλ©΄ μ€μ€λ‘ μμ νλ‘μΈμ€μκ² λ³΄κ³ λ₯Ό νλ μλλ©΄ λ€λ₯Έ νλ‘μΈμ€μκ² μΌμ λ§‘κΈ°λ ν κ²μ΄λ€.
κ·Έλ¦¬κ³ λ ΌλΈλ‘νΉ λ°©μμ΄κΈ° λλ¬Έμ μμ νλ‘μΈμ€λ νμ νλ‘μΈμ€μκ² μΌμ λ§‘κΈ°κ³ μμ μ μμ μ κ³μ μνν μλ μλ€.
function employee (maxDollCount = 1, callback) {
let dollCount = 0;
const interval = setInterval(() => {
if (dollCount > maxDollCount) {
callback();
clearInterval(interval);
}
dollCount++;
console.log(`μ§μ: μΈν λμ λΆνκΈ° ${dollCount}λ² μν`);
}, 10);
}
function boss () {
console.log('μ¬μ₯: μΆκ·Ό');
employee(100, () => console.log('μ§μ: λμ κ²°μ° λ³΄κ³ '));
console.log('μ¬μ₯: ν΄κ·Ό');
}
boss();
μ¬μ₯: μΆκ·Ό
μ¬μ₯: ν΄κ·Ό
μ§μ: μΈν λμ λΆνκΈ° 1λ² μν
μ§μ: μΈν λμ λΆνκΈ° 2λ² μν
...
μ§μ: μΈν λμ λΆνκΈ° 100λ² μν
μ§μ: λμ κ²°μ° λ³΄κ³
μ΄ μμ λ₯Ό 보면 boss
ν¨μλ employee
ν¨μμκ² μΈν λμ 100
κ°λ₯Ό λΆνλΌκ³ μ§μν ν μμ μ λ°λ‘ ν΄κ·Όν΄λ²λ Έλ€. μμ νλ‘μΈμ€μΈ boss
ν¨μλ employee
ν¨μμ μμ
μ΄ μΈμ λλλμ§λ κ΄μ¬μ΄ μμΌλ©° μμ
μ μλ£ μ νΈλ μ½λ°±μΌλ‘ λκ²¨μ§ λμ κ²°μ° λ³΄κ³
μμ
μ΄ λμ λ°μμ μ²λ¦¬νκ³ μλ€.

λΉλκΈ° & λ
ΌλΈλ‘νΉ
λ°©μμ μ¬λ¬ κ°μ μμ
μ λμμ μ²λ¦¬ν μ μλ λΆλΆμμ ν¨μ¨μ μ΄λΌκ³ ν μ μμ§λ§, λ무 볡μ‘νκ² μ½ν λΉλκΈ° μ²λ¦¬ λλ¬Έμ κ°λ°μκ° μ΄ν리μΌμ΄μ
μ νλ¦μ μ½κΈ° μ΄λ €μμ§λ λ±μ λ¬Έμ κ° μμ μ μλ€. JavaScriptμμ Promise
λ async/await
μ κ°μ λ¬Έλ²μ μ¬μ©νλ μ΄μ λ μ΄λ° λΉλκΈ° μ²λ¦¬μ νλ¦μ μ’ λ λͺ
ννκ² μΈμ§νκ³ μ νλ λ
Έλ ₯μΈ κ²μ΄λ€.
λν NodeJSμ μ΄λ²€νΈ 루νμ κ°μ΄ λΉλκΈ° λ°©μλ λ΄λΆ ꡬνμ λ―μ΄λ³΄λ©΄ λκΈ°μ μΈ ν¨ν΄μ΄ ν¬ν¨λμ΄μκΈ° λλ¬Έμ λ¨λ°νκ²λλ©΄ μ΄λκ°μ λ³λͺ©μ΄ μκΈΈ μλ μλ€.
λΉλκΈ° λ°©μ + λΈλ‘νΉ λ°©μ
κ·ΈλΌ μ΄μ λ§μ§λ§μΌλ‘, νμμ μ νκΈ° νλ κ°λ
μΈ λΉλκΈ° & λΈλ‘νΉ
μ μ΄ν΄λ³΄μ. μ΄ λ°©μμ μΌλ°μ μΈ μ΄ν리μΌμ΄μ
λ μ΄μ΄μμλ μμ£Ό μ¬μ©λμ§ μκ³ Linuxμ Unix μ΄μ체μ μ I/O λ€μ€ν λͺ¨λΈ μ λμ μ λ 벨μμ μ¬μ©λκ³ μλ€. κ·Έλμ μ§κΈκΉμ§ μμ λ‘ μ¬μ©νλ μ¬μ₯λκ³Ό μ§μμ μ΄μ κ·Έλ§ ν΄κ·ΌμμΌμ£Όκ³ μ€λͺ
μ μ§νν κ²μ΄λ€.
μΌλ¨ μ΄ κ°λ
μ μΌν λ€μΌλ©΄ λΉν¨μ¨μ μ΄κΈ°λ§ ν μλ μλ€. λΉλκΈ° λ°©μμ μ₯μ μ νμ νλ‘μΈμ€μ μμ
μ΄ λλλ κ²μ κΈ°λ€λ¦¬μ§ μμμΌλ‘μ¨ μ¬λ¬ κ°μ μμ
μ λμμ μ²λ¦¬
ν μ μλ€λ κ²μΈλ°, νλ‘μΈμ€κ° λΈλ‘νΉλμ΄λ²λ €μ μ ν΄ μνμ λΉ μ§λ€λ©΄ μ무 κ²λ μ²λ¦¬ν μ μκΈ° λλ¬Έμ΄λ€.
νμ§λ§ μ΄ κ°λ μ΄ λμ€κ² λ μ΄μ λ λ€μκ³Ό κ°λ€.
- λκΈ° & λΈλ‘νΉ I/Oμ κ²½μ° μ§κ΄μ μ΄λ, μ¬λ¬ κ°μ I/Oλ₯Ό λμμ μ²λ¦¬ν μ μλ€.
- λ ΌλΈλ‘νΉ I/Oλ νλ‘μΈμ€λ€μ μμ μ 컨νΈλ‘€νλ κ²μ΄ κΉλ€λ‘λ€. (λλΆλΆ μ΄λ° μ λ 벨 νλ‘κ·Έλ¨μ Cλ‘ μ§ λ€. JSλ Python κ°μ κ±Έ μκ°νλ©΄ μλλ€.)
- κ·Έλ λ€κ³ λκΈ° & λΈλ‘νΉ I/Oμ λ©ν° νλ‘μΈμ±μ΄λ μ°λ λ©μ κ²°ν©ν΄μ μ°μλ μμ λ¬Έμ λ μκ³ νλ‘μΈμ€/μ°λ λ κ° ν΅μ μ΄λ λκΈ°νκ° λΉ‘μ
κ·Έλμ λμ¨ κ°λ μ΄ λ°λ‘ βκ·ΈλΌ κ·Έλ₯ νλ‘μΈμ€λ₯Ό λΈλ‘νΉν΄λκ³ λΉλκΈ°λ‘ μ¬λ¬ κ°μ I/Oλ₯Ό λ€μ€νν΄μ λ°μλ²λ¦¬λ λμ λ§λ€λ©΄ μ΄λ?βμΈ κ²μ΄λ€. μ¦, μ§κ΄μ μΈ μ½λμ νλ¦μ μ μ§νλ©΄μλ μμ μ λμμ μ²λ¦¬νκ² λ€λ κ²μ΄λ€.
μ°Έκ³ λ‘ μ΄ λ΄μ©μ IBMμμ 2006λ μ μμ±ν Boost application performance using asynchronous I/Oμ΄λΌλ ν¬μ€ν μλ μκ°λμ΄ μλ€.

비동기 + 블록 방식의 워크 플로우
μ κ·Έλ¦Όμ 보면 μ€κ°μ select()
λΌλ ν¨μκ° μλλ°, μ΄ μΉκ΅¬κ° λ°λ‘ νλ‘μΈμ€λ₯Ό λΈλ‘νΉν¨κ³Ό λμμ μ¬λ¬ κ°μ I/Oλ₯Ό λ°μμ μ²λ¦¬νλ μν μ νλ€. μ΄ ν¨μλ CμΈμ΄μ APIλ‘ μ 곡λκ³ μμΌλ©°, κ·Έλ₯ include <sys/select.h>
μ κ°μ΄ ν€λλ₯Ό κ°μ Έμμ μ°λ©΄ λλ€.
int select (int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
μ΄λ nfds
λ κ°μν νμΌμ κ°μλ₯Ό, fd_set
ꡬ쑰체λ€μ κ°κ° μ½μ λ°μ΄ν°, μ°μ¬μ§ λ°μ΄ν°, μμΈμ²λ¦¬κ° λ°μν κ²μ κ°μν νμΌ λͺ©λ‘μ΄λ€. μ΄λ fd...
λ File Descriptor
μ μ½μμ΄λ©°, νμΌμ κ°μνκ³ μλ€κ° ν΄λΉ I/Oκ° λ°μνλ©΄ μμ μ΄ κ°μ§κ³ μλ λΉνΈ λ°°μ΄ κ΅¬μ‘°μ²΄μ ν΄λΉ κ°μ 1
λ‘ λ³κ²½νλ€.
[0, 0, 1, 0, 0, 0, 0, 0]
// νμΌ λͺ©λ‘ μ€ 3λ²μ§Έ νμΌμ λ³κ²½μ¬νμ΄ μλ€λ©΄ FDμ λΉνΈ λ°°μ΄ κ΅¬μ‘°μ²΄κ° λ³κ²½λλ€
κ·Έλ¦¬κ³ timeval κ΅¬μ‘°μ²΄μΈ timeout
μΈμλ κ°μν μκ°μ μλ―Ένλ€. μ¦, μ΄ timeout
μΈμμ λκ²¨μ€ μκ° λμ μμ νλ‘μΈμ€λ₯Ό λΈλ‘νΉνλ©΄μ μμ μ΄ λ겨λ°μ νμΌ λͺ©λ‘μ κ³μ κ°μνκ³ μλ κ²μ΄λ€. κ·Έλ¦¬κ³ κ°μνκ³ μλ λμ νμΌμ μ½κΈ°, μ°κΈ°, μμΈκ° λ°μνλ©΄ select
ν¨μκ° μ’
λ£λ λ μμ μ΄ κ°μνλ μλ νμΌλ€ μ€ ν΄λΉ λ³κ²½μ¬νμ΄ λ°μν, μ¦ μ²λ¦¬ν΄μΌν νμΌμ κ°μλ₯Ό λ°ννλ€.
λμΆ© μ΄ μ λκ° λΉλκΈ° & λΈλ‘
λ°©μμ λνμ μΈ μμΈ select
ν¨μκ° μλνλ λ°©μμ΄λ€. μ 리νμλ©΄ μΌμ μκ°λμ νλ‘μΈμ€λ₯Ό λ©μΆ°λκ³ μμ μ΄ κ°μνκ³ μλ νμΌλ€μμ I/Oκ° λ°μνλμ§λ₯Ό κ°μνλ κ²μ΄λ€. κ·Έλ¦¬κ³ μΌμ μκ°μ΄ μ§λλ©΄ ν¨μκ° μ’
λ£λλ©° κ·Έλμ κ°μνλ νμΌλ€μ I/O κ²°κ³Όλ₯Ό λ°ννκ³ νλ‘μΈμ€μ λΈλ‘νΉμ΄ νλ¦°λ€.
μ΄ λ°©μμ λΈλ‘νΉ λ°©μμΌλ‘ μ§νλκΈ° λλ¬Έμ κ°λ°μμκ²λ μ§κ΄μ μΌλ‘ λ€κ°μ€κ³ , λΉλκΈ° λ°©μμ΄κΈ° λλ¬Έμ μ¬λ¬ κ°μ I/Oλ₯Ό λμμ κ°μνλ©° μ²λ¦¬ν μ μλ€. νμ§λ§ μ±λ₯μ΄ κ·Έλ κ² μ’μ νΈμ μλλ―λ‘ IBMμμλ λμ μ±λ₯μ΄ νμν μ΄ν리μΌμ΄μ μμλ λλλ‘ μ°μ§ λ§λΌκ³ νλ€.
λ§μΉλ©°
νμλ λνκ΅ λ λ€νΈμν¬ κ³Όλͺ©μ μκ°νλ©° λκΈ°
μ λν κ°λ
μ μ²μ λ°°μ μλλ°, μ¬μ€ κ·Έλλ κ΅μ₯ν λ¨νΈμ μΈ λ΄μ©λ§μ μκ³ μμλ€. λ¨μν λ λλ°μ΄μ€κ°μ ν΄λκ³Ό μΌμ ν¬κΈ°μ νλ μμ λ§μΆμ΄ ν΅μ νλ κ²μ΄ λκΈ°μ ν΅μ μ΄λΌλ κ² μ λ?
νμ§λ§ κ°λ°μλ‘ μΌμ νλ©΄μ 곡λΆλ₯Ό λ νλ€λ³΄λκΉ λκΈ°μ I/O, λκΈ°μ νλ‘κ·Έλλ° λ± λκΈ°μ λν λ€λ₯Έ κ°λ
λ€μ κ³μ ν΄μ μ νκ² λμλλ°, μλ¬Έμμ μ΄μΌκΈ°νλ―μ΄ λꡬλ λκΈ°λΌλ λ¨μ΄κ° λμμ λ°μνλ κ²
μ΄λΌκ³ νκ³ λꡬλ νΉμ ν ν΄λμ λ§μΆ°μ ν΅μ νλ κ²
, λ λꡬλ μ΄μ μμ
μ΄ λλ λκΉμ§ κΈ°λ€λ¦¬λ κ²
μ΄λΌκ³ νλ λ± ν΄μμ΄ λ€ λ¬λΌμ λ νΌλμ€λ¬μ λ€.

κ·Έλμ μ΄λ² ν¬μ€ν
μ μμ±νλ©΄μ Synchronous
λΌλ λ¨μ΄κ° μ νν μ΄λ€ μνλ₯Ό μλ―Ένλ κ²μΈμ§λΆν° λ€μ 곡λΆνμλλ°, νμ€ν λ¨μ΄μ λμμ€λ₯Ό μ΄ν΄νκ³ λλ μ μ΄λ κ² λ€λ₯Έ ν΄μλ€μ΄ λμ€κ² λμλμ§ μ½κ°μ μ΄ν΄κ° κ°λ κ² κ°λ€. λ¨μ΄ μμ²΄κ° λ»μ μλ―Ένλ λ¨μ΄λ€λ³΄λ μ΄κ±΄ κ·Έλ₯ ν΄μνκΈ° λλ¦μΈκ² κ°κΈ°λ νλ€.
μ΄μ¨λ λ€λ₯Έ 건 λ€ μ°¨μΉνκ³ μλΌλ SynchronousλΌλ λ¨μ΄κ° λμμ λκ°μ΄ μ§νλλ λλ
μ΄λΌλ λμμ€λ₯Ό μκ² λ κ²μ΄ μ΄λ² ν¬μ€ν
μ μ΅λ μνμ΄ μλκΉλΌλ μκ°μ ν΄λ³Έλ€.
μ΄μμΌλ‘ λκΈ°(Synchronous)λ μ νν 무μμ μλ―Ένλκ±ΈκΉ? ν¬μ€ν μ λ§μΉλ€.