동기와 비동기란?? 블로킹, 논블록킹이란??

ran·2023년 9월 2일

CS

목록 보기
1/3

오늘은 막연히 알고 있던 동기와 비동기의 개념에 대해 정리해보고자 한다.
사실 진행중인 프로젝트에서 멀티프로세싱, 멀티스레딩 등에 대한 고려를 하면서 동시에 동기와 비동기 개념에 대해 다시 공부중인데, 헷갈리는 점들이 좀 있어서 명확하게! 정리하려고 한다.


동기, 비동기란?

  • 동기: 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 진행
  • 비동기: 요청한 작업에 대해 완료 여부를 따지지 않고, 다음 작업을 바로 진행

글을 잘 설명하는 그림하나를 보겠다.

위에서 동기는 순차적으로 점원이 주문을 받고, 아래의 비동기는 작업이 동시에 진행되는 것을 확인할 수 있다.

기본적으로 스프링에서는 동기적으로 요청을 처리하고 있다.

비동기의 장점

비동기에 대한 이점을 애기할때 빠지지 않는 것이 I/O 작업이 있다. 이런 I/O 작업으로는 외부 API 호출, 데이터 전송 등이 있는데, 보통의 경우 이러한 작업들은 느린작업들이 많다.
따라서 해당 작업이 끝나는 것을 기다리지 않고, 다른 작업을 할 수 있도록 동시에 처리하여 멀티로 작업을 진행할 수 있게 해주는 것이다.
따라서 보통 시스템 성능을 향상시키는데에 있어서 비동기를 빼놓지 않는 이유이다.

이것도 예를 들어 설명하겠다.
요즘 유행하는 스노우 ai프로필의 경우 사용자로 부터 이미지를 받고, 그걸 바탕으로 생성 AI모델을 통해 ai프로필을 생성해준다. 만약 해당 작업이 동기 작업일 경우 사용자는 스노우앱에서 ai프로필 생성화면에서 나가거나 다른 작업을 하지 못하게 될 것이다.
그러나 해당 작업이 비동기적으로 동작한다면, 사용자는 프로필 생성 요청만 보내고, 다른 일을 하면 될 것이다.

작업 순서 처리 차이

  • 동기: 요청한 작업의 순서가 지켜진다.
  • 비동기: 요청한 작업의 순서가 지켜지지 않고, 따라서 나중에 요청한 작업이 먼저 끝날 수도 있다. 그렇기 때문에 보통 작업이 끝나면 알림을 보내거나 한다.

정리

  • 동기
    • 요청한 순서에 따라 작업이 완료
    • 요청이 마무리 되기 전까지 사용자가 기다려야함.
  • 비동기
    • 요청한 순서에 따라 작업이 완료되지 않고, 무작위
    • 요청 후 다른 작업을 할 수도 있음.
    • 작업이 동시에 진행될 수 있음.
    • 응답값이 없음.

블로킹/논블로킹(Blocking/Non-Blocking)

블로킹과 논블로킹 개념이 처음 접하면 이해가 잘 안된다..(저는 두번 봐야 이해가 됐어요)
쉽게 자세히 파헤쳐보자.

  • block: 막다
  • non-block: 안막다

단어를 생각해보면 위와 같을 것이다.
이처럼 작업에 대해 막느냐, 안막느냐로 생각을 하면 된다.

이렇게 말하면 이해가 안되니 위의 사진을 보고 말하겠다. 위에서 든 스노우 예시를 여기서도 들어보겠다.

이미지를 보내는 API를 호출했다고 치면, Blocking의 경우 해당 API로 이미지를 전달하는 시작점부터 이미지 응답이 오는 시점까지 사용자가 아무 행동도 못하게 되는 것이다.
이를 좀 고급지게 말하면 제어권을 뺏긴다고 말할 수 있다.
위에서 말한 동기와 유사한것 처럼 보인다.

그럼 반대로 Non-Blocking은 이미지 전달 API가 시작될때, 바로 제어권을 다시 호출한 놈한테 주는것이다. 그렇기 때문에 바로 이어서 이미지를 보내는 API의 나머지 서비스 로직 코드를 실행할 수 있는 것이다.
이는 비동기와 유사한것 처럼 보인다.

그렇다!! 사실 동기, 비동기/ Blocking, Non-blocking은 뭔가 이론적으로 이렇다 하면서 딱 경계를 나누기 어렵다. 그말인 즉슨, 두가지에 대해 바라보는 관점이 다르다고 생각한다.
동기, 비동기는 작업의 순서의 관점에서 본다면, Blocking, Non-blocking 작업의 제어의 관점에서 보면 된다.!

대게 동기+Blocking/ 비동기+Non-Blocking 의 조합으로 많이들 사용하는게 일반적인데,
각각의 경우를 조합해서 사용할 수도 있다.

profile
Backend Developer

0개의 댓글