작업 시간을 함께 맞춰서 실행한다.
요청한 작업에 대해 완료 여부를 따져 순차대로 처리하는 것을 말한다.
작업 B가 완료되어야 다음 작업을 수행한다.
요청한 작업에 대해 완료 여부를 따지지 않음
작업 B의 완료 여부를 따지지 않고 바로 다음 작업을 수행한다.
응답이 올때까지 기다리느냐, 아니냐가 동기와 비동기의 차이인데, 이를 쉽게 말한다면 여러개의 요청 작업을 순차적으로 처리하느냐 아니냐에 따른 차이다.
쉬운 예시를 들어보도록 하자. A,B,C라는 작업이 있다고 가정하자. 만약 동기방식으로 처리하게 된 다면 A->B->C 순으로 응답이 도착하게 될 것이다. 그러나, 비동기 방식으로 처리하게 된다면 B->C->A 혹은 C->B->A 등의 무작위 순서로 실행되게 되는 것이다.
작업 3개를 요청했는데 응답에서 그 순서가 지켜진다면 동기
지켜지지 않는다면 비동기
비동기는 성능과 연관이 깊다. 요청한 작업의 완료 여부가 상관 없다는 것은 입출력 요청과 같이 느린 작업일 경우 입출력을 기다리지 않고, 자신의 다른 작업을 수행할 수 있기 때문에 전반적인 시스템 성능 향상에 도움을 줄 수 있다.
동기 비동기와 더불어서 가장 헷갈리는 Block 과 Non-Block이다.
이를 이해하기 위해선 두가지를 우선 알아야 하는데
블로킹과 논블로킹은 A 함수가 B 함수를 호출했을 때, 제어권을 어떻게 처리하느냐에 따라 달라진다.
블로킹은 A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B함수에 넘겨준다.
논블로킹은 A함수가 B함수를 호출해도 제어권을 그대로 가진다
A함수가 B함수를 호출하면, B함수는 실행되지만, 제어권을 A가 그대로 갖고 있기에 A는 다시 자기 코드를 실행한다.
동기를 블로킹처럼 실행하는 것
함수 A는 함수 B의 결과값이 필요하다(동기). 그렇기에 제어권을 B에게 넘겨준 후, B에게 응답값이 올 때 까지 A의 함수는 실행을 중지한다 (블로킹)
동기를 논블로킹으로 실행해보자
A는 B함수의 결과값이 필요하다 (동기). 그러나 논블로킹이기 때문에 제어권은 A에게 그대로 있음. 그럼에도 B의 결과값이 필요하기 때문에 A 함수 실행하는 중간중간 계ㅖㅖ속 B에게 물어본다.
비동기 논블로킹
A함수가 B함수를 호출하되 제어권을 주지 않는다(논블로킹). 따라서 B 함수를 호출한 이후에도 A함수는 계속해서 실행한다. 대신, 콜백함수를 넘긴다.
이후, B 함수가 실행이 마무리 되면 A에게 받은 콜백함수를 실행한다 (비동기)
비동기 블로킹
거의 마주하기 쉽지 않다. Async-Blocking과 Sync-Blocking과 성능 차이가 비슷하므로 사용하는 경우가 거의 없다.
A함수는 B함수의 리턴값에 신경쓰지 않고, 콜백함수를 보낸다 (비동기). 근데? 제어권도 넘김 (블로킹)
따라서 A함수는 B 함수의 작업이 끝날 때 까지 기다려야 한다
References
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC#%EB%8F%99%EA%B8%B0synchronous_/_%EB%B9%84%EB%8F%99%EA%B8%B0asynchronous
https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0