동기적 실행 ( syschronous execution )

  • 서브루틴 간에 명확한 실행 순서 존재
  • A,B,C의 세 가지 서브루틴이 존재하고 A,B,C 순으로 실행되기를 기대한다면 반드시 A->B->C 순서로 실행되어야 
    한다. 즉, B는 A가 실행 완료되기를 기다리고, C는 A와 B가 실행 완료되기를 기다린다.

동기적 실행은 프로그래밍을 처음 배울 때부터 익숙한 개념이다. 일반적으로 코드는 1번째 줄 -> 2번째 줄 ... 식으로
line by line으로 실행되며, 이 순서가 뒤바뀌지 않는다. 

 

비동기적 실행 ( asynchronous execution )

  • 서브루틴 간에 명확한 실행 순서 존재 X
  • A->B->C의 순서로 실행될 수도 있고, B->C->A의 순서로 실행될 수도 있다. 
  • 이런 경우 서브루틴이 완료되었다는 것을 전달하기 위해 callback 패턴을 사용하기도 한다.

 

비동기적 실행은 실행이 뒤바뀔 수 있다. ( 물론 line 단위가 아니라 함수 단위로 비동기화를 한다. )
비동기적 실행은 프로그래밍 시에 구조를 잘 짜 놓지 않으면 예기치 못한 버그가 발생하게 된다. 예를 들어 서로 다른
서브루틴에서 동시에 data write를 시도한다면, 실행 순서에 따라 동작이 달라질 수 있다. 

비동기 기법은 특히 웹 프로그래밍에 매우 유용하다. 웹 앱이 브라우저에서 특정 코드를 실행하느라 브라우저에게
제어권을 돌려주지 않으면 브라우저는 마치 정지된 것처럼 보일 수 있다. 이러한 현상을 blocking이라고 한다.

 

멀티 스레드/코어가 일반화된 현 시점에서는 적절한 비동기화 구조는 상당한 성능 향상을 누릴 수 있다.

 

 

혼동하지 말아야 할 것

  • 동기/비동기적 실행은 멀티 스레딩과 전혀 관련이 없다.
    => 즉 하나의 스레드에서도 비동기적 실행을 할 수 있고, 멀티 스레드에서도 동기적 실행을 할 수 있다.
  • 스레드 or 코어의 개수가 중요한 것이 아니라 서브루틴 간의 실행 순서가 정해져 있는지가 중요하다.
  • 멀티쓰레드 프로그래밍에서 스레드간 크리티컬 섹션 문제 방지를 위한 동기화랑 여기서의 동기/비동기는 다르다!!

 

 

동기와 비동기의 동작 방식

 

동기와 비동기 예시

이렇게 해도 이해가 안 갈 수 있기 때문에 간단한 예시를 들겠다.

 

직원 - 서버, 손님 - 클라이언트

 

1. single thread - 동기 

  •    은행에서 직원 1명이 여러 손님들의 처리가 끝날 때까지 손님은 자기 순서가 올 때까지 줄서서 대기

2. multi thread - 동기

  •    은행에서 직원을 손님 수만큼 증가시킨다. 손님이 없을 때는? -> 비용 낭비

3. single thread - 비동기

  •    은행에서 직원 한명이 일을 보고 손님은 번호표를 뽑고 다른 일 처리

4. multi thread - 비동기

  •    손님의 수 만큼은 아니고 3~4명의 직원이 번호표 처리

 

솔직히 성능으로만 본다면 4번이 최고이나 무조건 4번만 하진 않는다.
왜냐하면 코드 구현이나 성능에 들어가는 비용이 많이 들고 복잡해 지기 때문이다.
그래서 적절하게 상황에 맞게 써야 한다.

 

실제로 웹의 경우는 언제 어디서 누가 몇 명이 어떤 순서로 들어올지 모르는 환경이다. 비동기 통신이기 때문이다.
그렇기 때문에 비용과 성능 측면에서 비동기 방식을 택하게 되는 것이다.

+ Recent posts