CS/OperatingSystem

Blocking, Non-Blocking and Async

whyWhale 2021. 4. 21.

Blocking I/O Model


  • I/O 작업은 User level(application)에서 직접 수행할 수 없기에, 실제 작업은 Kernel Level(OS)에서 일어나는 과정이다. 따라서 유저 프로세스(application)는 커널(OS)에게 I/O 작업에 대해 요청한다.
  • I/O 작업이 끝나고 데이터를 반환하게 되면 그때가 돼서야 애플리케이션 단의 스레드의 block이 해제된다.
  • 애플리케이션의 관점에서는 아무런 동작은 안하는 것처럼 보인다. 하지만 실제로 I/O 작업을 하느라 Block이 되어 있고 커널에서 작업을 하고 있기 때문에 렉이 걸린 것처럼 보이는 것이다.
  • 이 block되어 기다리는 시간이 이 Blocking I/O 문제이며 개선되어야 할 포인트다.

 

Syncronous, Blocking I/O 비교

  • Syncronous
    • 작업을 요청한 후 해당 작업의 결과물이 나올 때까지 기다린 후 처리하는 것이다.
    • 특정 I/O작업을 하기 위한 준비에 집중하는 것이다.
    • I/O 작업 준비에 대한 이벤트의 발생을 기다렸다가 해당 이벤트가 발생하면 그에 따른 적합한 처리를 한다.
  • Blocking
    • I/O가 끝날때 까지 대기해야 한다.
    • 끝나기 전에는 함수가 반환되지 않기 때문이다.
    • 커널이 작업을 완료하기 전까지 유저 프로세스는 작업을 중단한 채 대기해야 한다.
    • I/O 작업이 CPU 자원을 거의 쓰지 않기 때문에 Blocking 방법은 CPU 자원 낭비가 매우 심하다.
    • 동기화하기 위해 Blocking 하는 것이다.

시스템 반환을 기다리는 동안 대기 큐에 머무는 것이 필수가 아니라면 Syncronous

시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수이면 blocking

※ 공통점 : 시스템의 반환을 기다리는 것. 

 

 

Non-Blocking I/O Model


  • 끝나기 전에는 반환되지 않는 Blocking 방식의 비효율성을 극복하고자 만들어진 것.
  • I/O 작업을 진행하는 동안 유저 프로세스의 작업을 중단시키지 않는다.
  • 유저 프로세스가 I/O를 처리하기 위해 커널에 함수를 호출하면서(System Call) , 커널에서 함수의 진행 상황과 상관없이 바로 결과를 반환한다.
  • 이때 반환되는 결과는 반환하는 순간에 가져올 수 있는 데이터에 해당한다.
  • 처음에는 가져올 수 있는 데이터가 없겠지만 시간이 지나면서 가져올 수 있는 데이터가 생겨난다.
  • 서버는 클라이언트가 요청한 사이즈에 맞는 데이터를 반환하기 위해 데이터를 축적해야 한다.
  • 데이터의 축적이 끝났을 때, 반환되어 클라이언트에 요청한 사이즈의 데이터를 받아올 수 있게 된다.
  • 단점이 있다면, 클라이언트가 따로 반환되는 값이 원하는 사이즈가 되었는지 확인하는 것이다.
  • (polling) 반환되는 데이터가 준비되었는지(원하는 값이 완성 되었는지) 확인하는 과정에서 수많은 클라이언트의 요청이 동시 다발적으로 발생할 경우, CPU에게 적지 않은 부담이 될 수 있는 것이다.

Blocking , Non-Blocking 차이

Bloking

  • 애플리케이션 실행 시 운영체제 대기 큐에 들어가면서 요청에 대한 System call이 완료된 후에 응답을 보낼 경우 

Non-Blocking

  • 애플리케이션 실행 시 운영체제 대기 큐에 들어가지 않고 실행 여부와 관계없이 바로 응답을 보낼 경우.

 

Asynchronous I/O Model


 

event-driven model

  • 이벤트 통지 모델로서 Non-Blocking에서 제기된 문제를 해결하기 위해 고안.
  • Non-Blocking처럼 애플리케이션에서 데이터가 준비되었는지 확인하는(Polling)것이 아니라, Kernel Level에서 데이터가 준비가 되면 콜백 또는 이벤트를 발생시켜 애플리케이션에 알리게 된다.(Notify)
  • User Level에서의 애플리케이션 스레드는 계속해서 데이터가 준비되었는지 확인할 필요 없이 다음 작업을 수행하다가 커널에서 이벤트가 발생하게 되면 그 작업에 해당하는 일을 처리한다.

 

Asynchronous

 

  • 작업을 요청하고 다른 일을 하다가 해당 작업이 완료됨을 통지받고 그에 따른 작업을 처리하는 것.
  • I/O 작업의 Completion을 기다린다.
  • OS 단계의 비동기 API를 통해 이루어지면 I/O 작업이 Completion 되면 그에 적합한 Handler를 이용해 처리한다.

 

Synchronous와 Asynchronous차이

  • Synchronous : System call 완료를 기다린다.
  • Asynchronous : System call을 기다리지 않는다.

 

non-Blocking과 Asynchronous 차이

  • non-Blokcing : System call이 반환될 때 실행된 결과(데이터)와 함께 반환될 경우.
    • 매번 System call retrurn에 데이터가 포함되어 있고 , return 되는 데이터가 요청한 데이터의 사이즈 또는 완성돼있는 데이터가 만들어졌는지 파악하게 된다.
  • Asynchronous : System call이 반환될 때 실행된 결과(데이터)와 함께 반환되지 않는 경우.
    • 다른 일을 하면서 콜백 함수 또는 이벤트 , Signal로 이벤트를 발생시켜 알리는 것.

 

 

※ 그림 설명

 

 

'CS > OperatingSystem' 카테고리의 다른 글

메모리 관리 전략  (0) 2021.04.22
프로세스 동기화  (0) 2021.04.21
스케줄러 알고리즘  (0) 2021.04.19
스케줄러  (0) 2021.04.17
멀티 스레드, 멀티 프로세스  (0) 2021.04.17

댓글