DOKKAEBI HILL

방문을 환영합니다!

CS >

sync/async & blocking/non-blocking 2 [0] 2025-01-20
sync/async & blocking/non-blocking [0] 2025-01-12
CPU Bound - I/O Bound [0] 2025-01-10
동시성과 실행 유닛 [0] 2025-01-02
프로세스 [0] 2025-01-01

sync/async & blocking/non-blocking 2

open_in_new

I/O에 관하여 sync와 blocking 그리고 async와 non-blocking을 혼용해서 사용하는 글들이 많습니다. 

이전에 같은 주제로한 포스팅에서 이를 정리해보았습니다.  ( -> https://dokkaebihill.com/posts/5 )

이후로 그것들의 실제 내부적 동작 방식이 궁금해서 딥 다이브 해보았습니다만, 오히려 다시 혼란스러워졌습니다.


그래서 다시 이를 정리해보려 합니다. 내부 매커니즘을 곁들여서요.


Synchronous & Asynchoronous Communication

Synchronous와 Asynchronous는 I/O나 CS 외 다른 분야에서도 많이 쓰이는 용어입니다.

Synchronous I/O를 이야기 하기 전에 Synchronous Communication에 대해서 이야기해보겠습니다.


실시간성을 전화 통화는 Synchronous Communication의 대표적인 예입니다. 

synchronization
1. the fact of happening at the same time, or the act of making things happen at the same time.
2. the act of making sure that watches or clocks show exactly the same time

A가 B에게 전화를 걸면, A는 B가 받기를 기다리고, B가 수화기를 들면서 둘의 대화는 시작합니다. 

즉, 같은 시간을 공유하며 서로 대화를 하고 있습니다. 


A: 안녕? 

B: 응 안녕

A: 언제 일어났어?

B: 좀 전에

A: 그렇구나, 우리 몇시에 만날까?

B: 점심먹고 만나자!


A가 말이 끝나면 B가 이어 대답을 하고 B의 말이 끝나면 A가 이어서 말을 합니다. 

이런 식으로 서로 A와 B가 문답(?)을 하며 대화가 진행됩니다. 


반면에, 편지는 Asynchronous Communication의 예입니다.

A가 편지를 보낸다고 해서 B는 언제 오는 지 알 수 없습니다. 집배원이 편지를 우편함에 두면 그때서야 B는 A가 편지를 썼다는 걸 알게 됩니다. 

A 역시 편지를 보내자마자 답을 기대하지 않습니다. B의 답장을 기다리겠지만 언제 올 지 알 수 없습니다. 

이처럼 A와 B의 이런 커뮤니케이션은 같은 시간을 공유하지 않습니다. 


Synchronous I/O와 Asynchronous I/O은 I/O에 대한 요청과 응답의 커뮤니케이션 방식의 관점에서 정의한 것입니다.


I/O에 있어서 Sync, Async를 이야기 할 때 blocking과 non-blocking이 함께 등장하는 것은

컴퓨터가 '동시에 여러 작업을 처리하는 머신'이 되면서 CPU를 얼마나 잘 활용하는가가 중요한 이슈가 되었기 때문입니다. 


아래 표에서도 알 수 있듯이 CPU 속도에 비하면 I/O가 엄청난 시간을 소모하는 일입니다. 


작업은 실행 유닛에 의해서 동작하며, 실행 유닛이 I/O 처리동안 waiting 상태로 일을 못하고 있다면

그만큼 실행 유닛 낭비이자 CPU 낭비입니다.

따라서 waiting 상태로 놀리지 않고 계속 running할 수 있도록 하는 blocking, non-blocking I/O 이야기가 같이 나오는 것입니다.

아래 설명을 하겠지만, 저는 I/O에 있어서는 synchronous와 blocking, asynchronous와 non-blocking을 같은 의미로 쓰고 받아들여도

상관없을 것 같다는 결론을 내렸습니다.


I/O



Blocking과 Non-Blocking은 지난 설명에서 달라지는 점은 없습니다. 

I/O를 하는 동안 waiting 상태로 통제권이 없이 있는 것, 그리고 그렇지 않은 것입니다.


Synchronous I/O를 순차적으로 진행되는 방식, 결과를 신경쓴다 라고 설명하는 것은 I/O 처리 방식이

위 전화 예시에서 수화기를 통해서 [문-답]/[문-답]/[문-답]을 주고 받듯이 진행하되기 때문입니다. 

Client와 Server는 소켓을 통해서 문답을 주고 받는 것이죠.

Client가 여러 요청을 하려고 해도 응답을 들어야 다음 요청을 할 수 있기 때문에 순차적일 수 밖에 없는 것이죠.

[ C: 안녕? / S: 응 안녕 ] - [ C: 언제 일어났어? / S: 좀 전에 ] - [  C: 그렇구나, 우리 몇시에 만날까? / S: 점심먹고 만나자! ]


또한, 소켓의 버퍼에 있는 데이터를 읽고 쓸 때는 system call ( read( ), write( ) )을 사용하게 되는데, 

이들은 기본적으로 blocking function이라고 합니다. 응답을 받기 전까지는 계속 버퍼에 데이터가 차거나 비어지기를 기다리게 되며,

thread가 waiting 상태가 되어 해당 시스템 콜 응답을 기다리게 되는 것이죠.


그러면 위의 이미지에서 Synchronous이면서 Non blocking은 뭐야? 라고 하실 수 있습니다.

소켓을 non-blocking 모드로 열게 되면 버퍼가 비어져있거나, 준비가 안되면 EAGAIN, EWOULDBLOCK 같은 응답을 해주게됩니다. 

즉, 시스템 콜에 대한 응답을 받았으나 polling (thread는 busy-waiting 상태)을 하며 응답이 왔는지 계속 체크하며 기다리게됩니다.

그리고 응답을 받고 나서야 다음 요청을 하게 됩니다.

이러나 저러나 Synchronous가 되면 응답을 받기까지 waiting을 하여 다른 일을 못하게 됩니다. 


Asynchronous I/O는 처리의 순서를 보장하지 않습니다. Asynchronous Communication답게 서로 같은 시간을 공유하지 않습니다.

(이해가 잘 안간다면, 시간을 공유한다 = 종이컵 전화기(실 양끝에 종이컵을 달아서 하는 그거)를 둘이 쥐고 한명은 입에 대고, 다른 한명은

귀에 대고 있는 상태를 떠올려 보세요.)

위에서 편지를 예시로 들었지만, 맞은 편 집에서 친구에게 종이 비행기에 메세지를 던져서 보내는 방식으로 대화한다고 해봅시다. 

B는 창문을 열어 놓긴 했습니다. A가 '안녕?', '언제 일어났어?", "그렇구나, 우리 몇시에 만날까?"를 3개의 종이에 각각 적고 비행기를 접어서

B의 창문을 향해 날립니다. 동시에 날릴 수도 있고, 시간 텀을 두고 던질수도 있습니다.

비행기1은 스트레이트로 창문을 통과, 비행기2는 난기류를 만나서 고생하다가 도착, 비행기3은 뭐 어쨋든 도착했습니다.

B가 도착한 순서대로 비행기를 까봤는데 그 순서가 "그렇구나, 우리 몇시에 만날까?", "안녕?", "언제 일어났어?" 일 수 있는 것이죠.

B는 3개에 대해 각각 답장을 써서 A에게 비행기로 날리지만 마찬가지로 그 응답이 순서대로 A에게 닿지 않을 수 있습니다.


Asynchronous I/O는 응답에 구애받지 않기 때문에 병렬적인 요청을 할 수 있고, 또한, 요청 후에 다른 일을 할 수 있습니다.

다른 일을 정상적으로 하려면 Non-Blocking이 어울리겠죠.

Asynchronous 처리를 하려고 하는데 Blocking이 되는 케이스는 결과적으로 Synchronous I/O 방식과 다르지 않을 것입니다.


위의 이미지에서 Asynchronous & Blocking의 예시를 I/O multiplexing으로 둔 것에 대해서 의견이 분분한데, 

I/O multiplexing을 하는 주체 입장에서 여러 소켓에 들어오는 입출력 신호를 Loop을 돌며 계속 기다리는 (blocked) 것을 의미한 것 같습니다.


이 주제에 대해서 다시 한번 정리해보았습니다. 

어떤 포스팅이 더 이해에 도움이 되었나요? 

저는 어릴 때부터 내부적인 동작 원리를 알지 않으면 참 답답해했습니다. CS가 추상화해서 설명하는 것이 많아서 유독 그런 편이죠.

매번 까보는 건 시간적으로 체력적으로 할 수 없어서 받아들이다가도 꼭 이렇게 확인을 해야 갈증이 해소되는 것 같습니다.

이런게 재미있기도 하고요.

이번에 소켓 네트워크 통신에 대해서 많이 접하게 되었습니다. 다음에 더 공부해보고 싶네요!


참고:

https://medium.com/ing-blog/how-does-non-blocking-io-work-under-the-hood-6299d2953c74

https://hello70825.tistory.com/598

https://m.blog.naver.com/se2n/223155627154



게시글을 삭제하시겠습니까?

'delete'를 입력하고 '삭제' 버튼을 눌러주세요.

All rights reserved.

GUEST님 환영합니다! ^_^