동기와 비동기의 차이

공덕이형·2023년 12월 11일
0

CS

목록 보기
5/17

동기 (Synchronous) / 비동기 (Asynchronous)

동기

  • Syn ('함께') chrono ('시간')
    • 작업 시간을 함께 맞춰서 실행한다.

    • 요청한 작업에 대해 완료 여부를 따져 순차대로 처리하는 것을 말한다.

      작업 B가 완료되어야 다음 작업을 수행한다.

비동기

  • A ('부정') Syn ('함께') chrono ('시간')
    • 요청한 작업에 대해 완료 여부를 따지지 않음

      작업 B의 완료 여부를 따지지 않고 바로 다음 작업을 수행한다.

동기와 비동기의 차이

응답이 올때까지 기다리느냐, 아니냐가 동기와 비동기의 차이인데, 이를 쉽게 말한다면 여러개의 요청 작업을 순차적으로 처리하느냐 아니냐에 따른 차이다.

쉬운 예시를 들어보도록 하자. A,B,C라는 작업이 있다고 가정하자. 만약 동기방식으로 처리하게 된 다면 A->B->C 순으로 응답이 도착하게 될 것이다. 그러나, 비동기 방식으로 처리하게 된다면 B->C->A 혹은 C->B->A 등의 무작위 순서로 실행되게 되는 것이다.

작업 3개를 요청했는데 응답에서 그 순서가 지켜진다면 동기
지켜지지 않는다면 비동기

비동기의 성능 이점

비동기는 성능과 연관이 깊다. 요청한 작업의 완료 여부가 상관 없다는 것은 입출력 요청과 같이 느린 작업일 경우 입출력을 기다리지 않고, 자신의 다른 작업을 수행할 수 있기 때문에 전반적인 시스템 성능 향상에 도움을 줄 수 있다.

Blocking / Non-Blocking

동기 비동기와 더불어서 가장 헷갈리는 Block 과 Non-Block이다.

이를 이해하기 위해선 두가지를 우선 알아야 하는데

  • 제어권
    • 제어권은 자신(함수)의 코드를 실행할 권리 같은 것. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.
  • 결과값을 기다린다는 것
    • A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미한다.

블로킹과 논블로킹은 A 함수가 B 함수를 호출했을 때, 제어권을 어떻게 처리하느냐에 따라 달라진다.

Blocking

블로킹은 A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B함수에 넘겨준다.

  1. A 함수가 B함수를 호출하면 B에게 제어권을 넘김
  2. B는 제어권을 넘겨받아 함수를 실행하고, A는 제어권이 없기에 A의 함수는 실행을 멈춤
  3. B함수가 완료되는 순간 제어권을 다시 A에게 건냄. 이후 A가 제어권을 갖고 다시 실행

Non-Blocking

논블로킹은 A함수가 B함수를 호출해도 제어권을 그대로 가진다

A함수가 B함수를 호출하면, B함수는 실행되지만, 제어권을 A가 그대로 갖고 있기에 A는 다시 자기 코드를 실행한다.

Sync, Async, Blocking, Non-Blocking

Sync - Blocking

동기를 블로킹처럼 실행하는 것

함수 A는 함수 B의 결과값이 필요하다(동기). 그렇기에 제어권을 B에게 넘겨준 후, B에게 응답값이 올 때 까지 A의 함수는 실행을 중지한다 (블로킹)

Sync - NonBlocking

동기를 논블로킹으로 실행해보자

A는 B함수의 결과값이 필요하다 (동기). 그러나 논블로킹이기 때문에 제어권은 A에게 그대로 있음. 그럼에도 B의 결과값이 필요하기 때문에 A 함수 실행하는 중간중간 계ㅖㅖ속 B에게 물어본다.

Async - NonBlocking

비동기 논블로킹

A함수가 B함수를 호출하되 제어권을 주지 않는다(논블로킹). 따라서 B 함수를 호출한 이후에도 A함수는 계속해서 실행한다. 대신, 콜백함수를 넘긴다.
이후, B 함수가 실행이 마무리 되면 A에게 받은 콜백함수를 실행한다 (비동기)

Async - Blocking

비동기 블로킹

거의 마주하기 쉽지 않다. 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

profile
형이 먹여살릴게

0개의 댓글