πκ°μ
κ°λ°μ± μ μ½λ€ μλ¨μ μ λͺ©μ΄ "λΉλκΈ°"λ‘ λμ΄ μλ μ± μ λ΄€μ΅λλ€. κ·Έλ¬λ€ λ¬Έλ μ΄λ° μκ°μ΄ λ€μμ΅λλ€.
λκΈ°? Synchronous? μ΄λ° λ°©μμ΄ μ λκΈ°λΌκ³ λΆλ₯΄λ κ±°μ§? μ SynchronousλΌλ μ©μ΄λ₯Ό μ¬μ©ν κ±°μ§?
μκ°μ κ³±μΉλ€λ³΄λ μ½κ°μ μΈμ§λΆμ‘°νλ₯Ό λκΌμ΅λλ€. κ·Έλμ μ΄ν΄νκ³ μλ κ°λ μ΄ λ§λμ§ μμ¬μ΄ λ€κΈ° μμνκ³ , μ κ° μ΄ν΄ν κ°λ κ³Ό "λκΈ°"λΌλ κ°λ μ΄ μ°κ΄μ±μ΄ μλ μκ°ν΄λ³΄κ² λμμ΅λλ€.
μ°λ¦¬λ λκΈ°/λΉλκΈ°λ₯Ό λ무 μμ°μ€λ½κ² μ¬μ©ν©λλ€. μΉ κ°λ°μμ μ΅μνκ² “λκΈ°”, “λΉλκΈ°”, “Blocking I/O”, “Non-blocking I/O”λΌλ λ¨μ΄λ₯Ό μ λ§ μμ£Ό μ¬μ©νκ² λ©λλ€. μ μμ μ€λ«λμ μ΄ κ°λ λ€μ μ¬μ©ν΄μκ³ , μΆ©λΆν μ΄ν΄νκ³ μλ€κ³ μκ°νμ΅λλ€. λκΈ°λ©΄ μμ°¨μ μΈ λμ, λΉλκΈ°λ©΄ λ³λ ¬ λμμ²λΌ λ°μ¬μ μΌλ‘ λ§μνκ² λ μ¬λ¦¬κ³€ νμ΅λλ€.
λλμ μΈ λλμΌλ‘ μ΄λ° λͺ¨λΈ, λ°©μμ λκΈ°λΌκ³ νλ κ±°κ² μ§ νκ³ λμΆ© λκΈ°κΈ°μ λ무 μ°μ°ν΄μ μ λλ‘ μμλ³΄κ² λμμ΅λλ€. μ λλ‘ μμ보면μ λκΈ° μμ€ν μ μ νκ΅μ΄λ‘ "λκΈ°" μμ΄λ‘ "Synchronous" λΌκ³ λΆλ₯΄κ³ κ·Έμ λ°λμΈ κ°λ μ "λΉλκΈ°", "Asynchronous"λ‘ λΆλ¦¬κ² λλμ§κΉμ§ μμ 보μμ΅λλ€. κ·Έλ¦¬κ³ λκΈ°, λΉλκΈ°μ ν¨κ» μμ£Ό μΈκΈλλ Blocking I/O, Non-blocking I/O μ λν΄μλ 곡λΆλ₯Ό νμ΅λλ€. μ κ° λ§λ κ·Έλ¦Όκ³Ό ν¨κ» λ΄μ©μ 곡μ ν΄ λ리λλ‘ νκ² μ΅λλ€.
λ¨Όμ μ κ° κ·Έλμ μκ³ μλ κ°λ μ λν΄ λΆλλ½μ§λ§, νλ² λ§μλλ € λ³΄κ² μ΅λλ€. λκΈ°λ°©μκ³Ό Blocking I/Oμ μ¬λλ€μ΄ λ§μ΄ νΌμ©νκ³ νΌλνλ κ°λ μΌλ‘μ, μ λ ν·κ°λ¦¬μ§ μλλ‘ λ€μκ³Ό κ°μ΄ μ΄ν΄νκ³ μμμ΅λλ€.
λκΈ°
- "μμ°¨μ μΌλ‘ μΌμ΄λλ κ²"
Blocking I/O
- "νΈμΆμ ν λ€ κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬λ κ²(λκΈ°)"
κ·Έμ κΉμ§ λκΈ°μ λν κ°λ μ μ λ "λκΈ°"λΌλ κ°λ μ΄ λ€μ΄κ°λ©΄ μλλ€κ³ μκ°νκ³ , λκΈ°μ λν κ°λ μ μ€λͺ ν λ "λκΈ°"λΌλ μ€λͺ μ΄ ν¬ν¨λμ΄ μμΌλ©΄ Blocking I/Oμ λν κ°λ κ³Ό νΌμ©νμ¬ μλͺ» μ€λͺ ν κ±°λΌκ³ μκ°νμ΅λλ€.
νμ§λ§ νμ΅ν΄λ³΄λ μ κ° μλͺ»μκ°νκ³ μλ κ²μ΄μκ³ , λκΈ°κ° ν¬ν¨λ μ€λͺ μ κ·Έλ€μ§ νλ¦° μ€λͺ μ΄ μλμλ€λ κ±Έ κΉ¨λ¬μμ΅λλ€. π
πΌοΈμ΄ν΄λ₯Ό λμΈ κ·Έλ¦Ό
μλ κ·Έλ¦Όμ μ΄μ©ν΄μ μ΄λ² κΈμ μ μ ν μμλ₯Ό λ€μ΄λ³΄κ² μ΅λλ€.
λ¨Όμ , λΉμ μ μΉ΄νλ₯Ό μ°½μ νκ³ AI μλΉ λ‘λ΄μ ν λ κ³ μ©νμ΅λλ€.

μ΄ μΉ΄νμμ ν΄μΌ ν μ£Όμ μμ
μ λ€μ μΈ κ°μ§μ
λλ€.
- μλ μ£Όλ¬Έ μλ (νλ μμ )
- λ―Έλ μ€λΈμμ λΉ΅ λ°μ°κΈ° (λ Έλ μμ )
- μ»€νΌ λ¨Έμ μμ μ»€νΌ λ΄λ¦¬κΈ° (λ³΄λΌ μμ )
κ·Έλ¦¬κ³ νμ¬ μΉ΄νμλ λ λͺ μ μλμ΄ μμ΅λλ€.
- μλ μ΄μμ
- μλ μ€λ΄κΈΈ
μλμΌλ‘λ μ§κΈ 2λͺ μ΄μμ κ³Ό μ€λ΄κΈΈμ΄ μκ³ , λΉμ μ λ‘λ΄μ 2κ°μ§ νλ‘κ·Έλλ° λͺ¨λΈ νμμΌλ‘ μμ μ ν μ μμ΅λλ€. μμ μ μ€λ λμ μ κ°ν΄μ 보면 λ°λ‘ "λκΈ° + Blocking λ°©μ"κ³Ό "λΉλκΈ° + Non-blocking λ°©μ"μ λλ€.

μ΄ κ·Έλ¦Όμ κ°μ§κ³ λ¨μ΄μ μ΄ν΄μ ν¨κ» μ€λͺ ν΄λ³΄κ² μ΅λλ€.
πλ Όλ¬Έμ΄λ νμ μλ£μμ μμ νλ Synchronous μ Asynchronous
λ¨Όμ Synchronous(λκΈ°)λΌλ κ°λ μ μ λλ‘ μ΄ν΄νκΈ° μν΄μ, μμ λ Όλ¬Έμ΄λ νμ΅μλ£λ€μμ λμ¨ κ°λ λ€μ μ°Ύμλ΄€μ΅λλ€. νλ‘κ·Έλλ°μ΄λΌλ κΈ°μ μ μμμμ μ²μμμν΄, μ μμ κ°λ μ ν립νκΈ° λλ¬Έμ λλ€.
ν΅μ μμμ Synchronous / Asynchronous
πTowards a Harmonization of UML-Sequence Diagrams and MSC (1999)
Synchronous communication means that the involved parties have to meet and perform the communication together.
In synchronous method calls, the calling object is suspended until the called method completes and returns its result.
Asynchronous communication means that sending and consumption are decoupled; the caller is not suspended and may perform other work while the operation executes.
λκΈ°μ ν΅μ μ΄λ κ΄λ ¨ λΉμ¬μλ€μ΄ λ§λ ν¨κ» ν΅μ μ μνν΄μΌ ν¨μ μλ―Έν©λλ€.
λκΈ°ν λ©μλ νΈμΆμμλ νΈμΆλ λ©μλκ° μλ£λμ΄ κ²°κ³Όλ₯Ό λ°νν λκΉμ§ νΈμΆ κ°μ²΄κ° μΌμ μ€λ¨λ©λλ€.
λΉλκΈ° ν΅μ μ μ μ‘κ³Ό μλΉκ° λΆλ¦¬λμ΄ μμμ μλ―Έν©λλ€. νΈμΆμλ μμ
μ΄ μ€νλλ λμμλ μ€λ¨λμ§ μκ³ λ€λ₯Έ μμ
μ μνν μ μμ΅λλ€.
- λκΈ° ν΅μ μ νΈμΆμ → νΈμΆλ μͺ½ → μλ£/리ν΄κΉμ§ κΈ°λ€λ¦¬κ³ μκ³ ,
- λΉλκΈ° = νΈμΆμ → μ¦μ λ°ν, κ·Έ μ¬μ΄ μ€νμ λΆλ¦¬λλ€κ³ μ€λͺ νκ³ μμ΅λλ€.
λΆμ°μμ€ν μμμ Synchronous / Asynchronous
π Unifying Partial Synchrony (2024, arXiv)
Synchronous communication assumes that messages get delivered within a known bounded time frame and parties’ clocks are synchronized.
Asynchronous communication makes no timing assumptions, only that messages will eventually be delivered
λκΈ° ν΅μ μ λ©μμ§κ° μλ €μ§ μ νλ μκ° λ΄μ μ λ¬λκ³ ν΅μ λΉμ¬μλ€μ μκ³κ° λκΈ°νλμ΄ μλ€κ³ κ°μ ν©λλ€.
λΉλκΈ° ν΅μ μ μκ° κ΄λ ¨ κ°μ μ νμ§ μκ³ , λ¨μ§ λ©μμ§κ° κ²°κ΅ μ λ¬λ κ²μ΄λΌλ μ¬μ€λ§ κ°μ ν©λλ€.
- λκΈ° ν΅μ μμ€ν μ 체μ κ³΅ν΅ μκ³(common clock) μ‘΄μ¬, μκ°μ bound κ° μκ³ ,
- λΉλκΈ° ν΅μ κ·Έλ° timing 보μ₯ μμ, μ€μ§ eventual delivery λ§ λ³΄μ₯νλ€κ³ ν©λλ€.
νλ‘κ·Έλλ°μμμ Synchronous / Asynchronous
πhttps://www.sciencedirect.com/topics/computer-science/synchronous-and-asynchronous-communication
Synchronous
“An execution model in which the caller waits for an operation to complete and return its result — actions happen in a coordinated, time-bounded way.”
Asynchronous
“An execution model in which send/execute and receive are decoupled — the caller is not suspended and other work can proceed before the result arrives.”
λκΈ°
νΈμΆμκ° μμ μ΄ μλ£λμ΄ κ²°κ³Όλ₯Ό λ°νν λκΉμ§ κΈ°λ€λ¦¬λ μ€ν λͺ¨λΈ — μ 체μ μΈ μμ μ νλμ μκ°μ ꡬ쑰 μμμ ν¨κ» μμ§μ΄λ λͺ¨λΈμ΄λ€.
λΉλκΈ°
μ μ‘/μ€ν(send/execute)κ³Ό μμ (receive)μ΄ λΆλ¦¬λμ΄(decoupled) μλ μ€ν λͺ¨λΈ — νΈμΆμλ μ€λ¨λμ§ μμΌλ©°, κ²°κ³Όκ° λμ°©νκΈ° μ μ λ€λ₯Έ μμ μ κ³μ μνν μ μλ€.”
- λκΈ° μ€ν λͺ¨λΈμ νΈμΆμκ° μμ μ΄ λλ λκΉμ§ μ μ΄λ₯Ό λ°νλ°μ§ λͺ»νλ©°, μμ κ³Ό νΈμΆμμ νλ¦μ΄ νλμ μκ°μ ꡬ쑰 μμμ ν¨κ» μμ§μ΄λ λͺ¨λΈ
- λΉλκΈ° μ€ν λͺ¨λΈμ μμ μ μμκ³Ό μλ£ μμ μ΄ λΆλ¦¬λμ΄ μμΌλ©°, νΈμΆμλ μμ μλ£λ₯Ό κΈ°λ€λ¦¬μ§ μκ³ μμ μ μ€ν νλ¦μ κ³μ μ§νν μ μλ ꡬ쑰
κ° νμ μ μ€λͺ μ 보면 μκ°μ λν κ°λ λ€μ΄ λ§μ΄ λμ€κ³ , λκΈ°λ λκΈ°νλ€, λΉλκΈ°λ μ€λ¨νμ§ μκ³ λ°λ‘ λ°ννμ¬ νΈμΆμκ° λ°λ‘ λ€λ₯Έ μμ μ νλ€λΌλ μ΄μΌκΈ°λ₯Ό λ³Ό μ μμ΅λλ€. κ²°κ΅ λκΈ°λ₯Ό μ€λͺ ν λ κΈ°λ€λ¦Ό(λκΈ°)μ λν μ€λͺ μ΄ λ€μ΄κ° 건 νλ¦° μ€λͺ μ΄ μλλΌ μ¬λ°λ₯Έ μ€λͺ μ΄μλ κ±°μ£ . κ·ΈλΌ μ λκΈ°μ κ°λ μμ μκ°, λκΈ°, μμ°¨μ μ΄λ° ννλ€μ΄ μ¬μ©λ κΉμ? μ΄λ²μ μ΄μκ³Ό λ¨μ΄μ μλ―Έλ₯Ό λΆν΄νμ¬ νμ ν΄ λ΄€μ΅λλ€.
π Synchronousμ μ΄μ
Synchronous λ λ€λ€ μμλ€μνΌ λ€μ λ¨μ΄λ€λ‘ μ΄λ£¨μ΄μ§ λ¨μ΄μ λλ€.
syn (together, κ°μ΄) + chronos (time, μκ°)
μ°λ¦¬κ° νν μ°λ synchronous, synchronize, synthesis, symmetry κ°μ λ¨μ΄λ€μλ 곡ν΅μ μΌλ‘ syn- λλ sym-μ΄λΌλ μ λμ¬κ° λ€μ΄κ°λλ€. μ΄ syn-μ λ¨μν “κ°λ€”λ λ»μ΄ μλλΌ, κ³ λ 그리μ€μ΄μμ μ¨ λ§€μ° μ€λλ κ°λ μ λλ€.
syn-μ κ³ λ 그리μ€μ΄ σΟν (sýn) μμ λ°μλ€κ³ ν©λλ€.
μλ―Έλ λ€μκ³Ό κ°μ΅λλ€.
“with”, “together”, “in union”, “jointly”
μ¦, λ¨μν λμΌμ±(equality)μ΄ μλλΌ, “ν¨κ» κ²°ν©λμ΄ μμ”, “곡λμΌλ‘ μμ§μ”, “μ°κ²°λμ΄ μμ”μ κ°κΉμ΄ μλ―Έμ
λλ€.
μ¬κΈ°μ μ€μν 건, syn-μ μ μ μΈ “κ°μ”μ΄ μλλΌ λμ μΈ κ²°ν© μνλ₯Ό λνλΈλ€λ μ μ
λλ€.
Synchronous μ ꡬ쑰λ₯Ό λ€μ 보면 Synchronousλ syn(ν¨κ»)μ chronos(μκ°)μμ μ¨ λ¨μ΄μ
λλ€. λ§ κ·Έλλ‘ “μκ°μ ν¨κ» λ§μΆλ€”λ μλ―Έμ
λλ€. νκ΅μ΄λ‘ λ²μλ “λκΈ°(εζ)” μμ κ°μ λ(ε), λ κΈ°(ζ)μ
λλ€. κ°μ μκΈ°, κ°μ νμ΄λ°μ΄λΌλ λ»μ
λλ€. κ·Έλ λ€λ©΄ 무μκ³Ό 무μμ΄ κ°μ μκ°μ 곡μ νλ€λ κ±ΈκΉμ?
synchronous λ μλ 물리ν/μ μ곡ν/ν΅μ 곡νμμ μ°λ λ§μ λλ€. synchronous motor (λκΈ° λͺ¨ν°), synchronous signal (λκΈ° μ νΈ) λ±μ΄ μμ΅λλ€. μλ―Έμ μΌλ‘λ λ€μκ³Ό κ°μ΅λλ€.
λ κ° μ΄μμ μμ€ν μ΄ κ°μ μκ° κΈ°μ€μ λ§μΆ° λμνλ€.
μ΄ μ©μ΄κ° νλ‘κ·Έλλ°μ΄λ νλ¬Έμ΄ λ§λ€μ΄μ§λ©΄μ μμ°μ€λ½κ² μ¬μ©λκΈ° μμνμ΅λλ€.
μ¦, “μκ°μ ν¨κ» 곡μ νλ μν” μ¬κΈ°μ μ€μν 건 λ¨μν “κ°μ μκ°”μ΄ μλλΌ, μλ‘ λΆλ¦¬λ λ νλ¦μ΄ νλμ μκ° κ΅¬μ‘° μμμ κ²°ν©λμ΄ μμ§μΈλ€λ μλ―Έμ
λλ€.
νλ‘κ·Έλλ°μμ synchronousλ "νΈμΆμμ μκ°, μμ
μ μλ£ μκ°" μ΄ λμ΄ λΆλ¦¬λμ§ μκ³ κ°μ μκ° μΆ μμ λ¬Άμ¬ μλ μνλ₯Ό μλ―Ένκ² λ κ²μ
λλ€.
π₯οΈI/O μμ Synchronous μ Asynchronous
νλ‘κ·Έλλ°μμ μ΄ μ©μ΄κ° 본격μ μΌλ‘ λ±μ₯ν κ³³μ I/O (μ μΆλ ₯) μμ€ν μ λλ€. μ΄μ°½κΈ° μ»΄ν¨ν°λ CPU μ°μ°μ λ§€μ° λΉ λμ§λ§ λμ€ν¬/λ€νΈμν¬ I/Oλ λ§€μ° λλ Έμ΅λλ€.
Synchronous I/O μμ CPUκ° I/O μμ² ν μλ£λ λκΉμ§ λ©μΆ° μμμ΅λλ€. μ΄λ° κ²½μ°λ CPUμ I/Oκ° “μκ°μ λ§μΆ°” μμ§μ΄λ κ±°μ£ .
- CPU → I/O → CPU resumes
μ΄λ¬ν νκ³λλ¬Έμ λ€μκ³Ό κ°μ΄ μκ°νκ² λμ΅λλ€.
"CPUκ° I/O λλ λκΉμ§ κΈ°λ€λ €μΌ νλκ°?"
λ°λλ‘ Asynchronous I/Oμ CPUκ° I/O μμ² ν λ°λ‘ λ€λ₯Έ μΌ μνμ μννμ΅λλ€. κ·Έλ¦¬κ³ I/Oκ° μλ£λλ©΄ μΈν°λ½νΈλ‘ μλ Έμ΅λλ€.
- CPU → I/O μμ
- CPU λ€λ₯Έ μΌ μν
- I/O μλ£ → μΈν°λ½νΈ
λκΈ° νΈμΆμμλ νΈμΆμμ μ€ν νλ¦κ³Ό μμ
μ μλ£ μμ μ΄ νλμ μκ° νλ¦ μμ λ¬Άμ
λλ€. μλ₯Ό λ€μ΄ μ΄λ€ ν¨μλ₯Ό νΈμΆνμ λ, κ·Έ ν¨μκ° λλκΈ° μ μλ λ€μ μ€μ μ½λλ‘ λμ΄κ° μ μμ΅λλ€. μ¬κΈ°μ λ¬Άμ¬ μλ κ²μ λ¨μν “μμ
κ³Ό λ€μ μμ
”μ΄ μλλΌ, νΈμΆμμ μ μ΄ νλ¦κ³Ό μμ
μ μλ£ μμ μ
λλ€. μ¦, μ μ΄ νλ¦μ΄ μμ
μ μλ£μ μ’
μλλ κ΅¬μ‘°κ° λ©λλ€. μ΄κ²μ΄ λκΈ° λ°©μμ λ³Έμ§μ
λλ€.
λκΈ° λ°©μμμλ νΈμΆμμ μ€ν νλ¦μ΄ μμ
μ μλ£ μμ μ μ’
μλκΈ° λλ¬Έμ νλμ μκ° νλ¦μΌλ‘ κ²°ν©λ©λλ€. κ·Έ κ²°κ³Ό μ΄μ μμ
μ΄ μλ£λμ΄μΌ λ€μ μ½λλ‘ μ§νν μ μμΌλ―λ‘ κΈ°λ€λ¦Όμ΄ λ°μνκ³ , μ 체 μμ
μ μμ°μ€λ½κ² μμ°¨μ μΈ κ΅¬μ‘°λ₯Ό κ°κ² λ©λλ€.
μ΄λ₯Ό μμ μκ°ν μΉ΄ν μμλ‘ μ΄ν΄λ³΄κ² μ΅λλ€.
μ΄ μΉ΄νμμ λ‘λ΄μ΄ μνν΄μΌ νλ λ©μΈ μμ
μ “μλ μλ”μ
λλ€. μλ μλλ μ£Όλ¬Έμ μ μνκ³ , μλμ΄ μ£Όλ¬Έν λΉ΅κ³Ό 컀νΌλ₯Ό μ€λΉν λ€ μλΉνλ μΌλ ¨μ νλ¦μΌλ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.

κ·Έλ¦Όμ 보면 λ‘λ΄μ μλμ μ£Όλ¬Έμ μ μν λ€ λ€μ μμ
μΈ λΉ΅ λ°μ°κΈ°λ₯Ό μ€νν©λλ€. νμ§λ§ μ΄ λ‘λ΄μ λκΈ° λ°©μμΌλ‘ λμνλ λ‘λ΄μ
λλ€. μ€λΈμ λΉ΅μ λ£κ³ λ²νΌμ λλ₯΄λ©΄, λ‘λ΄μ κ·Έ μ리μμ λΉ΅μ΄ λ€ κ΅¬μμ§ λκΉμ§ κΈ°λ€λ¦½λλ€. λΉ΅μ΄ μμ±λ λ€μμΌ λ€μ μμ
μΈ μ»€νΌ λ΄λ¦¬κΈ°λ₯Ό μμν©λλ€. κ·Έλ¦¬κ³ μ΄λ²μλ μ»€νΌ λ¨Έμ μμμ 컀νΌκ° λ΄λ €μ§ λκΉμ§ κΈ°λ€λ¦½λλ€. 컀νΌκ° μμ±λλ©΄ κ·ΈλμμΌ λΉ΅κ³Ό 컀νΌλ₯Ό λ€κ³ μλΉμ ν©λλ€.
μ€λΈμ λ²νΌμ λλ₯΄λ κ²κ³Ό μ»€νΌ λ¨Έμ μ λ²νΌμ λλ₯΄λ νμλ₯Ό νλμ νΈμΆ(call)μ΄λΌκ³ μκ°ν΄λ³΄κ² μ΅λλ€. λκΈ° λ°©μμ λ‘λ΄μ νΈμΆμ μνν λ€ κ·Έ μμ
μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬κ³ λμμΌ λ€μ μμ
μΌλ‘ μ΄λν©λλ€. μ¦, νΈμΆμμ μ€ν νλ¦κ³Ό μμ
μ μλ£ μμ μ΄ νλμ μκ° μΆ μμ κ²°ν©λμ΄ μμ΅λλ€.
κ·Έλμ μμ
μ νλ¦μ λ€μκ³Ό κ°μ μμλ₯Ό κ°κ² λ©λλ€.
1 (μμ
νΈμΆ) → 2 (μμ
μλ£) → 3 (λ€μ μμ
μ§ν)
μ΄ κ΅¬μ‘°μμλ μμ μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦° μκ°μ΄ λͺ¨λ ν¬ν¨λκΈ° λλ¬Έμ, νλμ μμ²μ μ²λ¦¬νλ μ 체 μκ°μλ λκΈ° μκ°μ΄ κ·Έλλ‘ ν¬ν¨λ©λλ€.
λ°λλ‘ λΉλκΈ° λ°©μμμλ νΈμΆμμ μ€ν νλ¦μ΄ μμ
μ μλ£ μμ κ³Ό μκ°μ μΌλ‘ λΆλ¦¬λ©λλ€. νΈμΆμλ μμ
μλ£λ₯Ό κΈ°λ€λ¦¬μ§ μκ³ μ¦μ λ€μ μ½λλ‘ μ§ννλ©°, μμ
μ μλ£λ λμ€μ μ½λ°±, Future, μ΄λ²€νΈ λ±μ ννλ‘ ν΅μ§λ©λλ€. μ΄λ‘ μΈν΄ μ€ν νλ¦κ³Ό μμ
μ μλ£ μμ μ λμΌν μκ° κ΅¬μ‘°μ λ¬Άμ΄μ§ μκ² λ©λλ€.
κ°μ μΉ΄ν μμλ₯Ό λΉλκΈ° λ°©μμΌλ‘ λ€μ μ΄ν΄λ³΄κ² μ΅λλ€.

λ‘λ΄μ΄ μλ μ΄μμ μ μ£Όλ¬Έμ μ μνκ³ λΉ΅μ μ€λΈμ λ£μ΅λλ€. νμ§λ§ μ΄λ²μλ μ€λΈ μμμ κΈ°λ€λ¦¬μ§ μμ΅λλ€. λ¨μν μμ λ²νΌλ§ λλ₯΄κ³ λ°λ‘ λ€μ μμ
μ μ§νν©λλ€. μ΄μ΄μ μ»€νΌ λ¨Έμ μλ 컀νΌλ₯Ό λ΄λ¦¬λλ‘ μμ²νκ³ , μ΄λ²μλ 컀νΌκ° λ΄λ €μ§ λκΉμ§ κΈ°λ€λ¦¬μ§ μμ΅λλ€. μ»€νΌ λ¨Έμ μμ μμ λ²νΌλ§ λλ¬λκ³ λ‘λ΄μ μ¦μ λ€μ μμ
μΌλ‘ μ΄λν©λλ€.
κ·Έ λ€μ λ‘λ΄μ λ€λ₯Έ μλμΈ μ€λ΄κΈΈμ μ£Όλ¬Έ μλλ₯Ό μμν©λλ€.
μ μ ν μ€λΈμμ λΉ΅μ΄ μμ±λλ©΄ “λ΅λ” νλ μλ¦Όμ΄ μΈλ¦½λλ€. λ‘λ΄μ κ·Έ μλ¦Όμ νμΈνκ³ λΉ΅μ κ°μ Έμ΅λλ€. μ΄μ΄μ μ»€νΌ λ¨Έμ μμλ 컀νΌκ° μμ±λμλ€λ μλ¦Όμ΄ μΈλ¦½λλ€. λ‘λ΄μ μμ±λ 컀νΌμ λΉ΅μ λ€κ³ μλμκ² μλΉμ ν©λλ€.
μ¬κΈ°μμλ μ€λΈκ³Ό μ»€νΌ λ¨Έμ μ λ²νΌμ λλ₯΄λ νμλ₯Ό νλμ νΈμΆμ΄λΌκ³ 보면, λΉλκΈ° λ°©μμμλ νΈμΆ μ΄ν μλ£λ₯Ό κΈ°λ€λ¦¬μ§ μκ³ λ°λ‘ λ€μ μμ
μ μ§νν©λλ€. μ¦, νΈμΆμμ μ€ν νλ¦κ³Ό μμ
μ μλ£ μμ μ΄ κ°μ μκ° μΆ μμ λ¬Άμ¬ μμ§ μμ΅λλ€.
λΉλκΈ° ꡬ쑰μμλ μμ
μ νλ¦μ΄ λ€μκ³Ό κ°μ΄ λνλ©λλ€.
1 (μμ
νΈμΆ) → 3 (λ€μ μμ
μ§ν) → 2 (μμ
μλ£ μ΄λ²€νΈ)
μμ
μ λ€λ₯Έ μ₯λΉ(μ€λΈ, μ»€νΌ λ¨Έμ )μ μμν΄ λμκΈ° λλ¬Έμ κΈ°λ€λ¦¬λ λμ λ‘λ΄μ λ€λ₯Έ μμ
μ μνν μ μμ΅λλ€.
μ΄λ¬ν μ°¨μ΄ λλ¬Έμ λΉλκΈ° λ°©μμ μμ² μ²λ¦¬λ(throughput)μ΄ λ λμμ§ μ μμ΅λλ€.

λκΈ° λ°©μμμλ μμ
μ μμνλ©΄ μλ£λ λκΉμ§ κΈ°λ€λ €μΌ νκΈ° λλ¬Έμ, κ·Έλμ μ€ν 주체(μ¬κΈ°μλ λ‘λ΄ νΉμ μ€λ λ)λ μ무 μΌλ νμ§ λͺ»ν μ± λκΈ°νκ² λ©λλ€. νΉν λ€νΈμν¬λ λμ€ν¬ I/Oμ²λΌ μκ°μ΄ μ€λ 걸리λ μμ
μ΄ ν¬ν¨λλ©΄ μ΄λ¬ν λκΈ° μκ°μ λμ± μ»€μ§λλ€.
λ°λ©΄ λΉλκΈ° λ°©μμμλ μμ
μ μμν λ€ μλ£λ₯Ό κΈ°λ€λ¦¬μ§ μκ³ λ€λ₯Έ μμ
μ κ³μ μνν μ μμ΅λλ€. μ¦, νλμ μμ
μ΄ μΈλΆ μ₯μΉμμ μ²λ¦¬λλ λμμλ μ€ν 주체λ λ€λ₯Έ μμ²μ μ²λ¦¬ν μ μμ΅λλ€.
κ²°κ³Όμ μΌλ‘ λμΌν μκ° λμ λ λ§μ μμ
μ μ²λ¦¬ν μ μκ² λκ³ , μμ€ν
μ 체μ μμ² μ²λ¦¬λμ΄ λμμ§ κ°λ₯μ±μ΄ 컀μ§λλ€. μ΄κ²μ΄ νλμ λ§μ μλ² νλ μμν¬λ€μ΄ λΉλκΈ° λͺ¨λΈκ³Ό Non-blocking I/Oλ₯Ό μ κ·Ήμ μΌλ‘ νμ©νλ μ΄μ μ
λλ€.
π«Blocking I/O μ Non-blocking I/O
λ Όλ¬Έκ³Ό νμ μλ£ κ·Έλ¦¬κ³ μ΄μμ μλ―Έλ₯Ό ν΅ν΄ λκΈ°/λΉλκΈ°λ "μκ°μ κ²°ν©"μ λ¬Έμ λΌλ κ±Έ μμμ΅λλ€. κ·Έλ¦¬κ³ κ·Έ κ²°ν©μ λμμ΄ νΈμΆμμ μ€ν νλ¦κ³Ό μμ μλ£λΌλ κ²λ μμμ΅λλ€. μ΄ μ λ°μ μΈ μ μ΄ νλ¦μ΄ λ°©μμ°¨μ΄κ° λκΈ° λ°©μμ΄λ λΉλκΈ°λ°©μμ΄λλ₯Ό ꡬλΆμ§κ² ν©λλ€.
λ°λ©΄ Blocking/Non-blockingμ μ ν λ€λ₯Έ μ°¨μμ κ°λ
μ
λλ€. μ΄λ μ μ΄ νλ¦μ λ¬Έμ κ° μλλΌ, νΈμΆμ μνν μ€λ λκ° μ€μ λ‘ λκΈ° μνλ‘ μ νλλκ°μ λ¬Έμ μ
λλ€. μ¦, μ΄μ체μ μ€μΌμ€λ§ κ΄μ μμ ν΄λΉ μ€λ λκ° λ©μΆλμ§ μ¬λΆλ₯Ό κΈ°μ€μΌλ‘ ꡬλΆν©λλ€.
λ κ°λ
μ νλ¨ κΈ°μ€ μμ²΄κ° λ€λ¦
λλ€. νλλ μκ°μ κ΄κ³(μ μ΄ νλ¦), λ€λ₯Έ νλλ μ€ν 주체(μ€λ λ) μ μνμ
λλ€. λ°λΌμ μλ‘ λΉκ΅ λμμ΄ μλλΌ, μλ‘ λ€λ₯Έ μΆμ λμΈ κ°λ
μΌλ‘ μ΄ν΄ν΄μΌ ν©λλ€.
I/Oλ λ§ κ·Έλλ‘ Input/Output, μ¦ μ
μΆλ ₯μ
λλ€. Blocking I/Oμ Non-blocking I/Oμ μ°¨μ΄λ μ
μΆλ ₯ μμ
μ μννλ λμ νΈμΆ μ€λ λκ° μ»€λμ μν΄ λκΈ° μνλ‘ μ νλλκ°, μλλ©΄ μ¦μ λ°νλμ΄ κ³μ μ€ν κ°λ₯ν μνλ‘ λ¨λκ°μ μμ΅λλ€.
Blocking I/Oμμλ λ°μ΄ν°κ° μ€λΉλμ§ μμλ€λ©΄ νΈμΆ μ€λ λλ 컀λμ μν΄ λκΈ°(sleep) μνλ‘ λ€μ΄κ°κ³ , I/Oκ° μλ£λ λκΉμ§ μ€μΌμ€λ§ λμμμ μ μΈλ©λλ€.
Non-blocking I/Oμμλ λ°μ΄ν°κ° μ€λΉλμ§ μμλλΌλ νΈμΆμ μ¦μ λ°νλλ©°, μ€λ λλ λκΈ° μνλ‘ μ νλμ§ μμ΅λλ€.
1οΈβ£ Blocking I/O
νΈμΆλ‘ μΈν΄ νμ¬ μ€λ λκ° μ»€λμ μν΄ λκΈ°(sleep) μνμ λ€μ΄κ°λ κ²
Javaμμ κ°μ₯ μ νμ μΈ μλ InputStream.read() μ
λλ€.
InputStream in = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = in.read(buffer); // λ°μ΄ν°κ° μ¬ λκΉμ§ λκΈ°
μ΄ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄, λ€νΈμν¬ λ°μ΄ν°κ° μμ§ λμ°©νμ§ μμλ€λ©΄ read()λ λ°ννμ§ μμ΅λλ€.
νμ¬ μ€λ λλ 컀λμ μν΄ λκΈ° μνλ‘ λ€μ΄κ°λλ€.
μ¦, μμ
μλ£ μ κΉμ§ μ€λ λκ° λ©μΆ° μλ μν(sleep)μ΄κ³ μ΄κ²μ΄ Blocking I/O μ
λλ€.
μ΄κ±΄ μ μ΄ νλ¦ λ¬Έμ κ° μλλΌ, νΈμΆ μ€λ λκ° μ€μ λ‘ λ©μΆλκ°μ λ¬Έμ μ
λλ€.

μΉ΄ν μμμμ νλμ μμ
(μλ μλ)μ νλμ μ€λ λμμ μ²λ¦¬νλ€κ³ κ°μ ν΄λ³΄κ² μ΅λλ€.
μ΄ μ€λ λλ μλμ μ£Όλ¬Έμ λ°κ³ , λΉ΅μ λ°μ°κΈ° μν΄ μ€λΈμ μ¬μ©ν©λλ€. μ¬κΈ°μ μ€λΈμ λΉ΅μ λ£κ³ λ²νΌμ λλ₯΄λ νμλ₯Ό νλμ I/O νΈμΆμ΄λΌκ³ μκ°ν μ μμ΅λλ€.
Blocking I/O λ°©μμμλ μ€λΈμ μλμν€λ μμ
μ νΈμΆν λ€, κ·Έ μμ
μ΄ μλ£λ λκΉμ§ νΈμΆν μ€λ λκ° λκΈ° μνμ λ€μ΄κ°λλ€.
μ¦, νλμ μμ
μ μννλ μ€λ λκ° λ
Έλμ μμ
(λΉ΅ λ°μ°κΈ°)μ νΈμΆνλ©΄ λ€μκ³Ό κ°μ νλ¦μ΄ λ©λλ€.
- νλ μ€λ λκ° μ€λΈ μμ μ νΈμΆ
- μ€λΈ μμ μ΄ μλ£λ λκΉμ§ μ€λ λλ λκΈ° μν(sleep)μ λ€μ΄κ°
- λΉ΅μ΄ μμ±λ λ€μμΌ μ€λ λκ° λ€μ μ€νμ μ¬κ°
μ΄λ μ€μν μ μ μ€λ λ μμ²΄κ° λ©μΆλ€λ κ²μ
λλ€. μ€λΈμ΄ λΉ΅μ λ°μ°λ λμ λ‘λ΄μ λ€λ₯Έ μΌμ ν μ μκ³ , ν΄λΉ μ€λ λλ λ¨μν κΈ°λ€λ¦¬κ³ λ§ μμ΅λλ€. κ°μ λ°©μμΌλ‘ μ»€νΌ λ¨Έμ μμ
μ νΈμΆνλ©΄, 컀νΌκ° λ΄λ €μ§ λκΉμ§ μ€λ λλ λ€μ λκΈ° μνμ λ€μ΄κ°λλ€. I/O μμ
μ΄ μλ£λ λκΉμ§ νΈμΆ μ€λ λκ° μ»€λμ μν΄ λκΈ° μνλ‘ λ€μ΄κ°λ λ°©μμ
λλ€.
μ΄κ²μ΄ λ°λ‘ Blocking I/Oμ
λλ€.
2οΈβ£Non-blocking I/O
Javaμμλ NIO(Non-blocking I/O)λ₯Ό ν΅ν΄ μ΄λ₯Ό ꡬνν μ μμ΅λλ€.
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = channel.read(buffer);
if (bytesRead == 0) {
System.out.println("λ°μ΄ν°κ° μμ§ μ€λΉλμ§ μμ");
}
μ΄ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄, λ°μ΄ν°κ° μ€λΉλμ§ μμ κ²½μ° read()λ μ¦μ 0μ λ°νν©λλ€. κ·Έλ¦¬κ³ νμ¬ μ€λ λλ λ©μΆμ§ μμ΅λλ€.
μ¦, λ°μ΄ν°κ° μ€λΉλμ§ μμλλΌλ, νΈμΆ μ€λ λλ λκΈ° μνλ‘ λ€μ΄κ°μ§ μμ΅λλ€.
μ΄κ²μ΄ Non-blocking I/O μ
λλ€.

κ·Έλ¦Όμμ 보면 μμ Blocking I/O κ³Ό λ€λ₯΄κ² Non-blocking I/O λ°©μμμλ μν©μ΄ μ‘°κΈ λ€λ₯΄κ² λμν©λλ€.
νλμ μμ
μ μννλ μ€λ λκ° λ
Έλμ μμ
(λΉ΅ λ°μ°κΈ°)μ νΈμΆνλλΌλ, μ΄λ²μλ μ€λΈ μμ
μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬μ§ μμ΅λλ€.
μ€λΈμ μλμν€λ νΈμΆμ μ¦μ λ°νλκ³ , μ€λ λλ λκΈ° μνλ‘ λ€μ΄κ°μ§ μμ΅λλ€.
μ¦ νλ¦μ λ€μκ³Ό κ°μ΄ λ©λλ€.
- νλ μ€λ λκ° μ€λΈ μμ μ νΈμΆ
- νΈμΆμ μ¦μ λ°νλ¨
- μ€λ λλ λ€μ μμ μ κ³μ μν
κ·Έλ¦¬κ³ νΈμΆν μμ
μΈ λΉ΅μ΄ μμ±λλ©΄ λμ€μ μλ£ μλ¦Ό(event)μ ν΅ν΄ μμ
μλ£κ° μ λ¬λ©λλ€.
μ»€νΌ λ¨Έμ λ λμΌν©λλ€. 컀νΌλ₯Ό λ΄λ¦¬λ μμ
μ μμν λ€ μ€λ λλ κΈ°λ€λ¦¬μ§ μκ³ λ°λ‘ λ€μ μμ
μ μ§νν μ μμ΅λλ€.
μ΄ λ°©μμμλ μ€λ λκ° λκΈ° μνλ‘ λ€μ΄κ°μ§ μκΈ° λλ¬Έμ, κ°μ μκ° λμ λ λ§μ μμ
μ μ²λ¦¬ν μ μμ΅λλ€.

μμ μ΄ν΄λ³Έ κ²μ²λΌ Blocking I/Oμμλ I/O μμ
μ΄ μ§νλλ λμ μ€λ λλ μ무 μΌλ νμ§ λͺ»νκ³ κΈ°λ€λ €μΌ ν©λλ€.
νΉν λ€νΈμν¬λ λμ€ν¬μ²λΌ I/O μκ°μ΄ κΈ΄ μμ
μ΄ λ§μμ§λ©΄, λ§μ μ€λ λκ° λ¨μν λκΈ° μνλ‘ λ¬Άμ΄κ² λ©λλ€. λ°λ©΄ Non-blocking I/Oμμλ μμ
μ μμν λ€ μλ£λ₯Ό κΈ°λ€λ¦¬μ§ μκ³ λ€λ₯Έ μμ
μ μ²λ¦¬ν μ μμ΅λλ€.
κ·Έλμ λμΌν μμ μ€λ λλ‘λ λ λ§μ μμ²μ μ²λ¦¬ν μ μκ² λ©λλ€.
μ΄λ¬ν μ΄μ λλ¬Έμ νλμ λ§μ μλ² νλ μμν¬(Node.js, Netty, WebFlux λ±)λ λΉλκΈ° + Non-blocking I/O λͺ¨λΈμ μ κ·Ήμ μΌλ‘ μ¬μ©νκ³ μμ΅λλ€.
π’4κ°μ§ μ‘°ν©μΌλ‘ 보λ Synchronous(λκΈ°)/Asynchronous(λΉλκΈ°), Blocking I/O / Non-blocking I/O
κ²°κ΅ λκΈ°μ΄λ©΄μ λΈλ‘νΉμΌ μλ μκ³ , λΉλκΈ°μ΄λ©΄μ λΈλ‘νΉμΌ μλ μμ΅λλ€. μλ₯Ό λ€μ΄ λΉλκΈ° APIλ₯Ό νΈμΆν΄λκ³ future.wait()λ‘ κΈ°λ€λ¦°λ€λ©΄, μμ μ λΉλκΈ°μ μΌλ‘ μ€νλμ§λ§ νμ¬ μ€λ λλ λ©μΆκ² λ©λλ€. μ΄κ²μ λΉλκΈ° + λΈλ‘νΉμ μ‘°ν©μ λλ€. λ°λλ‘ λ ΌλΈλ‘νΉ μμΌμ ν΄λ§ λ°©μμΌλ‘ μ¬μ©νλ€λ©΄, κ²°κ³Όλ₯Ό μ§μ λ°μ μ²λ¦¬νλ λκΈ° ꡬ쑰μ΄λ©΄μλ μ€λ λλ λ©μΆμ§ μμ μ μμ΅λλ€. κ° μ‘°ν©μ λν΄ μ΄ν΄λ³΄μμ΅λλ€.
1οΈβ£ λκΈ° + Blocking
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream in = conn.getInputStream(); // μλ΅ μ¬ λκΉμ§ λκΈ°
- getInputStream ν¨μμ κ²°κ³Ό λ°νκΉμ§ κΈ°λ€λ¦Ό (λκΈ°)
- νμ¬ μ€λ λ λ©μΆ€ (Blocking)
μ ν΅μ μΈ ν¨μ νΈμΆ λ°©μμ λλ€. getInputStream() ν¨μμ μλ΅μ΄ μ¬ λκΉμ§ νΈμΆν μ€λ λλ λ©μΆκ² λ©λλ€. μλ΅μ λ¦¬ν΄ λ°κ³ λμμΌ λ€μ λ‘μ§μ μ€ννκ² λ©λλ€.
2οΈβ£ λκΈ° + Non-blocking
λκΈ° + Non-blocking I/O λ μ‘΄μ¬λ νμ§λ§ λ§μ΄ μ¬μ©νμ§ μλ λ°©μμ
λλ€. κ·Έλμ ꡬν λ°©μλ μ½κ° νΉμ΄ν©λλ€.
νΈμΆ ν “μ¦μ λ°ν + μ§μ κ²°κ³Ό νμΈ” ꡬ쑰μ
λλ€.
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (true) { // I/O μμ
νΈμΆ ν μ€λ λ SLEEP μν¨.
int bytesRead = channel.read(buffer); //read()κ° λ°μ΄ν° μμΌλ©΄ μ¦μ 0 λ°ν
if (bytesRead > 0) {
break; // λ°μ΄ν° μ§μ λ°μ → λκΈ°
}
doOtherWork();
}
process(buffer);
- λκΈ° = κ²°κ³Όλ₯Ό νΈμΆμκ° μ§μ λ°λλ€ (control flowκ° λ°ν μμ μ κ²°ν©)
- Non-blocking I/O = λ°μ΄ν°κ° μ€λΉλμ§ μμμΌλ©΄ μ¦μ λ°ν (μ€λ λ μ λ©μΆ€)
μ¦, "κ²°κ³Όλ λ΄κ° μ§μ λ°μμΌ νμ§λ§ μ€λ λλ λ©μΆλ©΄ μ λλ€." μ΄κ² λκΈ° + Non-blocking μ‘°ν©μ λλ€.
λ§€λ² κ²°κ³Όλ₯Ό νμΈνλ κ²μ΄ ν΄λ§κ³Ό μ μ¬ν ꡬ쑰μ λλ€. κ·Έλμ “μ‘°κΈλ§ κΈ°λ€λ¦¬λ©΄ κ³§ μ¬ κ²” κ°μ μ§§μ ν΄λ§ (μ μ§μ° μꡬ) μμ λ μ¬μ©λ©λλ€. μ λ μ€λ¬΄μμ WebForm μΌλ‘ μ¬μ©κ° μμ΄λμ λΉλ°λ²νΈλ₯Ό μ λ ₯νμ¬ λ‘κ·ΈμΈν ν λ©μΈνμ΄μ§μ κ°λ€κ³ νμ λ λΉμ·ν λ°©μμΌλ‘ λ‘κ·ΈμΈ μλ£λ₯Ό 체ν¬ν μ μ΄ μμ΅λλ€.
3οΈβ£ λΉλκΈ° + Blocking
λΉλκΈ° + Blocking μ‘°ν©μ μ²μ 보면 μ½κ° λͺ¨μμ²λΌ λκ»΄μ§ μ μμ΅λλ€.
“λΉλκΈ°μΈλ° μ Blockingμ΄ λ°μνμ§?”λΌλ μκ°μ΄ λ€κΈ° λλ¬Έμ
λλ€.
νμ§λ§ λ κ°λ
μ μλ‘ λ€λ₯Έ κΈ°μ€μμ μ μλ©λλ€.
- λΉλκΈ°λ μ μ΄ νλ¦μ λ¬Έμ μ λλ€.
- Blockingμ μ€λ λ μνμ λ¬Έμ μ λλ€.
λ°λΌμ λΉλκΈ° μμ
μ μμνλλΌλ, λμ€μ νΈμΆμκ° κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬λ©΄ μ€λ λλ λ€μ Blocking μνκ° λ μ μμ΅λλ€.
λνμ μΈ μκ° Future λλ Taskλ₯Ό μ¬μ©ν λ€ κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬λ κ²½μ°μ
λλ€.
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ μ½λκ° μλ€κ³ κ°μ ν΄λ³΄κ² μ΅λλ€.
CompletableFuture<String> future =
CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
return "Hello";
});
String result = future.get(); // κ²°κ³Ό κΈ°λ€λ¦Ό (Blocking)
System.out.println(result);
μ΄ μ½λλ₯Ό 보면 μμ
μ체λ CompletableFutureλ₯Ό ν΅ν΄ λΉλκΈ°μ μΌλ‘ μ€νλ©λλ€.
μ¦, μ€μ μμ
μ λ³λμ μ€λ λμμ μνλ©λλ€. νμ§λ§ future.get()μ νΈμΆνλ μκ° μν©μ΄ λ¬λΌμ§λλ€.
get()μ κ²°κ³Όκ° μ€λΉλ λκΉμ§ νμ¬ μ€λ λλ₯Ό λκΈ° μνλ‘ λ§λλλ€.
κ·Έλμ
μμ
μ€ν → λΉλκΈ°
κ²°κ³Ό λκΈ° → Blocking
μ΄λΌλ κ΅¬μ‘°κ° λ©λλ€.
μ΄ κ²½μ° μμ€ν
μ λμμ λ€μκ³Ό κ°μ ννκ° λ©λλ€.
λΉλκΈ° μμ
μμ
↓
νμ¬ μ€λ λ future.get() νΈμΆ
↓
κ²°κ³Ό μ¬ λκΉμ§ μ€λ λ λκΈ°
↓
κ²°κ³Ό λ°ν
λ°λΌμ μ΄ ν¨ν΄μ λΉλκΈ° + Blockingμ λνμ μΈ μ¬λ‘λΌκ³ λ³Ό μ μμ΅λλ€.
μ€μ λ‘ λ§μ μμ€ν
μμ λΉλκΈ° APIλ₯Ό μ¬μ©νλλΌλ, μ΅μ’
μ μΌλ‘λ κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬κΈ° μν΄ Blocking νΈμΆμ μ¬μ©νκΈ°λ ν©λλ€.
4οΈβ£ λΉλκΈ° + Non-blocking
λΉλκΈ° + Non-blockingμ νλ μλ² μμ€ν
μμ κ°μ₯ λ§μ΄ μ¬μ©λλ ꡬ쑰μ
λλ€.
μ΄ κ΅¬μ‘°μμλ μμ
μμκ³Ό μλ£κ° λΆλ¦¬λμ΄ μμΌλ©° (λΉλκΈ°), νΈμΆ μ€λ λκ° μ€λ¨λμ§λ μμ΅λλ€. (Non-blocking)
μ¦, μμ
μ μμν λ€ νΈμΆμλ μ¦μ λ°νλκ³ , μμ
μ΄ μλ£λλ©΄ μ½λ°±, μ΄λ²€νΈ, Future completion λ±μ ν΅ν΄ κ²°κ³Όκ° μ λ¬λ©λλ€.
μλ₯Ό λ€μ΄ Javaμ CompletableFutureλ₯Ό λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
return "Hello";
}).thenAccept(result -> {
System.out.println(result);
});
System.out.println("λ€λ₯Έ μμ
μν");
μ€ν νλ¦μ λ€μκ³Ό κ°μ΅λλ€.
λΉλκΈ° μμ
μμ
↓
μ¦μ λ°ν
↓
λ€λ₯Έ μμ
μν
↓
μμ
μλ£
↓
μ½λ°± μ€ν
supplyAsync() ν¨μλ₯Ό νΈμΆν μ€λ λλ Blocking μνλ‘ λ€μ΄κ°μ§ μκ³ , μμ
μλ£λ μ΄λ²€νΈ ννλ‘ μ λ¬λ©λλ€.
μ΄ κ΅¬μ‘°κ° λ°λ‘ λΉλκΈ° + Non-blockingμ
λλ€.
πλ§λ¬΄λ¦¬
λκΈ°, λΉλκΈ° μ΄μμ μ°Ύμλ³΄κ³ λμλ°©μμ νμ΅νλ©΄μ νκ°μ§ μ² νμ ν΅μ°°μ μ»κ² λμμ΅λλ€. λκΈ°μ λΉλκΈ°λ κ²°κ΅ μ°λ¦¬κ° μκ°μ λ€λ£¨λ λ°©μμ λν μ νμ΄λΌλ μ μ
λλ€.
λκΈ° λͺ¨λΈμ μκ°μ λ¨μνκ² λ§λλλ€. “λλλ©΄ λ€μ” μΈκ°μ μ¬κ³ ꡬ쑰μ κ°μ₯ μ λ§λ νλ¦μ
λλ€. λμ μ°λ¦¬λ κΈ°λ€λ¦Όμ΄λΌλ λΉμ©μ κ°μν©λλ€.
λΉλκΈ° λͺ¨λΈμ μκ°μ λΆν΄ν©λλ€. “μμκ³Ό μλ£λ₯Ό λΆλ¦¬νκ³ , μλ£λ₯Ό μ¬κ±΄(μλ¦Ό, μ΄λ²€νΈ)μΌλ‘ λ°λλ€.” λμ μ°λ¦¬λ 볡μ‘μ±μ κ°μν΄μΌ ν©λλ€. μ½λ°± μ§μ₯, μν κ΄λ¦¬, μμΈ μ νμ μ΄λ €μμ λͺ¨λ μ΄ λΆν΄λ μκ°μ λΆμμ©μ
λλ€.
“λ΄ μ μ΄ νλ¦μ μμ
μλ£μ λ¬ΆμΌ κ²μΈκ°, μλλ©΄ λΆλ¦¬ν κ²μΈκ°?”
“κ·Έ μ νμ΄ νμ¬ μ€ν μμ(μ€λ λ)μ λ©μΆκ² ν κ²μΈκ°, μλ κ²μΈκ°?”
λκΈ°/λΉλκΈ°λ μκ°μ κ΄κ³μ μ νμ΄κ³ ,
Blocking/Non-blockingμ μμ μ μ λ°©μμ μ νμ
λλ€.
μ΄μ μ λ λκΈ°μ λΉλκΈ°λ₯Ό μ€λͺ
ν λ “μμ°¨μ μ΄λ€”λΌκ³ λ§νμ§ μκ³ "λκΈ°λ μ μ΄ νλ¦κ³Ό μλ£ μμ μ΄ κ°μ μκ° μμ λμΈ κ΅¬μ‘°μ΄κ³ , λΉλκΈ°λ κ·Έ λμ μλ‘ λ€λ₯Έ μκ° μΆμ λλ ꡬ쑰λ€." λΌκ³ λ§ν μ μκ² λμλλ€.
μ΄ κ΄μ μΌλ‘ 보면, μ΄ κ°λ
λ€μ λ μ΄μ ν·κ°λ¦¬μ§ μμ΅λλ€. κ·Έλ¦¬κ³ λ¬΄μ보λ€, μ μ΄λ° μ΄λ¦μ΄ λΆμλμ§λ λΉλ‘μ μμ°μ€λ½κ² μ΄ν΄λμ΅λλ€.
'Computer Science' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| (22.10.09)Computer Science: λ€νΈμν¬(NETWORK) κΈ°μ΄,LAN κ³Ό WAN, bit μ byte (2) | 2022.10.09 |
|---|
λκΈ