Computer Science/Operating System

[OS] Blocking/Non-blocking & Synchronous/Asynchronous

dbssk 2023. 7. 16. 21:02

Blocking/Non-blocking

블럭/논블럭은 호출된 함수가 호출한 함수에게 제어권을 건네주는 유무의 차이이다.

Blocking

A 함수가 B 함수를 호출할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것

 

예를 들어, 파일에서 데이터를 읽는 작업이 'Blocking'으로 수행되면, 해당 작업이 완료되어 데이터가 준비될 때까지 프로그램의 실행이 잠시 중지된다. 이는 프로그램이 데이터를 사용할 수 있을 때까지 아무런 작업도 수행하지 못하게 되어, 자원을 비효율적으로 사용할 수 있다는 단점이 있다.

Non-blocking

A 함수가 B 함수를 호출 할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것

 

즉, 특정 작업의 완료를 기다리지 않고 바로 다음 작업으로 넘어갈 수 있도록 하여 프로그램이 다른 작업을 계속 수행할 수 있게 해주므로, 자원을 보다 효율적으로 사용할 수 있다.

 

Synchronous/Asynchronous

동기/비동기는 일을 수행 중인 동시성이 중요하다.

Synchronous (동기)

요청이 들어온 순서대로 하나씩 처리하는 것

 

예를 들어, 함수 A가 함수 B를 호출 했을 때, B의 작업이 완전히 끝날 때까지 A는 대기 상태에 머무른다. 즉, 함수 B의 실행 상태를 A가 계속 체크한다.

Asynchronous (비동기)

하나의 요청이 끝나기 전에 다른 요청을 동시에 처리할 수 있는 것

 

예를 들어, 함수 A가 함수 B를 호출 했을 때, B의 작업이 끝나기를 기다리지 않고 바로 A의 다음 작업을 수행한다. 즉, 함수 B의 수행 상태를 A가 신경쓰지 않는다. (Callback)

Callback
어떤 이벤트가 발생하거나 특정 작업이 완료되었을 때 시스템에 의해 자동으로 호출되는 함수를 말한다.
비동기 작업을 수행할 때, 작업의 완료나 이벤트 발생을 알리기 위해 콜백 함수를 사용한다.

 

동기/비동기 & 블로킹/넌블로킹

Sync-Blocking

= Read/Write

  • 유저모드에 있던 어플리케이션이 블록을 일으키는 시스템콜 호출
  • 해당 프로세스는 정지하고 커널의 응답을 기다린다.
  • 응답이 돌아오면 블록이 풀린다.

Sync-NonBlocking

= Read/Write(O_nonblock)

  • Sync-Blocking에 비해 더 잦은 시스템콜로 인해 컨텍스트 스위칭이 잦고 비효율적이다.
  • I/O을 즉시 완료하지만 I/O가 완료될 때까지 어플리케이션(유저모드)는 계속 시스템콜을 통해 완료됐는지 확인하고 완료된 경우에 결과를 반환한다. 만약 완료가 안된 경우에는 에러코드를 반환한다.
  • 단점 : 매우 비효율적이고 I/O 지연(latency)이 발생한다.

Async-Blocking

= I/O multiplexing

  • I/O는 넌블로킹으로 알림을 블로킹으로 하는 방식
  • 일반적으로 어플리케이션 레이어에서 사용하지 않고 Linux 와 Unix의 I/O 다중화(multiplexing)에서 사용

Async-NonBlocking

= AIO(Async I/O), python, js에서 비동기 사용

  • 리눅스에서 AIO로 구현이 됐지만 아직 완전히 구현이 되지 않아 커널에서는 사용하지 않고 유저모드에서만 사용
  • python과 js의 promise나 async/await 에서 주로 사용