0. 이론

Blocking & Non-blocking I/O + Synchronous&Asynchronous I/O 차이점

Beginner:) 2023. 1. 10.
320x100

유튜브 널널한 개발자 TV를 보다가 어떠한 댓글에 Non-blocking과 Asynchronous가 다르다는 댓글에 구글링을 좀 했다.

 

Blocking&Synchronous와 Non-blocking / Asynchonous의 차이점을 크게 보면 이해가 빠른데 자세히 보니 헷갈리더라.

 

두리뭉실하게 같다고 보는 블로그가 있고 개념이 비슷한데 엄연히 다르다는 블로그도 있고 비동기와 논블록만 다르다는 글도 있고... 일단 내가 맞다고 생각하는 것들로 써본다...

 

편의상 I/O는 생략한다.


Blocking & Synchronous

공통점은 request 후 대기한다는 것

차이점은 제어권이 누구에게 있느냐.

Blocking은 request를 하게 되면(예를 들면 File I/O) Kernel에 요청을 하고 제어권을 넘겨주기 때문에 응답에 대해 대기상태가 된다.(제어권을 Kernel에 넘긴다) 또는 scanf 같은 함수를 쓰면 사용자로부터 입력을 대기한다. 즉, 그동안 다른 프로그램을 진행할 수 없다.

Kernel이라고 유창하게 말했지만 단순히 C언어의 main문에서 함수 A라는 것을 호출했을 때 제어권은 main -> A함수로 제어권을 넘겨주게 되는데, main은 A를 호출한 명령어 밑으로 진행하지 않는다. main이 A함수에 제어권을 넘겨주었고 A함수가 처리를 끝나고 return을 하는 순간 main문에 제어권을 돌려받게 되는 것이 Blocking이다.

 

Synchronous는 주체가 나 자신이다. 함수 A를 호출하고 그 안에서 함수 B를 호출했을 때 함수 B가 끝날 때까지 함수 A는 프로그램이 진행되지 않는다. 이때 요청한 함수가 끝났는지 대기하면서 계속 확인한다. 

 

 

Non-blocking & Asynchronous 

공통점은 request 후 Kenel에게 맡기고 다음 프로그램을 진행한다.

차이점으로 Non-blocking은 요청을 받은 함수가 제어권을 바로 돌려주기 때문에 다음 명령어를 진행할 수 있고 처리가 완료되지 않으면 에러를 회신한다. 즉 main문에서 함수 A를 호출하였고 A함수는 제어권을 넘겨받지만 곧바로 제어권을 main에게 돌려받고 main은 A함수를 호출한 이후 함수(또는 명령어) B, C를 차례대로 호출하게 된다. 그렇다면 A의 결과값은 언제회신하느냐? 언제인지 모르니까 A에게 계속 결과값을 물어보고 A는 결과값이 없으면 Error를 반환한다. 그렇게 main은 계속 A에게 결과값을 수차례 물어보고, A는 결과값이 없다는 Error를 반환하면서, main은 다음 명령어를 계속 실행한다. 결과값을 구하게되면 그때야 결과값을 반환한다. 즉 결과값을 반환받을 때까지 계속 물어보면서 Context Switch가 일어난다.

차이점은 Asynchronous는 처리가 완료될 때까지 백그라운드에서 대기하다 종료한 타이밍을 회신한다. 대표적인 예로callback함수이며 계속 물어보는 것이 아니고 호출당한 함수가 끝나는 순간 callback함수를 실행하는 것이다.

 

 

동기 vs 비동기

동기는 전송이 빠르나 비용이 크고, 비동기는 전송이 느리나 비용이 작다.

개발자의 관점으로 비동기가 좋아보이지만 꼭 그렇진 않다.

비동기의 응답이 언제오냐에 따라 결과도 달라지기 때문에 결과를 예측하기 힘들다.

예를 들어 나의 컴퓨터에서는 CPU처리량이 좋아서 Callback이 빨라 어느 정도 결과치를 예상하는데, 다른 컴퓨터에서는 CPU가 느려서 결과가 늦게 나온다던지... 여기서는 되는데 저기선 안 되는 그런 상황이 있다고 한다.

게임에서 동시 접속자가 적고 많고, 임베디드에서 CPU가 좋고 나쁘고에 따라 예상 결과치가 다르다는 점?

 

여러 글을 보고 느낀점

보면서 알듯 모를듯하게 더헷갈린다.

그러나 Blocking&Non-Blocking은 제어권을 중심으로 보고, Synchronous&Asynchronous는 시간을 중심으로 본다는 것이 대부분의 블로거&유튜브들이 하는 말이다. 우아한Tech에서는 추상적인 개념이라고 하는데 Blocking과 Synchronous는 대기한다는 점이 같고, Non-Blocking과 Asynchronous는 대기하지 않고 다음 명령어를 수행한다는 점에서 추상적인 개념으로는 같다고 말하지만 엄연히 다른 동작인데.... 뭐 추상적으로는 같다고 해도 틀린말은 아닌 것 같다.

 


이게 맞나...? 이론은 헷갈려

+) 우아한 Texh에서 발표하시는 분의 머리스타일이 나와 같다.

참고

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

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#thankYou

https://grip.news/archives/1304

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

https://learn.microsoft.com/ko-kr/windows/win32/fileio/synchronous-and-asynchronous-i-o

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

반응형

'0. 이론' 카테고리의 다른 글

DNS란?(DNS 구성)  (0) 2024.01.27
Throttle vs Debounce  (0) 2023.01.28
TCP 송/수신 원리  (0) 2023.01.08
모드버스란? (+ 프레임 구성, 예제, 샘플)  (0) 2022.07.14
풀업&풀다운 (Pull-up&Pull-down)이란?  (0) 2022.04.26

댓글