동기(Synchronous)λŠ” μ •ν™•νžˆ 무엇을 μ˜λ―Έν•˜λŠ”κ±ΈκΉŒ?

    동기(Synchronous)λŠ” μ •ν™•νžˆ 무엇을 μ˜λ―Έν•˜λŠ”κ±ΈκΉŒ?


    이번 ν¬μŠ€νŒ…μ—μ„œλŠ” I/O와 λ„€νŠΈμ›Œν¬ λ“± μ „λ°˜μ μœΌλ‘œ λ‹€μ–‘ν•œ λͺ¨λΈμ—μ„œ μ‚¬μš©ν•˜λŠ” κ°œλ…μΈ 동기(Synchronous)κ°€ μ •ν™•νžˆ 무엇을 μ˜λ―Έν•˜λŠ” 것인지, 그리고 동기 방식과 비동기 λ°©μ‹μ˜ 차이에 λŒ€ν•΄μ„œ ν•œλ²ˆ 이야기 해보렀고 ν•œλ‹€. 그리고 이 두 κ°€μ§€ κ°œλ…κ³Ό 많이 ν˜Όλ™λ˜λŠ” κ°œλ…μΈ 블둝킹(Blocking)κ³Ό 논블둝킹(Non-Blocking)에 λŒ€ν•΄μ„œλ„ κ°„λ‹¨ν•˜κ²Œ 짚고 λ„˜μ–΄κ°ˆ μ˜ˆμ •μ΄λ‹€.

    본격적인 ν¬μŠ€νŒ…μ— 듀어가기에 μ•žμ„œ ν•œκ°€μ§€ ν™•μ‹€ν•˜κ²Œ μ΄μ•ΌκΈ°ν•˜κ³  싢은 것은 동기와 λΉ„λ™κΈ°λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μˆ˜ν–‰ μˆœμ„œ 보μž₯에 λŒ€ν•œ λ§€μ»€λ‹ˆμ¦˜μ΄κ³  블둝킹과 논블둝킹은 ν”„λ‘œμ„ΈμŠ€μ˜ 유휴 μƒνƒœμ— λŒ€ν•œ κ°œλ…μœΌλ‘œ μ™„μ „ν•œ λ³„κ°œμ˜ κ°œλ…μ΄λΌλŠ” 것이닀.

    μ•„λ¬΄λž˜λ„ 동기와 블둝킹, 비동기와 λ…ΌλΈ”λ‘ν‚Ήμ˜ μž‘λ™ λ§€μ»€λ‹ˆμ¦˜μ΄ 더 직관적이기 λ•Œλ¬Έμ— λ§Žμ€ μ‚¬λžŒλ“€μ΄ 이 κ°œλ…λ“€μ„ 같은 것 ν˜Ήμ€ λΉ„μŠ·ν•œ κ²ƒμœΌλ‘œ μ˜€ν•΄ν•˜κ³  μžˆλŠ”λ°, 방금 이야기 ν–ˆλ“―μ΄ 이 두가지 κ°œλ…μ€ μ„œλ‘œ μ „ν˜€ λ‹€λ₯Έ 곳에 μ΄ˆμ μ„ 맞좘 κ°œλ…λ“€μ΄λ―€λ‘œ μ„œλ‘œ 직접적인 관련은 거의 μ—†λ‹€κ³  봐도 λœλ‹€. 단지 μ‘°ν•©ν•˜μ—¬ μ‚¬μš©λ˜λŠ” 것 뿐이닀.


    출처 - Boost application performance using asynchronous I/O, IBM

    이미 λ§Žμ€ λŠ₯λ ₯자 뢄듀이 이 μ£Όμ œμ— λŒ€ν•΄μ„œ 잘 정리해놓은 ν¬μŠ€νŒ…λ“€μ΄ μžˆμ§€λ§Œ, λŒ€λΆ€λΆ„ 이 κ°œλ…λ“€μ„ λ¬Άμ–΄μ„œ ν•¨κ»˜ 닀루고 있기 λ•Œλ¬Έμ— 이 κ°œλ…λ“€μ„ 처음 μ ‘ν•˜κ±°λ‚˜ 컴퓨터 곡학에 λŒ€ν•΄ 잘 λͺ¨λ₯΄λŠ” μ‚¬λžŒμ€ 이 κ°œλ…λ“€μ΄ μ„œλ‘œ λ­”κ°€ 연관이 μžˆλŠ” κ²ƒμœΌλ‘œ μ˜€ν•΄ν•˜κΈ° 쉽닀. ν•˜μ§€λ§Œ λ§Žμ€ ν¬μŠ€νŒ…μ—μ„œ 이 μ£Όμ œλ“€μ„ λ¬Άμ–΄μ„œ λ‹€λ£¨λŠ” μ΄μœ λŠ” 단지 이 κ°œλ…λ“€μ„ κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄μ—μ„œ 이 두 κ°€μ§€ κ°œλ…μ΄ ν•¨κ»˜ μ‚¬μš©λ˜κ³  있기 λ•Œλ¬Έμ— 이 κ°œλ…μ„ λΆ„λ¦¬ν•΄μ„œ λ”°λ‘œ μ„€λͺ…ν•˜λŠ” 것이 더 μ–΄λ ΅κΈ° λ•Œλ¬Έμ΄λ‹€.

    κ·Έλž˜μ„œ ν•„μžλ„ μ–΄μ©” 수 없이 이 κ°œλ…λ“€μ„ ν•¨κ»˜ μ„€λͺ…ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ, 직관적인 κ°œλ…μΈ 블둝킹 & λ…ΌλΈ”λ‘ν‚Ήλ³΄λ‹€λŠ” μ’€ 더 좔상적인 κ°œλ…μΈ 동기 & 비동기에 μ΄ˆμ μ„ λ§žμΆ°μ„œ μ§„ν–‰ν•  것이닀.

    λ™κΈ°λŠ” μ •ν™•νžˆ 뭘 λœ»ν•˜λŠ” 걸까?

    동기에 κ΄€λ ¨λœ ν¬μŠ€νŒ…λ“€μ„ 읽어보면 μ‚¬λžŒλ§ˆλ‹€ λ™κΈ°λΌλŠ” 단어λ₯Ό ν•΄μ„ν•œ κ²°κ³Όκ°€ 가지각색이닀. μ–΄λ–€ μ‚¬λžŒμ€ λ™μ‹œμ— λ°œμƒν•˜λŠ” 것, μ–΄λ–€ μ‚¬λžŒμ€ νŠΉμ •ν•œ ν΄λŸ­μ„ μ •ν•΄ ν†΅μ‹ ν•˜λŠ” 것, μ–΄λ–€ μ‚¬λžŒμ€ μƒνƒœλ₯Ό λ™μΌν•˜κ²Œ λ§Œλ“œλŠ” 것 λ“± λ™κΈ°λΌλŠ” λ‹¨μ–΄μ˜ μ“°μž„μƒˆκ°€ λ‹€μ–‘ν•œ 만큼 λ‹€μ–‘ν•œ 해석듀이 μ‘΄μž¬ν•œλ‹€. λ„λŒ€μ²΄ 뭐가 λ§žλŠ” 건지 μ•ŒκΈ°κ°€ νž˜λ“€λ‹€.

    ν•„μž λ˜ν•œ 처음 λ™κΈ°λΌλŠ” κ°œλ…μ„ 배울 λ•Œ λ™κΈ°λΌλŠ” 단어와 λ§€μ»€λ‹ˆμ¦˜μ΄ 잘 와닿지 μ•Šμ•„μ„œ ν˜Όλž€μŠ€λŸ¬μ› μ—ˆλ‹€. 뭐 블둝킹 같은 λ‹¨μ–΄λŠ” 농ꡬ같이 μΌμƒμ—μ„œ μ ‘ν•  수 μžˆλŠ” μŠ€ν¬μΈ μ—μ„œλ„ μ‚¬μš©ν•˜κ³  μžˆλŠ”λ°λ‹€κ°€ λ­”κ°€λ₯Ό λ§‰λŠ”λ‹€λΌλŠ” 뜻이 λ°”λ‘œ 와닿기 λ•Œλ¬Έμ— 쑰금 μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ νŽΈμ΄μ§€λ§Œ λ™κΈ°λŠ” μ•„λ‹ˆλ‹€.

    μΌμƒμ—μ„œ 주둜 μ ‘ν•˜λŠ” λ™κΈ°μ˜ μ“°μž„μƒˆ 쀑 λŒ€ν‘œμ μΈ μ˜ˆλŠ” 동기화(Synchronization)정도가 μžˆμ„ 것 κ°™λ‹€. 아이폰에 μŒμ•…μ„ 넣을 λ•Œ μ•„μ΄νŠ μ¦ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” 동기화 κΈ°λŠ₯ 같은 것 말이닀. μ΄λ•Œ λ™κΈ°ν™”λΌλŠ” ν–‰μœ„λŠ” μ„œλ‘œ λ‹€λ₯Έ μƒνƒœλ₯Ό 같은 κ²ƒμœΌλ‘œ λ§Œλ“œλŠ” 것을 μ˜λ―Έν•œλ‹€.

    itunes 동기화 한번 잘못해서 아이폰에 있는 음악이 다 날아가는 경험은 다들 한번쯤 있지 않을까

    ν•˜μ§€λ§Œ 컴퓨터 κ³΅ν•™μ—μ„œλŠ” λŒ€λΆ€λΆ„ 동기λ₯Ό λ™μ‹œμ— λ°œμƒν•˜λŠ” κ²ƒμ΄λΌκ³ λ§Œ μ„€λͺ…ν•˜κ³  있기 λ•Œλ¬Έμ— λŠλ‚Œμ΄ 쑰금 λ‹€λ₯΄λ‹€. λ¬Όλ‘  λ°μ΄ν„°λ² μ΄μŠ€ 동기화와 같이 λ™μΌν•œ 의미둜 μ‚¬μš©λ˜λŠ” κ²½μš°λ„ μžˆμ§€λ§Œ, λ§Žμ€ ν¬μŠ€νŒ…μ΄ I/Oλ‚˜ λ„€νŠΈμ›Œν¬μ— λŒ€ν•œ λ‚΄μš©μ„ 닀루고 있기 λ•Œλ¬Έμ— μ „μžμ˜ 의미둜 ν•΄μ„λ˜λŠ” κ²½μš°κ°€ λ§Žλ‹€.

    동기와 λΉ„λ™κΈ°λΌλŠ” 단어 쀑 λΉ„λ™κΈ°λŠ” 동기가 μ•„λ‹ˆλ‹€λΌλŠ” 의미이기 λ•Œλ¬Έμ— μš°λ¦¬λŠ” 동기가 μ •ν™•νžˆ 무엇을 λ§ν•˜λŠ” 것인지에 μ΄ˆμ μ„ λ§žμΆ°μ„œ μƒκ°ν•΄λ΄μ•Όν•œλ‹€. κ·Έλž˜μ„œ ν•„μžλŠ” λ™κΈ°λΌλŠ” 단어가 μ •ν™•νžˆ 무엇을 μ˜λ―Έν•˜λŠ”μ§€λΆ€ν„° ν•œλ²ˆ 이야기해보렀고 ν•œλ‹€.

    μ™œ λ™κΈ°λŠ” μ΄λ ‡κ²Œ λ‹€μ–‘ν•œ 해석을 κ°€μ§€λŠ” κ²ƒμΌκΉŒ?

    λ‹¨μ–΄μ˜ λ‰˜μ•™μŠ€λ₯Ό νŒŒμ•…ν•΄μ•Όν•œλ‹€

    고등학ꡐ λ•Œ μ–Έμ–΄ μ˜μ—­μ΄λ‚˜ μ™Έκ΅­μ–΄ μ˜μ—­μ„ 곡뢀할 λ•Œ μ§€λ¬Έ μ•ˆμ— 닡이 μžˆλ‹€λΌλŠ” 말을 λ“€μ–΄λ³Έ 적이 μžˆμ„ 것이닀. κ³΅ν•™μ΄λ‚˜ κ³Όν•™ λΆ„μ•Όμ—μ„œ μ‚¬μš©λ˜λŠ” μš©μ–΄λŠ” 주둜 μ˜μ–΄μ—μ„œ νŒŒμƒλ˜μ—ˆκ³ , 이λ₯Ό ν•œκ΅­μ–΄λ‘œ λ²ˆμ—­ν•˜λŠ” κ³Όμ •μ—μ„œ 였히렀 λœ»μ„ μ•ŒκΈ°κ°€ μ–΄λ €μš΄ λ‹¨μ–΄λ‘œ λ²ˆμ—­λ˜λŠ” κ²½μš°κ°€ 있기 λ•Œλ¬Έμ— 원본인 μ˜μ–΄ λ‹¨μ–΄μ˜ λœ»μ„ μ œλŒ€λ‘œ νŒŒμ•…ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

    κ°‘μžκΈ° λΆ„μœ„κΈ°κ°€ μ™Έκ΅­μ–΄ μ˜μ—­μ΄ 된 것 κ°™μ§€λ§Œ, ν•„μžλŠ” 개인적으둜 이런 κ³Όμ • λ˜ν•œ μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•œλ‹€. 이 과정을 톡해 μ™œ λ™κΈ°λΌλŠ” 단어가 상황에 따라 λ‹€λ₯Έ 의미λ₯Ό κ°€μ§ˆ 수 μžˆλŠ”μ§€ μ•Œ 수 있기 λ•Œλ¬Έμ΄λ‹€.

    memorize 암기하지말고 이해하자

    λ¨Όμ € 동기(同期)λΌλŠ” λ‹¨μ–΄μ˜ ν•œμžλ₯Ό 보면 같을 동(同), κΈ°μ•½ν•  κΈ°(期)λ₯Ό μ‚¬μš©ν•˜κ³  있으며, 일반적으둜 μš°λ¦¬κ°€ μž…μ‚¬ 동기, κ΅°λŒ€ 동기 등을 이야기 ν•  λ•Œ μ“°λŠ” 동기와 같은 단어닀. 이 λ‹¨μ–΄μ˜ ν•œμžλ§Œ 보면 같은 κΈ°κ°„ λ˜λŠ” 같은 μ£ΌκΈ°λΌλŠ” λœ»μ΄λ‹€. μ—­μ‹œ μš°λ¦¬κ°€ 일반적으둜 μ‚¬μš©ν•˜λŠ” λ™κΈ°ν™”μ˜ μ˜λ―Έλž‘μ€ 쑰금 λ‹€λ₯Έ 것 κ°™λ‹€.

    μš°λ¦¬κ°€ 아이폰과 μ•„μ΄νŠ μ¦ˆλ₯Ό λ™κΈ°ν™”ν•˜λŠ” 것이 이 두 λŒ€μƒμ˜ κΈ°κ°„μ΄λ‚˜ μ£ΌκΈ°λ₯Ό κ°™κ²Œ λ§žμΆ”λŠ” 것은 μ•„λ‹ˆμ§€ μ•Šμ€κ°€? κ²Œλ‹€κ°€ 일반적으둜 ν•œκ΅­μ–΄μ—μ„œ ~화라고 함은 μ•žμ— 뢙은 λ‹¨μ–΄μ˜ 의미λ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έκ°€λŠ” κ²½μš°κ°€ λ§Žμ•„μ„œ 더 ν—·κ°ˆλ¦°λ‹€.

    ν•˜μ§€λ§Œ 사싀 μš°λ¦¬κ°€ λ™κΈ°μ˜ λ²ˆμ—­μœΌλ‘œ 많이 μ‚¬μš©ν•˜λŠ” SynchronousλŠ” 살짝 λ‹€λ₯Έ λ‰˜μ•™μŠ€λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

    synchronous [adjective]
    : happening, existing, or arising at precisely the same time

    Webster https://www.merriam-webster.com/dictionary/synchronous

    자, 일단 SynchronousλŠ” 동기와 λ‹€λ₯΄κ²Œ ν˜•μš©μ‚¬λ‹€. κ·Έλž˜μ„œ 사싀 ν•œκ΅­μ–΄λ‘œ μ •ν™•νžˆ λ²ˆμ—­ν•˜λ©΄ 동기적인과 같은 뜻이 λ˜μ–΄μ•Ό ν•˜μ§€λ§Œ, ν•œκ΅­μ–΄λ‘œ ν˜•μš©μ‚¬λ₯Ό λ‹¨λ…μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” λ³„λ‘œ μ—†κΈ° λ•Œλ¬Έμ— κ·Έλƒ₯ νŽΈμ˜μƒ λͺ…μ‚¬λ‘œ λ²ˆμ—­ν•˜λŠ” 것 κ°™λ‹€. κ·ΈλŸ¬λ‚˜ 이런 κ³Όμ •μ—μ„œ ν•œκ΅­μ–΄ 단어와 μ˜μ–΄ λ‹¨μ–΄μ˜ λ‰˜μ•™μŠ€κ°€ λ‹¬λΌμ§€λŠ” κ²½μš°κ°€ λ°œμƒν•œλ‹€.

    그리고 의미λ₯Ό 보면 μ •ν™•νžˆ 같은 μ‹œκ°„μ— λ°œμƒ, μ‘΄μž¬ν•˜λŠ” 것이라고 ν•œλ‹€. 그리고 이 λ‹¨μ–΄λŠ” ν˜•μš©μ‚¬μ΄κΈ° λ•Œλ¬Έμ— 무엇이 μ •ν™•ν•˜κ²Œ 같은 μ‹œκ°„μ— λ°œμƒν•˜λŠ”μ§€λŠ” μ ν˜€μžˆμ§€ μ•Šλ‹€. 그럼 이제 동기화λ₯Ό μ˜λ―Έν•˜λŠ” λͺ…사인 Synchronization의 사전적 의미λ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž.

    synchronization
    : the state of being synchronous

    Webster https://www.merriam-webster.com/dictionary/synchronization

    Synchronization은 Synchronousν•œ μƒνƒœλΌκ³  ν•œλ‹€. 즉, 동기와 λ™κΈ°ν™”λŠ” 근본적으둜 같은 λœ»μ΄λΌλŠ” 말이닀. 같은 단어λ₯Ό κ³΅μœ ν•˜λŠ” 이 두 단어가 ν•œκ΅­μ–΄λ‘œ λ³€ν˜•λ˜λ©° λ‹€λ₯Έ 뜻이 λ˜λŠ” 것은 μ˜μ–΄λ₯Ό ν•œκ΅­μ–΄λ‘œ λ²ˆμ—­ν•˜λŠ” κ³Όμ •μ—μ„œ μ˜μ–΄ 특유의 λ‰˜μ•™μŠ€λ₯Ό μ œλŒ€λ‘œ ν‘œν˜„ν•˜κΈ°κ°€ μ–΄λ ΅κΈ° λ•Œλ¬Έμ— λ°œμƒν•˜λŠ” λ¬Έμ œμ΄λ‹€.

    κ²Œλ‹€κ°€ 이 λ‹¨μ–΄λ“€μ˜ μ›ν˜•μΈ SynchroλŠ” 단어 μžμ²΄κ°€ λœ»μ„ μ˜λ―Έν•˜λŠ” λ³€νƒœμ μΈ 단어이기 λ•Œλ¬Έμ— ν•œκ΅­μ–΄λ‘œ λ²ˆμ—­ν•˜κΈ°λ„ 쉽지 μ•Šλ‹€.(ν•œκ΅­μ–΄λ‘œ 치면 β€œμ• λ§€ν•˜λ‹€β€κ°™μ€ λŠλ‚Œμ΄λ‹€. 이런건 λ°˜λŒ€λ‘œ μ˜μ–΄λ‘œ λ²ˆμ—­ν•˜κΈ° 쉽지 μ•Šλ‹€.)

    Synchronize, Synchronization, Synchronous λ“± Synchroλ₯Ό κ³΅μœ ν•˜λŠ” 이 단어듀이 κ³΅ν†΅μ μœΌλ‘œ κ°€μ§€λŠ” λ‰˜μ•™μŠ€λŠ” λ°”λ‘œ λ™μ‹œμ— λ˜‘κ°™μ΄ μ§„ν–‰λ˜λŠ” λŠλ‚Œμ΄λ‹€. 그것이 μƒνƒœμ΄λ“  λ™μž‘μ΄λ“  사건이든 λ™μ‹œμ— λ˜‘κ°™μ΄ μ§„ν–‰λ˜λŠ” λŠλ‚Œμ„ λ§ν•˜λŠ” 것이닀.

    synchronized swimming 대표적인 싱크로의 예

    즉, 아이폰과 μ•„μ΄νŠ μ¦ˆμ˜ μƒνƒœλ₯Ό λ™μΌν•˜κ²Œ λ§Œλ“œλŠ” 것은 μž‘μ—…μ΄ 끝남과 λ™μ‹œμ— 아이폰과 μ•„μ΄νŠ μ¦ˆκ°€ 같은 μƒνƒœκ°€ λ˜λ―€λ‘œ Synchronousν•œ μƒνƒœκ°€ 된 것이고, 일반적으둜 컴퓨터 κ³΅ν•™μ—μ„œ μ΄μ•ΌκΈ°ν•˜λŠ” λ™κΈ°μ˜ 해석인 λ™μ‹œμ— λ°œμƒν•˜λŠ” 사건 λ˜ν•œ Synchronousν•œ 사건이라고 ν•  수 μžˆλŠ” 것이닀.

    심지어 이 λ‹¨μ–΄λ“€μ˜ 어원인 Syn-은 λ‹¨μˆœνžˆ TogetherλΌλŠ” 의미λ₯Ό λ‚΄ν¬ν•˜λŠ” 단어이기 λ•Œλ¬Έμ— 이런 μƒν™©μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

    He and I are out of sync in everything
    그와 λ‚˜λŠ” λͺ¨λ“  λ©΄μ—μ„œ λ§žμ§€ μ•ŠλŠ”λ‹€

    μ΄λ ‡κ²Œ ν•œκ΅­μ–΄λ‘œ μ§μ—­ν•˜κΈ° μ–΄λ €μš΄ λ‹¨μ–΄λŠ” λ‰˜μ•™μŠ€λ₯Ό ν†΅ν•΄μ„œ λœ»μ„ μ΄ν•΄ν•˜λŠ” 편이 더 μ’‹λ‹€. κ΅μˆ˜λ‹˜λ“€μ΄λ‚˜ κ³Όν•™μžλ“€μ΄ ν•œκ΅­μ–΄λ‘œ λ§ν•˜λŠ” 쀑간에 μ˜μ–΄ 단어λ₯Ό μ„žμ–΄κ°€λ©΄μ„œ μ‚¬μš©ν•˜λŠ” 것은 이런 μ΄μœ λ„ μžˆλ‹€κ³  μƒκ°ν•œλ‹€. 사싀 ν•œκ΅­μ–΄μ˜ λ™κΈ°λΌλŠ” μ˜λ―Έμ—λ§Œ μ΄ˆμ μ„ λ§žμΆ”λ©΄ Synchroμ—μ„œ λ³€ν˜•λœ 단어듀 κ°„μ˜ 곡톡점을 μ—°μƒν•˜κΈ°κ°€ 쉽지 μ•Šλ‹€.

    λ‹€μ‹œ μ •λ¦¬ν•˜μžλ©΄, Synchro-λ₯Ό μ‚¬μš©ν•˜λŠ” 단어듀은 λͺ¨λ‘ λ™μ‹œμ— λ˜‘κ°™μ΄ μ§„ν–‰λ˜λŠ” λŠλ‚Œμ˜ λ‰˜μ•™μŠ€λ₯Ό κ°€μ§€λŠ” 단어이닀. κ²°κ΅­ μš°λ¦¬κ°€ μƒνƒœμ˜ 톡일을 μ˜λ―Έν•˜λŠ” 동기화든 컴퓨터 κ³΅ν•™μ—μ„œ λ§ν•˜λŠ” λ™μ‹œμ— λ°œμƒν•œ 사건이든 λͺ¨λ‘ 같은 λ‰˜μ•™μŠ€λ₯Ό κ°€μ§€κ³  μžˆλ‹€λŠ” 것이닀.

    컴퓨터 κ³΅ν•™μ—μ„œμ˜ 동기

    λ§Žμ€ ν¬μŠ€νŒ…μ—μ„œ λ™κΈ°μ˜ 의미λ₯Ό μ„€λͺ…ν•  λ•Œ ν˜„μž¬ μž‘μ—…μ˜ μš”μ²­κ³Ό 응닡이 λ™μ‹œμ— λ°œμƒν•˜λŠ” κ²ƒμœΌλ‘œ μ„€λͺ…ν•˜κ³  μžˆμ§€λ§Œ, ν•„μžλŠ” 이 λ™μ‹œλΌλŠ” 단어가 κ°€μ§€λŠ” μ˜λ―Έμ™€ λ‹€λ₯΄κ²Œ μš”μ²­κ³Ό 응닡 μ‚¬μ΄μ—λŠ” μΌμ •ν•œ μ‹œκ°„μ΄ μ‘΄μž¬ν•  수 밖에 μ—†κΈ° λ•Œλ¬Έμ— λ­”κ°€ λͺ¨μˆœμ΄ λŠκ»΄μ§„λ‹€κ³  μƒκ°ν–ˆλ‹€.

    사싀 λ™μ‹œλΌλŠ” λ‹¨μ–΄λŠ” λ™μ‹œλ‹€λ°œμ μ—μ„œμ˜ μš©λ²•κ³Ό 같이 λ°˜λ“œμ‹œ μ°°λ‚˜μ˜ μˆœκ°„λ§Œμ„ μ˜λ―Έν•˜λŠ” 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ΄λ ‡κ²Œ μ„€λͺ…ν•  μˆ˜λ„ 있긴 ν•˜μ§€λ§Œ, 일반적인 λ™μ‹œλΌλŠ” λ‹¨μ–΄μ˜ μš©λ²•μ„ 생각해보면 직관적이지 μ•Šλ‹€κ³  μƒκ°ν•œλ‹€.

    κ·Έλž˜μ„œ ν•„μžλŠ” λ™μ‹œμ— λ°œμƒν•˜λŠ” 것은 ν˜„μž¬ μž‘μ—…μ˜ μš”μ²­κ³Ό 응닡이 μ•„λ‹ˆλΌ ν˜„μž¬ μž‘μ—…μ˜ 응닡과 λ‹€μŒ μž‘μ—…μ˜ μš”μ²­μ΄λΌκ³  μ„€λͺ…ν•˜λŠ” 게 더 λ§žμ§€ μ•Šλ‚˜ μ‹Άλ‹€.(μ• μ΄ˆμ— SynchronousλŠ” ν˜•μš©μ‚¬λΌ μ£Όμ–΄κ°€ μ—†λ‹€)

    sync 동기 방식은 현재 작업의 응답과 다음 작업의 요청의 타이밍을 맞추는 방식이다

    즉, ν˜„μž¬ μž‘μ—…μ˜ 응닡이 λ°œμƒν•¨κ³Ό λ™μ‹œμ— λ‹€μŒ μž‘μ—…μ„ μš”μ²­ν•œλ‹€λŠ” 것은 μž‘μ—…μ΄ μ–΄λ– ν•œ μˆœμ„œλ₯Ό κ°€μ§€κ³  μ§„ν–‰λœλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 그리고 이 μ‘λ‹΅μ΄λΌλŠ” 것도 사싀 귀에 λΆ™νžˆλ©΄ 귀걸이고 코에 λΆ™νžˆλ©΄ μ½”κ±Έμ΄λ‘œ, λ„€νŠΈμ›Œν¬ λͺ¨λΈμ—μ„œλŠ” μ„œλ²„μ˜ 응닡일 μˆ˜λ„ 있고 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으둜 μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ΄λΌλŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ, μ—¬κΈ°μ„œλŠ” 그런 λ‚΄λΆ€ λ‘œμ§λ³΄λ‹€λŠ” κ·Έλƒ₯ μž‘μ—…μ΄ μˆœμ„œλŒ€λ‘œ μ§„ν–‰λœλ‹€λŠ” κ²ƒμ΄λΌλŠ” κ²ƒμ—λ§Œ μ§‘μ€‘ν•˜μž.

    sync block 모든 인형의 눈알을 다 붙히기 전까지 퇴근은 없다

    μƒμœ„ ν”„λ‘œμ„ΈμŠ€μΈ 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 ν•¨μˆ˜ λ˜ν•œ 쀑간쀑간 μžμ‹ μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  μžˆμœΌλ―€λ‘œ 블둝킹이 μ•„λ‹ˆλΌ 논블둝킹 방식을 μ‚¬μš©ν•˜κ³  μžˆλŠ” 것이닀.

    sync non block 니가 일하는 동안 난 짬짬히 유튜브를 보겠다

    이 μ˜ˆμ œμ—μ„œλ„ 동기 & 블둝킹 방식과 λ§ˆμ°¬κ°€μ§€λ‘œ boss ν•¨μˆ˜λŠ” employee ν•¨μˆ˜μ˜ μž‘μ—…μ΄ λλ‚˜κΈ° μ „κΉŒμ§€λŠ” μ ˆλŒ€ 퇴근할 수 μ—†λ‹€. μž‘μ—…μ˜ μˆœμ„œκ°€ μ§€μΌœμ§€κ³  μžˆλŠ” 것이닀. 즉, 동기 λ°©μ‹μ΄λΌλŠ” 것은 μž‘μ—…μ˜ 순차적인 νλ¦„λ§Œ μ§€μΌœμ§„λ‹€λ©΄ 블둝킹이든 논블둝킹이든 아무 상관이 μ—†λ‹€κ³  ν•  수 μžˆλ‹€.

    컴퓨터 κ³΅ν•™μ—μ„œμ˜ 비동기

    ν•„μžλŠ” 동기 방식을 ν˜„μž¬ μž‘μ—…μ˜ 응닡과 λ‹€μŒ μž‘μ—…μ˜ μš”μ²­μ˜ 타이밍이 μΌμΉ˜ν•˜λŠ” 것이라고 이야기 ν–ˆλ‹€. 비동기 방식은 말 κ·ΈλŒ€λ‘œ 동기 방식이 μ•„λ‹ˆλΌλŠ” 의미이기 λ•Œλ¬Έμ— λ°˜λŒ€λ‘œ μƒκ°ν•˜λ©΄ λœλ‹€. 즉, ν˜„μž¬ μž‘μ—…μ˜ 응닡과 λ‹€μŒ μž‘μ—…μ˜ μš”μ²­μ˜ 타이밍이 μΌμΉ˜ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 것이닀.

    async 작업을 지시하고나면 그 작업이 언제 끝나는 지는 신경쓰지않는다.

    동기 방식은 μƒμœ„ ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ μž‘μ—…μ„ μ§€μ‹œν•  λ•Œ μž‘μ—…μ˜ μ’…λ£Œ μ‹œμ μ„ μ•Œκ³  μžˆμ–΄μ•Όν•œλ‹€. ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—…μ΄ μ™„λ£Œλ˜μ–΄ 결과물을 뱉어내든 ν˜Ήμ€ μž‘μ—…μ΄ 아직 μ§„ν–‰ 쀑이든 μž‘μ—…μ˜ μ’…λ£Œ μ‹œμ μ€ 항상 μž‘μ—…μ„ μ‹œν‚¨ λ†ˆμΈ μƒμœ„ ν”„λ‘œμ„ΈμŠ€κ°€ μ‹ κ²½μ“°κ³ μžˆλ‹€.

    ν•˜μ§€λ§Œ 비동기 방식은 λ‹€λ₯΄λ‹€. μƒμœ„ ν”„λ‘œμ„ΈμŠ€λŠ” μž‘μ—…μ„ 일단 μ§€μ‹œν–ˆμœΌλ©΄ κ·Έ λ‹€μŒλΆ€ν„°λŠ” μž‘μ—…μ΄ μ§„ν–‰ 쀑이든 μ’…λ£Œκ°€ λ˜μ—ˆλ“  μ‹ κ²½μ“°μ§€μ•ŠλŠ”λ‹€. 동기 방식을 μ„€λͺ…ν–ˆμ„ λ•Œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ΄λ•Œ μƒμœ„ ν”„λ‘œμ„ΈμŠ€κ°€ μžμ‹ μ˜ μž‘μ—…μ„ ν•  수 μžˆλƒ μ—†λƒλŠ” λ³„κ°œμ˜ λ¬Έμ œμ΄λ‹€.

    λ˜ν•œ μƒμœ„ ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—… μ’…λ£Œ μ—¬λΆ€λ₯Ό μ‹ κ²½μ“°μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μž‘μ—…μ˜ μ’…λ£Œκ°€ 순차적으둜 μ΄λ£¨μ–΄μ§€λŠ” 것을 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 그럼 λ¨Όμ €, μš°λ¦¬μ—κ²Œ μ΅μˆ™ν•œ 방식인 비동기 & λ…ΌλΈ”λ‘œν‚Ή 방식뢀터 ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž.

    비동기 방식 + λ…ΌλΈ”λ‘œν‚Ή 방식

    비동기 방식과 λ…ΌλΈ”λ‘œν‚Ή 방식을 μ‘°ν•©ν•œ 방법은 μš°λ¦¬μ—κ²Œ ꡉμž₯히 μ΅μˆ™ν•œ 방식이닀. 비동기 방식이기 λ•Œλ¬Έμ— μƒμœ„ ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—… μ™„λ£Œ μ—¬λΆ€λ₯Ό λ”°λ‘œ μ‹ κ²½μ“°μ§€ μ•ŠλŠ”λ‹€. 이후 ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—…μ΄ μ’…λ£Œλ˜λ©΄ 슀슀둜 μƒμœ„ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 보고λ₯Ό ν•˜λ“  μ•„λ‹ˆλ©΄ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 일을 λ§‘κΈ°λ“  ν•  것이닀.

    그리고 λ…ΌλΈ”λ‘œν‚Ή 방식이기 λ•Œλ¬Έμ— μƒμœ„ ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 일을 λ§‘κΈ°κ³  μžμ‹ μ˜ μž‘μ—…μ„ 계속 μˆ˜ν–‰ν•  μˆ˜λ„ μžˆλ‹€.

    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 ν•¨μˆ˜μ˜ μž‘μ—…μ΄ μ–Έμ œ λλ‚˜λŠ”μ§€λŠ” 관심이 μ—†μœΌλ©° μž‘μ—…μ˜ μ™„λ£Œ μ‹ ν˜ΈλŠ” 콜백으둜 λ„˜κ²¨μ§„ λˆˆμ•Œ κ²°μ‚° 보고 μž‘μ—…μ΄ λŒ€μ‹  λ°›μ•„μ„œ μ²˜λ¦¬ν•˜κ³  μžˆλ‹€.

    async non block 사장님은 작업만 지시하고 바로 퇴근하신다

    비동기 & λ…ΌλΈ”λ‘œν‚Ή 방식은 μ—¬λŸ¬ 개의 μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλŠ” λΆ€λΆ„μ—μ„œ 효율적이라고 ν•  수 μžˆμ§€λ§Œ, λ„ˆλ¬΄ λ³΅μž‘ν•˜κ²Œ μ–½νžŒ 비동기 처리 λ•Œλ¬Έμ— κ°œλ°œμžκ°€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 흐름을 읽기 μ–΄λ €μ›Œμ§€λŠ” λ“±μ˜ λ¬Έμ œκ°€ μžˆμ„ 수 μžˆλ‹€. JavaScriptμ—μ„œ Promiseλ‚˜ async/await와 같은 문법을 μ‚¬μš©ν•˜λŠ” μ΄μœ λ„ 이런 비동기 처리의 흐름을 μ’€ 더 λͺ…ν™•ν•˜κ²Œ μΈμ§€ν•˜κ³ μž ν•˜λŠ” λ…Έλ ₯인 것이닀.

    λ˜ν•œ NodeJS의 이벀트 루프와 같이 비동기 방식도 λ‚΄λΆ€ κ΅¬ν˜„μ„ λœ―μ–΄λ³΄λ©΄ 동기적인 νŒ¨ν„΄μ΄ ν¬ν•¨λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— λ‚¨λ°œν•˜κ²Œλ˜λ©΄ μ–΄λ”˜κ°€μ— 병λͺ©μ΄ 생길 μˆ˜λ„ μžˆλ‹€.

    비동기 방식 + λΈ”λ‘œν‚Ή 방식

    그럼 이제 λ§ˆμ§€λ§‰μœΌλ‘œ, ν‰μ†Œμ— μ ‘ν•˜κΈ° νž˜λ“  κ°œλ…μΈ 비동기 & λΈ”λ‘œν‚Ήμ„ μ‚΄νŽ΄λ³΄μž. 이 방식은 일반적인 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ λ ˆμ΄μ–΄μ—μ„œλŠ” 자주 μ‚¬μš©λ˜μ§€ μ•Šκ³  Linux와 Unix 운영체제의 I/O 닀쀑화 λͺ¨λΈ μ •λ„μ˜ μ €λ ˆλ²¨μ—μ„œ μ‚¬μš©λ˜κ³  μžˆλ‹€. κ·Έλž˜μ„œ μ§€κΈˆκΉŒμ§€ 예제둜 μ‚¬μš©ν•˜λ˜ 사μž₯λ‹˜κ³Ό 직원은 이제 그만 ν‡΄κ·Όμ‹œμΌœμ£Όκ³  μ„€λͺ…을 μ§„ν–‰ν•  것이닀.

    일단 이 κ°œλ…μ€ 얼핏 λ“€μœΌλ©΄ λΉ„νš¨μœ¨μ μ΄κΈ°λ§Œ ν•  μˆ˜λ„ μžˆλ‹€. 비동기 λ°©μ‹μ˜ μž₯점은 ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—…μ΄ λλ‚˜λŠ” 것을 기닀리지 μ•ŠμŒμœΌλ‘œμ¨ μ—¬λŸ¬ 개의 μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλ‹€λŠ” 것인데, ν”„λ‘œμ„ΈμŠ€κ°€ λΈ”λ‘ν‚Ήλ˜μ–΄λ²„λ €μ„œ 유휴 μƒνƒœμ— λΉ μ§„λ‹€λ©΄ 아무 것도 μ²˜λ¦¬ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

    ν•˜μ§€λ§Œ 이 κ°œλ…μ΄ λ‚˜μ˜€κ²Œ 된 μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

    1. 동기 & 블둝킹 I/O의 경우 μ§κ΄€μ μ΄λ‚˜, μ—¬λŸ¬ 개의 I/Oλ₯Ό λ™μ‹œμ— μ²˜λ¦¬ν•  수 μ—†λ‹€.
    2. 논블둝킹 I/OλŠ” ν”„λ‘œμ„ΈμŠ€λ“€μ˜ μž‘μ—…μ„ μ»¨νŠΈλ‘€ν•˜λŠ” 것이 κΉŒλ‹€λ‘­λ‹€. (λŒ€λΆ€λΆ„ 이런 μ €λ ˆλ²¨ ν”„λ‘œκ·Έλž¨μ€ C둜 μ§ λ‹€. JSλ‚˜ Python 같은 κ±Έ μƒκ°ν•˜λ©΄ μ•ˆλœλ‹€.)
    3. κ·Έλ ‡λ‹€κ³  동기 & 블둝킹 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, 동기식 ν”„λ‘œκ·Έλž˜λ° λ“± 동기에 λŒ€ν•œ λ‹€λ₯Έ κ°œλ…λ“€μ„ 계속 ν•΄μ„œ μ ‘ν•˜κ²Œ λ˜μ—ˆλŠ”λ°, μ„œλ¬Έμ—μ„œ μ΄μ•ΌκΈ°ν–ˆλ“―μ΄ λˆ„κ΅¬λŠ” λ™κΈ°λΌλŠ” 단어가 λ™μ‹œμ— λ°œμƒν•˜λŠ” 것이라고 ν•˜κ³  λˆ„κ΅¬λŠ” νŠΉμ •ν•œ ν΄λŸ­μ„ λ§žμΆ°μ„œ ν†΅μ‹ ν•˜λŠ” 것, 또 λˆ„κ΅¬λŠ” 이전 μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” 것이라고 ν•˜λŠ” λ“± 해석이 λ‹€ λ‹¬λΌμ„œ 더 ν˜Όλž€μŠ€λŸ¬μ› λ‹€.

    dont know 아니 왜 말하는 게 다 달라...?

    κ·Έλž˜μ„œ 이번 ν¬μŠ€νŒ…μ„ μž‘μ„±ν•˜λ©΄μ„œ SynchronousλΌλŠ” 단어가 μ •ν™•νžˆ μ–΄λ–€ μƒνƒœλ₯Ό μ˜λ―Έν•˜λŠ” 것인지뢀터 λ‹€μ‹œ κ³΅λΆ€ν–ˆμ—ˆλŠ”λ°, ν™•μ‹€νžˆ λ‹¨μ–΄μ˜ λ‰˜μ•™μŠ€λ₯Ό μ΄ν•΄ν•˜κ³ λ‚˜λ‹ˆ μ™œ μ΄λ ‡κ²Œ λ‹€λ₯Έ 해석듀이 λ‚˜μ˜€κ²Œ λ˜μ—ˆλŠ”μ§€ 약간은 이해가 κ°€λŠ” 것 κ°™λ‹€. 단어 μžμ²΄κ°€ λœ»μ„ μ˜λ―Έν•˜λŠ” λ‹¨μ–΄λ‹€λ³΄λ‹ˆ 이건 κ·Έλƒ₯ ν•΄μ„ν•˜κΈ° λ‚˜λ¦„μΈκ²ƒ 같기도 ν•˜λ‹€.

    μ–΄μ¨Œλ“  λ‹€λ₯Έ 건 λ‹€ μ°¨μΉ˜ν•˜κ³ μ„œλΌλ„ SynchronousλΌλŠ” 단어가 λ™μ‹œμ— λ˜‘κ°™μ΄ μ§„ν–‰λ˜λŠ” λŠλ‚Œμ΄λΌλŠ” λ‰˜μ•™μŠ€λ₯Ό μ•Œκ²Œ 된 것이 이번 ν¬μŠ€νŒ…μ˜ μ΅œλŒ€ μˆ˜ν™•μ΄ μ•„λ‹κΉŒλΌλŠ” 생각을 ν•΄λ³Έλ‹€.

    μ΄μƒμœΌλ‘œ 동기(Synchronous)λŠ” μ •ν™•νžˆ 무엇을 μ˜λ―Έν•˜λŠ”κ±ΈκΉŒ? ν¬μŠ€νŒ…μ„ λ§ˆμΉœλ‹€.

    Evan Moon

    🐒 거뢁이처럼 μ‚΄μž

    κ°œλ°œμ„ μž˜ν•˜κΈ° μœ„ν•΄μ„œκ°€ μ•„λ‹Œ κ°œλ°œμ„ 즐기기 μœ„ν•΄ λ…Έλ ₯ν•˜λŠ” κ°œλ°œμžμž…λ‹ˆλ‹€. μ‚¬μ†Œν•œ 생각 정리뢀터 νŠœν† λ¦¬μ–Ό, μ‚½μ§ˆκΈ° 정도λ₯Ό 주둜 끄적이고 μžˆμŠ΅λ‹ˆλ‹€.