Page tree
Skip to end of metadata
Go to start of metadata

Introduction

이 글은 평소 많이 들어보았지만 혼동할 수 있는 Blocking, Non-Blocking / Synchronous, Asynchronous 에 대해서 설명하는 글 입니다.

Asynchronous는 비동기 웹 어플리케이션을 제작할 때 Ajax(Asynchronous Javascript and XML) 사용하면서 들어보셨을 것입니다.

단어 자체로 보면 Asynchronous와 non-blocking이 비슷해 보일 수 있지만 약간 다른 개념입니다.

각각이 어떤 것인지에 대해서부터 알아보겠습니다.

 


 

1. Blocking, Non-blocking / Synchronous, Asynchronous 란 ? 

Blocking : 프로세스가 시스템을 호출 하고나서 결과가 반환되기까지 다음 처리로 넘어가지 않음

Non-blocking : 시스템을 호출한 직후에 프로그램으로 제어가 다시 돌아와서 시스템 호출의 종료를 기다리지 않고 다음 처리로 넘어갈 수 있음

Synchronous : 작업을 요청한 후 작업의 결과가 나올 때까지 기다린 후 처리

Asynchronous : 직전 시스템 호출의 종료가 발생하면 그에 따른 처리를 진행

 


 

2. Synchronous blocking I/O

 

가장 기본적인 I/O 모델로 파일을 읽고 쓰는 일반적인 read,write 와 같은 I/O 시스템 호출을 의미한다. 

어플리케이션에서 Data Call 을 호출 한 후 시스템에서는 데이터가 어플리케이션 버퍼에 복사되기 전까지 리턴하지 않으며, 어플리케이션 프로세스는 자신의 작업을 중단한 채 대기한다. (CPU 등의 자원 낭비)

따라서, 여러 클라이언트가 접속하는 서버를 Blocking 방식으로 구현할 경우 하나의 클라이언트가 I/O 작업을 진행하면 해당 프로세스(Thread)가 진행하는 작업을 중단하게 되므로, 클라이언트별로 프로세스를 만들어 연결시켜야한다. 

하지만 접속자 수가 증가하면 Thread가 증가한다.


 

3. Synchronous Non-blocking I/O

어플리케이션에서 최초 데이터 요청 후 시스템에서 작업은 이어지고 시스템에서 Output이 준비되지 않은 상태를 어플리케이션에 즉시 반환하며 blocking 이 발생하지 않는다.

하지만 해당작업 이후 어플리케이션에서는 시스템으로 지속적인 데이터 상태 체크를 하게된다. 시스템 버퍼에 데이터가 저장될때까지 해당 작업을 지속한 후 시스템에서 데이터가 적재되면 그때 어플리케이션 버퍼에 저장된 후 종료된다.

이렇게 지속적으로 상태를 체크하여 데이터를 받는 방식을 Polling 이라 한다. Blocking에 대한 낭비는 없지만 반복적인 시스템 호출이 일어나게되므로 CPU 자원이 낭비된다.


 

4. Asynchronous blocking I/O

어플리케이션에서 최초 데이터 요청 후 시스템에서 작업은 이어지고 시스템에서 Output이 준비되지 않은 상태를 어플리케이션에 즉시 반환하며 어플리케이션은 blocking 상태로 대기한다.

대기 상태에서 시스템에서 Output이 준비되었다는 신호를 주게되고 어플리케이션에서 데이터 상태 체크 후 Output을 받아오게된다.

 


 

5. Asynchronous Non-blocking I/O

AIO (Asynchoronous I/O) 시스템 호출을 하면 버퍼의 포인터, 크기 및 완료시 통지 방법 등을 시스템에 전달하고 즉시 리턴한다. 이 후 데이터가 버퍼에 복사되어 준비가 완료되면 어플리케이션으로 신호를 발생하여 알려준다.

입력과 출력 사이의 Blocking이나 상태 체크가 없기 때문에 그 사이에 다른 프로세스를 진행할 수 있는 장점이 있다.


 

Conclusions

대부분 오해할 수 있는 내용으로 Blocking = Synchronous, Non-blocking = Asynchronous 로 오해할 수 있습니다. 

하지만 4개는 각각 다른 개념이며 서로 조합하여 새로운 개념으로 표현됩니다.

Asynchonous Blocking I/O 의 대표적인 예로  Ajax 가 있으며, 가장 효율적이라고 할 수 있는 Asynchronous Non-blocking I/O는 Web Socket이 있습니다.


 

References

 

Related Information

 

There is no content with the specified labels

  • No labels