본문 바로가기
운영체제(OS)

[OS] Blocking / Non-Blocking, Sync / Async

by 도전하는 린치핀 2024. 6. 17.

1. Blocking / Non-Blocking

Blocking와 Non-Blocking는 제어권의 위치(작업을 진행할 수 있는지 or 기다려야 하는지)로 구분 할 수 있다.

1-1. Blocking

  • Blocking 은 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것이다.
  • 즉, 호출된 함수가 자신의 로직을 모두 끝낼 때까지 제어권을 계속 가지고서 호출한 함수에게 바로 돌려주지 않는 상황을 의미한다.
예시
A :  B님 xxx 작업을 처리해줘요
B : ㅇㅋ 금방 끝나는 일이니깐 어디가지 말고 옆에서 기다리고 있어욤
A : 넵(B가 작업을 완료할때 까지 기다려야 한다.)

1-2. Non-Blocking

  • Non-Blocking은 다른 주체의 작업에 관련 없이 자신의 작업을 계속 진행하는 것을 의미한다.
  • 즉, 호출된 함수가 자신의 할일을 마치지 않더라도 바로 제어권을 건네주어 호출한 함수가 다른 일을 진행할 수 있도록 해주는 상황을 말한다.
  • 이때 제어권을 넘길 때, 실제 반환값을 통해 제어권을 넘기는 것이 아닌 아직 진행중이라는 상태를 넘길 수 있다.
예시
A : B님 xxx 작업 해주세요
B : 알아서 할게요 너 할일 하고 있어요
A : 넵(B가 작업을 모두 끝내지 않아도 자신의 할 일을 계속 진행할 수 있다.)

 

2. Sync / Async

이해가 가장 어려웠던 부분인 Sync 와 Async는 다양하게 해석할 수 있다.

  • 결과가 반환되었을 때 순서와 결과에 관심이 있는지
  • 요청한 작업에 대해 완료 여부를 따지는지
  • 즉, 앞선 작업이 완료되어야 다음 작업이 순차적으로 진행된다는 점에서 Sync와 Async를 나눌 수 있다.

2-1. Sync

  • Sync는 동기라는 뜻으로 작업을 동시에 수행되거나, 동시에 끝나는 것을 의미한다.
  • 호출된 함수의 수행 결과 및 종료를 호출한 함수와 함께 신경쓰는 경우를 의미한다.
  • 즉, 하나의 작업이 순차적으로 이루어지고 앞 순서의 작업이 완료되어야 다음 작업이 진행될 수 있는 상태이다.
예시
A : B님 xxx 작업 완료해주셔야 내가 xxx' 작업 할 수 있는데 xxx 작업 해주실 수 있나요?
B : 네 해줄게요. 신경 끄고 있으면 xxx 작업 완료하고 알려줄게요~
 ( B가 xxx 작업을 진행중... 이때 A는 xxx' 작업을 진행할 수 없지만 y, z 작업을 진행할 수 있다. )
B : A 님 xxx 작업 완료 했습니다. xxx'작업 시작하세요~
A : 넵(xxx' 작업을 시작한다.)

2-2. Async

  • Async는 비동기라는 뜻으로, 시작과 종료가 일치하지 않고 끝나는 동시에 시작을 하지 않는다는 의미한다.
  • 호출된 함수의 수행 결과 및 종료를 호출된 함수 혼자 직접 처리하는 경우를 의미한다.
  • 즉, 여러 개의 작업이 순차적으로 이루어지지 않고 앞 순서의 작업 완료 상태와 관계 없이 작업을 바로 시작할 수 있는 상태를 의미한다.
예시
A : B님 xxx 작업 진행해주세요.
B : 네 진행할게요. 신경 끄고 있으면 xxx 작업 완료하고 알려줄게요~
 ( B가 xxx 작업을 진행중... 이때, A는 xxx', y, z 작업을 시작할수도 기다릴수도 있다.)
B : A님 xxx 작업 완료해서 메일 보냈으니 확인해주세요.
A : 넵 나중에 필요하면 확인해서 추가적인 작업 진행할게요

3. Blocking - Non-Blocking / Sync - Async  섞어 각 상태 확인하기

이러한 동기/비동기와 블로킹/논블로킹의 조합은 프로그램이 작동하는 방식에 영향을 미치는 중요한 요소다. 어떠한 요소를 조합하여 사용하느냐에 따라 프로그램의 성능과 효율성을 높일 수 있기 때문이다.

 

  • Blocking / Non-Blocking : 제어권의 위치 (작업을 시작했을 때 다른 작업을 할 수 있는지 or 기다려야 하는지)
  • Sync / Async : 요청한 작업에 대해 완료 여부가 중요한가(결과가 주어졌을 때 순차적인 작업을 진행해야 하는가)

총 4가지 경우를 섞어서 상태를 확인한 그림은 아래와 같다.

 

3-1. Sync + Blocking 

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

 

  • Sync + Blocking은 코드가 순차적으로 실행되는 특성을 가지고 있다.
  • 일반적으로 작업이 간단하거나 작업량이 적은 경우 더 직관적으로 코드를 파악할 수 있기 때문에 사용된다.
  • 보통 C나 Java에서 커맨드에서 입출력을 받을 때, 사용자가 값을 입력하기 전까지 계속 프로그램이 대기하고 있는 것과 비슷하다.

3-2. Async + Non-Blocking

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

 

 

  • Async Non Blocking 조합은 작업량이 많거나 시간이 오래 걸리는 작업을 처리해야 하는 경우에 적합하다. 
  • 예를 들어, 대용량 데이터를 처리하거나 많은 요청을 처리하는 서비스에서 한 작업이 처리되는 동안 다른 작업을 처리할 수 있으므로 전체 처리 시간을 줄일 수 있어 어플리케이션 처리 성능을 향상시킬 수 있게 된다.
  • 웹 브라우저는 웹 사이트에서 파일을 다운로드할 때, 파일의 전송이 완료될 때까지 다른 작업을 하지 않고 기다리는 것이 아니라, 다른 탭이나 창을 열거나 웹 서핑을 할 수 있다.
  • 이는 웹 브라우저가 파일 다운로드를 비동기적으로 처리하고, 콜백 함수를 통해 다운로드가 완료되면 알려주는 방식으로 구현되어 있기 때문이다.
  • 보통 나 뿐 아니라, 대부분의 주니어 개발자들이 생각하는 비동기 방식이 이곳에 속한다.

3-3. Sync + Non-Blocking

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

 

 

  • 스레드(Thread) 객체를 만들어 요청 작업을 백그라운드에 돌게 하고 메인 메서드에서 while문을 통해 스레드가 모두 처리되었는지 끊임없이 확인하고, 처리가 완료되면 다음 메인 작업을 수행한다.
  • 스레드를 이용하여 작업을 병렬적으로 처리하도록 지시했지만, 메인 코드의 while문을 수행함으로서 요청한 작업의 완료 여부를 계속 확인하고 결과적으로 결국 동기적으로 작업을 순서대로 수행됨을 볼 수 있다. 
  • 보통 사용되는 경우는 게임에서 로딩창이 뜰 때를 확인할 수 있다.
  • 로딩을 진행할 때, 맵이 계속해서 채워지고 있을 것이다. 하지만 제어권은 화면에 나타나는 씬에서 맵 로드율을 보여준다.

3-4. Async + Blocking

Async + Blocking 조합은 다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리는 (Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 (Async) 방식이다. 

Async + Blocking 조합의 경우 위의 3-2(Async + Non-Blocking)을 하려다가 실수때문에 발생하는 경우가 가장 많다고 한다.

즉, 실제로 필요에 의해서는 거의 사용되지 않고 실수에 의해서 발생한다는 것이다.

  • 생각해본 경우에 대해서는, Spring과 MySQL(DB)을 사용했을 때를 예로 들 수 있다.
  • Spring에서는 여러개의 쓰레드를 활용해서 Async로 진행되지만 결국 MySQL(DB)에서는 여러 개의 작업이 Blocking으로 진행되는 것이다.
  • 그렇다면 아무리 여러 개의 작업을 병렬적으로 처리하려고 해도 계속해서 직렬적인 방식으로 작업을 처리하게 되는 것이다.

4. 결론

  • 사실 Blocking / Non-Blocking 과 Sync / Async의 개념은 완전히 분리되어 설명하기에는 조금 어려운 개념인 것 같다.
  • 그래도 각각의 상태와 차이에 대해서 정확하게 학습하고 프로젝트를 진행할 때 어떤 방식이 가장 효율적인지 선택할 수 있어야 한다.
  • 너무 어렵다,, 
더보기

Ref.

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

https://www.youtube.com/watch?v=IdpkfygWIMk

https://www.youtube.com/watch?v=ohz7uHnza6A

https://velog.io/@maketheworldwise/SyncAsync-BlockingNon-Blocking-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EC%9D%BC%EA%B9%8C

 

Sync/Async, Blocking/Non-Blocking 무슨 차이일까?

*SYNC AND *BLOCKING

velog.io

https://haneepark.github.io/2021/07/18/blocking-nonblocking-sync-async/

 

이제 그만 헷갈렸으면 좋겠다. Blocking과 Non-Blocking, Sync와 Async

Blocking과 Non-Blocking, Sync와 Async 개념은 뭐랄까.. 이해한 것 같다가도 오랜만에 보면 헷갈리고, 알 것 같다가도 섞어서 보면 또 모르겠더군요🤔 한 번 확실히 짚고 넘어가면 좋겠더라고요. 마침 적

haneepark.github.io

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

 

👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

동기/비동기 & 블로킹/논블록킹 프로그래밍에서 웹 서버 혹은 입출력(I/O)을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이러한 용어들을 접해본 경험이 한번 쯤은 있을 것이다. 대부분 사람들은

inpa.tistory.com

https://studyandwrite.tistory.com/486

 

[운영체제/OS] Blocking / NonBlocking, Sync / Async

0. 들어가면서 이번 포스팅에서는 Blocking/Non-Blocking(블록킹, 논블록킹)과 Sync/Async(동기, 비동기) 개념에 대해 정리해보고, 각각의 개념이 어떻게 쓰이는지를 정리해보려고 합니다. 아래 두 영상에

studyandwrite.tistory.com

https://jh-7.tistory.com/25

 

Blocking, Non-blocking, Sync, Async 의 차이

들어가며 전 회사에서 한 선배님이 질문을 했다. Blocking 과 Non-blocking, Sync 와 Async 의 차이를 설명할 수 있냐고. 어 음... 하는 사이 선배님이 다시 말을 했다. 그 둘을 설마 같은거라고 이해하고 계

jh-7.tistory.com