Computer Science

Synchronous(동기), Asynchronous(비동기) λ‹¨μ–΄μ˜ μ˜λ―ΈλΆ€ν„° νŒŒμ•…ν•˜μ—¬ μ œλŒ€λ‘œ μ΄ν•΄ν•˜κΈ°. + Blocking I/O, Non-blocking I/O

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2026. 2. 26.

πŸ“κ°œμš”

κ°œλ°œμ±…μ„ 읽닀 μ†Œλ‹¨μ› 제λͺ©μ΄ "비동기"둜 λ˜μ–΄ μžˆλŠ” 책을 λ΄€μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‹€ 문득 이런 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

 

동기? 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κ°€ “μ‹œκ°„μ„ 맞좰” μ›€μ§μ΄λŠ” κ±°μ£ . 

  1. CPU → I/O → CPU resumes

 

μ΄λŸ¬ν•œ ν•œκ³„λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같이 μƒκ°ν•˜κ²Œ λμŠ΅λ‹ˆλ‹€.

"CPUκ°€ I/O 끝날 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜λŠ”κ°€?"

 

λ°˜λŒ€λ‘œ Asynchronous I/O은 CPUκ°€ I/O μš”μ²­ ν›„ λ°”λ‘œ λ‹€λ₯Έ 일 μˆ˜ν–‰μ„ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 I/Oκ°€ μ™„λ£Œλ˜λ©΄ μΈν„°λŸ½νŠΈλ‘œ μ•Œλ ΈμŠ΅λ‹ˆλ‹€.

  1. CPU → I/O μ‹œμž‘
  2. CPU λ‹€λ₯Έ 일 μˆ˜ν–‰
  3. 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 λ°©μ‹μ—μ„œλŠ” μ˜€λΈμ„ μž‘λ™μ‹œν‚€λŠ” μž‘업을 ν˜ΈμΆœν•œ λ’€, κ·Έ μž‘업이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ ν˜ΈμΆœν•œ μŠ€λ ˆλ“œκ°€ λŒ€κΈ° μƒνƒœμ— λ“€μ–΄κ°‘λ‹ˆλ‹€.

즉, νŒŒλž€μƒ‰ μž‘업을 μˆ˜ν–‰ν•˜λ˜ μŠ€λ ˆλ“œκ°€ λ…Έλž€μƒ‰ μž‘μ—…(λΉ΅ λ°μš°κΈ°)을 ν˜ΈμΆœν•˜λ©΄ λ‹€μŒκ³Ό κ°™μ€ νλ¦„이 λ©λ‹ˆλ‹€.

 

  1. νŒŒλž€ μŠ€λ ˆλ“œκ°€ 였븐 μž‘μ—…μ„ 호좜
  2. 였븐 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μŠ€λ ˆλ“œλŠ” λŒ€κΈ° μƒνƒœ(sleep)에 듀어감
  3. 빡이 μ™„μ„±λœ 뒀에야 μŠ€λ ˆλ“œκ°€ λ‹€μ‹œ 싀행을 재개


μ΄λ•Œ μ€‘μš”ν•œ 점은 μŠ€λ ˆλ“œ μžμ²΄κ°€ λ©ˆμΆ˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 였븐이 빡을 λ°μš°λŠ” λ™μ•ˆ λ‘œλ΄‡μ€ λ‹€λ₯Έ 일을 ν•  수 μ—†κ³ , ν•΄λ‹Ή μŠ€λ ˆλ“œλŠ” λ‹¨μˆœνžˆ κΈ°λ‹€λ¦¬κ³ λ§Œ μžˆμŠ΅λ‹ˆλ‹€. 같은 λ°©μ‹μœΌλ‘œ 컀피 λ¨Έμ‹  μž‘μ—…μ„ ν˜ΈμΆœν•˜λ©΄, 컀피가 λ‚΄λ €μ§ˆ λ•ŒκΉŒμ§€ μŠ€λ ˆλ“œλŠ” λ‹€μ‹œ λŒ€κΈ° μƒνƒœμ— λ“€μ–΄κ°‘λ‹ˆλ‹€. 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 λ°©μ‹μ—μ„œλŠ” 상황이 쑰금 λ‹€λ₯΄κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.
νŒŒλž€μƒ‰ μž‘업을 μˆ˜ν–‰ν•˜λ˜ μŠ€λ ˆλ“œκ°€ λ…Έλž€μƒ‰ μž‘μ—…(λΉ΅ λ°μš°κΈ°)을 ν˜ΈμΆœν•˜λ”라도, μ΄λ²ˆμ—λŠ” μ˜€λΈ μž‘업이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ˜€λΈμ„ μž‘λ™μ‹œν‚€λŠ” ν˜ΈμΆœμ€ μ¦‰μ‹œ λ°˜ν™˜λ˜κ³ , μŠ€λ ˆλ“œλŠ” λŒ€κΈ° μƒνƒœλ‘œ λ“€μ–΄κ°€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

즉 νλ¦„은 λ‹€μŒκ³Ό κ°™μ΄ λ©λ‹ˆλ‹€.

  1. νŒŒλž€ μŠ€λ ˆλ“œκ°€ 였븐 μž‘μ—…μ„ 호좜
  2. ν˜ΈμΆœμ€ μ¦‰μ‹œ λ°˜ν™˜λ¨
  3. μŠ€λ ˆλ“œλŠ” λ‹€μŒ μž‘μ—…μ„ 계속 μˆ˜ν–‰


그리고 ν˜ΈμΆœν•œ μž‘μ—…μΈ 빡이 μ™„μ„±λ˜λ©΄ λ‚˜μ€‘μ— μ™„λ£Œ μ•Œλ¦Ό(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은 μžμ› μ μœ  λ°©μ‹μ˜ μ„ νƒμž…λ‹ˆλ‹€.

 


이제 μ €λŠ” 동기와 비동기λ₯Ό μ„€λͺ…ν•  λ•Œ “μˆœμ°¨μ μ΄λ‹€”라고 λ§ν•˜μ§€ μ•Šκ³  "λ™κΈ°λŠ” μ œμ–΄ 흐름과 μ™„λ£Œ μ‹œμ μ΄ 같은 μ‹œκ°„ μœ„μ— 놓인 ꡬ쑰이고, λΉ„λ™κΈ°λŠ” κ·Έ λ‘˜μ„ μ„œλ‘œ λ‹€λ₯Έ μ‹œκ°„ 좕에 λ†“λŠ” ꡬ쑰닀." 라고 말할 수 있게 λμ”λ‹ˆλ‹€.


이 κ΄€μ μœΌλ‘œ 보면, 이 κ°œλ…λ“€μ€ 더 이상 ν—·κ°ˆλ¦¬μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 무엇보닀, μ™œ 이런 이름이 λΆ™μ—ˆλŠ”μ§€λ„ λΉ„λ‘œμ†Œ μžμ—°μŠ€λŸ½κ²Œ μ΄ν•΄λμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€