4 λΆ„ μ†Œμš”

[10λΆ„ ν…Œμ½”ν†‘] 🐰 λ©ν† μ˜ Blocking vs Non-Blocking, Sync vs Async λ“£κ³  정리.

Blocking VS Non-Blocking

λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 주체λ₯Ό μ–΄λ–»κ²Œ λ‹€λ£¨λŠ”μ§€μ— κ΄€ν•œ 관점이닀.

Blocking

Blocking : μžμ‹ μ˜ μž‘μ—…μ„ μ§„ν–‰ν•˜λ‹€κ°€ λ‹€λ₯Έ 주체의 μž‘μ—…μ΄ μ‹œμž‘λ˜λ©΄ λ‹€λ₯Έ μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ κΈ°λ‹€λ Έλ‹€κ°€ μžμ‹ μ˜ μž‘μ—…μ„ μ‹œμž‘ν•˜λŠ” 것.

Untitled

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ΄€μ μ—μ„œ, μ²˜μŒμ—λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μžμ‹ μ˜ μž‘μ—…μ„ ν•œλ‹€. κ·ΈλŸ¬λ‹€κ°€ 컀널 μž‘μ—…μ΄ μ‹œμž‘λ˜λ©΄ 컀널 μž‘μ—…μ΄ μ§„ν–‰λ˜λŠ” λ™μ•ˆ 쉬고 μžˆλ‹€. 그러고 컀널 μž‘μ—…μ΄ λλ‚˜κ³  λ‚˜λ©΄ λ‹€μ‹œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μž‘μ—…μ΄ 진행이 λœλ‹€.

Non-Blocking

Non-Blocking : λ‹€λ₯Έ 주체의 μž‘μ—…μ— 관련없이 μžμ‹ μ˜ μž‘μ—…μ„ ν•˜λŠ” 것.

Untitled

λ…Ό 블둝킹은 λ‹€λ₯Έ 주체와 상관없이 μžμ‹ μ˜ 일을 μ§„ν–‰ν•œλ‹€. 컀널이 μž‘μ—†μ„ μ‹œμž‘ν•˜λŠ” μˆœκ°„ λΉ μ Έλ‚˜μ™€μ„œ λ‹€μ‹œ μžμ‹ μ˜ μž‘μ—…μ„ μ§„ν–‰ν•˜κ²Œ λœλ‹€.

Synchronous VS Asynchronous

Synchronous

μž‘μ—…μ„ λ™μ‹œμ— μˆ˜ν–‰ν•˜κ±°λ‚˜, λ™μ‹œμ— λλ‚˜κ±°λ‚˜, λλ‚˜λŠ” λ™μ‹œμ— μ‹œμž‘ν•¨μ„ 의미 β†’ 즉 주체듀간 μž‘μ—… μˆ˜ν–‰μ˜ μ‹œκ°„μ„ λ§žμΆ˜λ‹€

Untitled

μžμ‹ μ˜ μž‘μ—…μ„ ν•˜λ‹€κ°€ λ‹€λ₯Έ 주체(컀널)의 μž‘μ—…μ„ μš”μ²­ν•œλ‹€. μš”μ²­λ°›μ€ μž‘μ—…μ€ ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  λ‹€μ‹œ 결과값을 λ¦¬ν„΄ν•œλ‹€. κ²°κ³Όλ₯Ό 받은 후에야 μš”μ²­μ„ 보낸 μž‘μ—…μ€ λ‹€μ‹œ μžμ‹ μ˜ μž‘μ—…μ„ μž¬κ°œν•œλ‹€.

Asynchronous

μ‹œμž‘, μ’…λ£Œκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©° λλ‚˜λŠ” λ™μ‹œμ— μ‹œμž‘μ„ ν•˜μ§€ μ•ŠμŒμ„ 의미 β†’ 주체듀간 μž‘μ—… μˆ˜ν–‰μ˜ μ‹œκ°„μ„ λ§žμΆ”μ§€ μ•ŠλŠ”λ‹€.

Untitled

μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ‹€ λ‹€λ₯Έ 주체(컀널)μ—κ²Œ μž‘μ—…μ„ μš”μ²­ν•œλ‹€. Synchronous와 달리 컀널 μž‘μ—…μ˜ 결과에 μ‹ κ²½μ“°μ§€ μ•Šκ³  μžμ‹ μ˜ μž‘μ—…μ„ 계속 μˆ˜ν–‰ν•œλ‹€. μ»€λ„μž‘μ—…μ΄ λλ‚˜κ³  κ²°κ³Όκ°€ λŒμ•„μ˜€κ²Œ 되면 λŒμ•„μ˜¨ 결과에 λŒ€ν•΄μ„œ 상황을 μ²˜λ¦¬ν•  수 도 있고 μ•ˆν•  수 도 μžˆλ‹€.

λ„€κ°€μ§€ 쑰합에 λŒ€ν•΄μ„œ

Blocking, Synchronous

Untitled

Blocking의 관점은 μ œμ–΄κΆŒμ— μžˆλ‹€. λ‹€λ₯Έ μž‘μ—…μ΄ μ‹œμž‘λ˜λŠ” λ™μ•ˆ λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

Sync의 관점은 결과의 μ²˜λ¦¬μ΄λ‹€. λ‹€λ₯Έ μž‘μ—…μ΄ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•  λ•Œ, 결과값을 λ°›κ³  λ‚˜μ„œ μžμ‹ μ˜ μž‘μ—…μ„ μž¬κ°œν•œλ‹€.

μ˜ˆμ‹œ)

μ˜ˆμ‹œλ‘œ, ν”νžˆ μš°λ¦¬κ°€ μ‚¬μš©μžμ—κ²Œ μž…λ ₯값을 λ°›λŠ” μ½”λ“œλ₯Ό λ“€ 수 μžˆλ‹€.

Untitled

μž…λ ₯을 μš”μ²­ν• λ•Œ, μ œμ–΄κΆŒμ΄ μž…λ ₯λ°›λŠ” 주체(컀널)μ—κ²Œ λ„˜μ–΄κ°„λ‹€. λ”°λΌμ„œ scanner.nextLine()μ΄ν›„μ˜ β€œλΈ”λ‘ν‚Ή 동기”λ₯Ό 좜λ ₯ν•˜λŠ” μ½”λ“œλŠ” μž…λ ₯λ°›λŠ” μ»€λ„μ˜ μž‘μ—…μ΄ 끝날 λ•Œ κΉŒμ§€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

μ»€λ„μ˜ μž…λ ₯ μž‘μ—…μ΄ λλ‚˜κ³ , κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜κ²Œ 되면, μ œμ–΄κΆŒκ³Ό κ²°κ³Όλ₯Ό 같이 λ°›μ•„μ„œ 이후 μž‘μ—…μ„ μž¬κ°œν•˜κ²Œ λœλ‹€.

Non-Blocking Sync

Untitled

Non- Blocking 은 λ‹€λ₯Έ μž‘μ—…μ˜ μ£Όμ²΄μ—κ²Œ μž‘μ—…μ„ μš”μ²­ν•΄λ„ μžμ‹ μ˜ μ œμ–΄κΆŒμ„ κ·ΈλŒ€λ‘œ λ“€κ³  있고, 계속 μžμ‹ μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.(Non-Block)

ν—Œλ° SyncλŠ” 결과에 관심이 μžˆλŠ” 관점이라고 ν–ˆλ‹€. λ”°λΌμ„œ, μ œμ–΄κΆŒμ„ κ°€μ§€κ³  μžμ‹ μ˜ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ 쀑간쀑간에 계속 μš”μ²­ν•œ μž‘μ—…μ˜ μ£Όμ²΄μ—κ²Œ μž‘μ—… μ™„λ£Œ μ—¬λΆ€, 즉 κ²°κ³Ό(λ°˜ν™˜)값이 λ¬Όμ–΄λ³Έλ‹€.

묻고 μž‘μ—…μ΄ 아직 μ™„λ£Œλ˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ‹€μ‹œ λŒμ•„μ„œ μžμ‹ μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. 이같은 과정을 λ°˜λ³΅ν•œλ‹€.

κ²°κ΅­ μš”μ²­ν•œ μž‘μ—…μ£Όμ²΄μ˜ μž‘μ—…μ΄ λλ‚˜ κ²°κ³Όλ₯Ό 받을 수 있으면 이제 ν•΄λ‹Ή κ²°κ³Όλ₯Ό 받아와 μž‘μ—…μ„ μ²˜λ¦¬ν•œλ‹€(Sync)

μ˜ˆμ‹œ)

Non-blocking syncλŠ” blocking sync와 거의 큰 차이가 μ—†λ‹€.

μ •ν™•νžˆ λ§ν•˜λ©΄, Non-blocking SyncλŠ” Syncλ₯Ό μœ„ν•΄ μš”μ²­ν•œ μž‘μ—…μ˜ κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦¬λ©΄μ„œλ„, μžμ‹ μ˜ μ œμ–΄κΆŒμ€ μ—¬μ „νžˆ μ§€λ…€μ„œ 계속 μžμ‹ μ˜ μž‘μ—…μ„ μ§„ν–‰ν•œλ‹€λŠ” 차이가 μžˆλ‹€. μ–΄λ–€ μ˜ˆμ‹œκ°€ μžˆμ„κΉŒ?

β†’ κ²Œμž„μ—μ„œ 맡을 λ„˜μ–΄κ°€λŠ” μ½”λ“œλ₯Ό μ˜ˆμ‹œλ‘œ λ“€ 수 μžˆλ‹€.

Untitled

κ²Œμž„μ—μ„œ 맡을 μ „ν™˜ ν•  λ•Œ, 맡의 λ‘œλ”©μ„ κΈ°λ‹€λ¦¬λ©΄μ„œλ„ μœ μ €μ—κ²Œ λ§΅ 데이터λ₯Ό κ°€μ§€κ³  μ˜¬λ•Œ μ§„ν–‰ μ™„λ£Œμœ¨μ„ λ³΄μ—¬μ£ΌλŠ” 상황을 λ“€ 수 μžˆκ² λ‹€.

Blocking Async

Untitled

Blocking이기 λ•Œλ¬Έμ— μžμ‹ μ˜ μž‘μ—…μ— λŒ€ν•œ μ œμ–΄κΆŒμ€ μ—†λ‹€. ν•˜μ§€λ§Œ Async이기 λ•Œλ¬Έμ— μš”μ²­ν•œ μž‘μ—…μ˜ κ²°κ³Όλ₯Ό 기닀릴 ν•„μš”κ°€ μ—†λ‹€. 정말 μ΄μƒν•œ 쑰합이닀.

λ‹€μ‹œ 생각해보면, μš”μ²­ν•œ μž‘μ—…μ˜ κ²°κ³Όλ₯Ό 기닀릴 ν•„μš”κ°€ μ—†λŠ”λ°λ„ μ œμ–΄κΆŒμ„ κ°€μ§€μ§€ μ•Šμ•„μ„œ μžμ‹ μ˜ μž‘μ—…μ€ μˆ˜ν–‰ν•˜μ§€ λͺ»ν•œλ‹€. 동기, 블둝킹과 λ‹€λ₯Ό λ°”κ°€ μ—†λ‹€. ꡳ이 이런 상황을 μ‚¬μš©ν•  ν•„μš”κ°€ μžˆμ„κΉŒ?

β†’ 거의 μ•ˆμ“°μ΄λŠ” 쑰합이라고 보면 λœλ‹€. 보톡 이 쑰합은, Non-Blocking/Async둜 λ™μž‘ν•˜κ²Œ ν•˜λ €λ‹€κ°€ 개발자의 μ‹€μˆ˜λ‘œ ν˜Ήμ€ 기타 λ“±λ“±μ˜ 이유둜 μœ„μ™€κ°™μ΄ λ™μž‘ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€κ³  ν•œλ‹€.

μ˜λ„ν•˜κ³  μ‚¬μš©ν•˜κΈ° λ³΄λ‹€λŠ” μ‹€μˆ˜λ‘œ μ‚¬μš©λœλ‹€. 예λ₯Ό λ“€μ–΄, λΉ„λ™κΈ°λ‘œ λ‹€λ₯Έ μž‘μ—…μ„ μ‹€ν–‰ν–ˆμ§€λ§Œ, λ‹€λ₯Έ μž‘μ—…μ΄ λ‚΄λΆ€μ μœΌλ‘œ (DB λ“±λ“±) λΈ”λ‘ν‚ΉμœΌλ‘œ μˆ˜ν–‰λœλ‹€λ©΄ 이런 상황이 μžˆμ„ 수 μžˆλ‹€.

Non-Blocking Async

Untitled

Non-blocking은 λ‹€λ₯Έ μž‘μ—…μ΄ μ‹œμž‘λ˜μ–΄λ„ μžμ‹ μ΄ ν•˜λ˜ μž‘μ—…μ€ λ©ˆμΆ”μ§€ μ•ŠλŠ”λ‹€. (μ œμ–΄κΆŒμ„ κ·ΈλŒ€λ‘œ λ“€κ³  있기 λ•Œλ¬Έ)

λ”°λΌμ„œ μ–‘μͺ½μ—μ„œ μ„œλ‘œ 각자 μž‘μ—…μ„ μ²˜λ¦¬ν•œλ‹€.

그리고, AsyncλŠ” μ„œλ‘œμ˜ 결과에 관심이 μ—†λ‹€. λ‹€λ₯Έ μž‘μ—…μ΄ λλ‚œ ν›„ κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦° ν›„ λ°”λ‘œ λ°›μ•„μ„œ μ²˜λ¦¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μžμ‹ μ˜ μž‘μ—…μ΄ λλ‚œ 후에 처리λ₯Ό ν•˜λ˜μ§€, ν˜Ήμ€ μ•„μ˜ˆ 처리λ₯Ό μ•ˆν•  수 도 μžˆλ”°. ( ν˜Ήμ€ μš”μ²­ν•˜λŠ” μž‘μ—…μ˜ μ£Όμ²΄μ—κ²Œ μš”μ²­ 결과물을 μ–΄λ–€μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜λΌκ³  μ½œλ°±ν•¨μˆ˜λ₯Ό 전달할 μˆ˜λ„ μžˆλ‹€.)

μ˜ˆμ‹œ)

λŒ€ν‘œμ μΈ μ˜ˆμ‹œλ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ API μš”μ²­μ„ ν•˜κ³ (fetch) λ‹€λ₯Έ μž‘μ—…μ„ ν•˜λ‹€κ°€ μš”μ²­μ˜ 결과값을 λ°›μœΌλ©΄, μ½œλ°±μ„ ν†΅ν•΄μ„œ 좔가적인 μž‘μ—…μ„ μ²˜λ¦¬ν•  λ•Œλ₯Ό λ“€ 수 μžˆλ‹€.

정리

블둝킹/논블둝킹은 λ‹€λ₯Έ μž‘μ—…μ£Όμ²΄μ— λŒ€ν•œ μ œμ–΄κΆŒμ„ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”κ°€μ˜ 관점. β†’ μ œμ–΄μ˜ 관점

싱크/μ–΄μ‹±ν¬λŠ” μˆœμ„œμ™€ κ²°κ³Ό(처리)의 관점이닀.

블둝킹과 논블둝킹, 동기와 λΉ„λ™κΈ°μ˜ λ„€κ°€μ§€ 쑰합은 사싀 μ •ν™•νžˆ 뭐가 이렇닀 라고 λ”± μ§‘μ–΄μ„œ ν‘œν˜„ν•  수 μ—†λ‹€.

μ•„μ£Ό ꡭ지적인 κ΅¬μ—­μœΌλ‘œ 봀을 λ•ŒλŠ” κ·Έ ꡬ뢄이 κ°€λŠ₯ν•  μˆ˜λŠ” μžˆμ§€λ§Œ 전체적인 μ½”λ“œμ™€ 둜직의 νλ¦„μ—μ„œ μ–΄λ–€ 쑰합이닀 라고 λͺ…ν™•νžˆ κ΅¬λΆ„μ§“κΈ°λŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.

Untitled

예λ₯Ό λ“€μ–΄ 이 μ½”λ“œλ₯Ό 보자.

2~7쀄 μ „μ²΄μ μœΌλ‘œ λ³΄μ•˜μ„ λ•ŒλŠ” factorial ν•¨μˆ˜μ™€ μœ„ μ½”λ“œλŠ” λ™κΈ°μ μœΌλ‘œ λ™μž‘ν•œλ‹€. μ™œλƒλ©΄ line 7, long result = futureTask.get()으둜 factorialν•¨μˆ˜μ˜ μž‘μ—…μ΄ λλ‚˜κΈ°λ₯Ό κΈ°λ‹€λ Έλ‹€κ°€ κ·Έ 결과물을 λ°›μ•„μ˜€κ³  λ‹€μ‹œ μž‘μ—…μ„ μž¬κ°œν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

ν•˜μ§€λ§Œ κ·Έ κ³Όμ • μ†μ—μ„œλŠ” 비동기와 λ…Ό 블둝킹 λ“±μ˜ κ°œλ…μ„ μ μš©μ‹œν‚¬ 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ while문의 μ‘°κ±΄μ‹μ—μ„œ futureTask.isDone()으둜 factorialν•¨μˆ˜μ—κ²Œ μž‘μ—…μ˜ μ™„λ£Œ μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜κ³  μžˆλŠ”λ° μ΄λŠ” sync/non-blocking쑰합이라고 λ³Ό 수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ—¬κΈ°μ—μ„œ 쑰차도 더 깊게 λ“€μ–΄κ°€λ³΄μž. 이 λ§ˆμ €λ„, futureTask.isDone()μ΄λΌλŠ” ν•¨μˆ˜κ°€ 싀행될 λ•Œ μˆœκ°„μ μœΌλ‘œ blocking/syncκ°€ μΌμ–΄λ‚œλ‹€.(isDone()ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚΄κ³Ό λ™μ‹œμ— μ œμ–΄κΆŒμ΄ λ„˜μ–΄κ°€κ³  λ³Έ μ½”λ“œλŠ” 싀행을 쀑지, 그리고 isDone()의 λ°˜ν™˜κ°’μΈ λΆˆλ¦°μ„ λ°›μ„λ•ŒκΉŒμ§€ Syncν•˜κ²Œ λ™μž‘ν•¨)

λ„€κ°€μ§€ κ°œλ…μ„ 말둜 λ‚˜λˆŒλ €λ©΄ λ‚˜λˆŒ 수 μžˆμ§€λ§Œ λͺ¨λ“  μƒν™©μ—μ„œ λšœλ Έν•˜κ²Œ λ‚˜λˆ μ§€μ§„ μ•ŠλŠ”λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ await/async도 이게 κ³Όμ—° 동기/비동기라고 ν•  수 μžˆμ„κΉŒ? μ „μ²΄μ μœΌλ‘œ 봀을 λ•Œ μ½”λ“œμ—μ„œ await을 걸어도 화면은 보이고 μ΄λ²€νŠΈλ£¨ν”„λŠ” λ™μž‘ν•œλ‹€. 즉 비동기인 것이닀. await의 ν•¨μˆ˜κ°€ μ“°μ΄λŠ” ꡭ지적인 κ΄€μ μ—μ„œλŠ” λ¬Όλ‘  Syncμž„μ€ λ§žλ‹€.

ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 전체적인 κ΄€μ μ—μ„œλŠ” λΉ„λ™κΈ°μ μœΌλ‘œ μž‘λ™ν•˜λŠ” λ‘œμ§λ“€μ΄ λ§€μš°λ§Žμ„ 것이닀.

Untitled

μ°Έκ³ 

https://www.youtube.com/watch?v=IdpkfygWIMk

νƒœκ·Έ: ,

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°