블로킹 vs 논블로킹,동기(sync) vs 비동기(async)

이승주·2024년 7월 24일
3

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

Blocking: 자신의 작업을 진행하다가 다른 주체에 어떠한 요청을 했을 때 다른 주체에 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것

Non-Blocking: 다른 주체의 작업 완료와 관련없이 자신의 작업을 하는 것

위 둘의 가장 큰 차이점은 다른 주체가 작업을 할 때 자신의 제어권 유무임

  • Blocking은 제어권이 없음
  • Non-Blocking은 제어권 있음

동기(Sync)와 비동기(Async)

동기(Sync): 요청한 작업이 끝나는 동시에 해당 작업의 결과 값을 바로 처리함

비동기(Async):요청한 작업이 끝나도 해당 작업의 결과를 처리할 수도 안 할 수도있음

위 둘의 가장 큰 차이점은 요청 결과를 돌려 받았을 때 결과 완료 여부에 대한 관심도

  • 동기는 요청 작업 완료 결과에 관심이 많아 결과를 받고 바로 처리함
  • 비동기는 요청 작업 완료 결과 값에 관심이 적어 결과를 받고 처리할 수 도 있고 안 할 수도 있음

비동기의 성능 이점

보통 비동기 특징을 이용하여 성능과 연관지어 말한다. 왜냐하면 요청한 작업에 대하여 완료 여부를 신경쓰지 않고 자신의 그다음 작업을 수행한다는 것은, I/O 작업과 같은 느린 작업이 발생할 때, 기다리지 않고 다른 작업을 처리하면서 동시에 처리하여 멀티 작업을 진행할수 있기 때문이다. 이는 전반적인 시스템 성능 향상에 도움을 줄 수 있다.


4가지 조합

1. Sync Blocking (동기 + 블로킹)
2. Async Blocking (비동기 + 블로킹)
3. Sync Non-Blocking (동기 + 논블로킹)
4. Async Non-Blocking (비동기 + 논블로킹)


Sync Blocking 조합

Sync Blocking 조합은 다른 작업이 진행되는 동안 자신의 작업을 처리하지 않고 (Blocking), 다른 작업의 완료 여부를 바로 받아 순차적으로 처리하는 (Sync) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주는 경우에 활용할 수 있다.

적용 프로그램 예시

대표적으로 C나 JAVA의 코드 실행 후 커맨드에서 입력을 받는 경우가 이에 해당된다. 사용자로부터 입력을 받아야 그 입력값을 가지고 내부 처리를 하여 결과값을 콘솔에 출력해주기 때문에 순차적인 작업이 요구된다. 내부적으로 본다면 실행 코드가 콘솔창을 띄우고 Please enter your name 텍스트를 치고 난 다음 사용자의 리턴값이 필요하기 때문에 제어권을 시스템에서 사용자로 넘겨 사용자가 값을 입력할때까지 기다리는 것이다.


Async Non-Blocking 조합

Async Non Blocking 조합은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non Blocking), 다른 작업의 결과를 바로 처리하지 않아 작업 순서가 지켜지지 않는 (Async) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주지 않은 경우에 활용할 수 있다.

적용 프로그램 예시

웹 브라우저의 파일 다운로드가 비동기 논블로킹을 활용하는 예시 라고 할 수 있다. 웹 브라우저는 웹 사이트에서 파일을 다운로드할 때, 파일의 전송이 완료될 때까지 다른 작업을 하지 않고 기다리는 것이 아니라, 다른 탭이나 창을 열거나 웹 서핑을 할 수 있다. 이는 웹 브라우저가 파일 다운로드를 비동기적으로 처리하고, 콜백 함수를 통해 다운로드가 완료되면 알려주는 방식으로 구현되어 있기 때문이다.


Sync Non-Blocking 조합

Sync Non-Blocking 조합은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non Blocking), 다른 작업의 결과를 바로 처리하여 작업을 순차대로 수행 하는 (Sync) 방식이다.

해당 케이스는 흔히 사용되지 않는다.


Async Blocking 조합

Async Blocking 조합은 다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리는 (Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 (Async) 방식이다. Async-blocking 의 경우는 실무에서 잘 마주하기 쉽지 않아 다룰일이 거의 없다. 그래서 그냥 넘어가도 크게 문제는 없다.

안티 패턴인 Async Blocking

Sync-blocking 수행과 큰 차이가 없다.
보통 Async-blocking은 개발자가 비동기 논블록킹으로 처리 하려다가 실수하는 경우에 발생하거나, 자기도 모르게 블로킹 작업을 실행하는 의도치 않은 경우에 사용된다. 그래서 이 방식을 안티 패턴(anti-pattern)이라고 치부하기도 한다.


자료 출처

https://www.youtube.com/watch?v=oEIoqGd-Sns&t=516s

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

https://sujinhope.github.io/2021/06/13/Network-%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0,-%EB%B8%94%EB%A1%9C%ED%82%B9vs%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9%EC%9D%98-%EC%B0%A8%EC%9D%B4.html

profile
반복되는 실수를 기록을 통해 줄여가보자!

0개의 댓글

관련 채용 정보