[CS - 네트워크] Blocking & Non-Blocking, Synchronous & Asynchronous

Jo HangJoon·2022년 10월 13일
0

CS 공부

목록 보기
12/17

질문의 핵심

  • 동기와 비동기의 차이?
  • Blocking과 Non-blocking의 차이?
  • JavaScript의 비동기적 특성?

I/O 작업

I/O 작업은 커널레벨에서 수행되기 때문에 유저 프로세스(혹은 쓰레드)는 커널에게 I/O를 요청한다. 즉, 시스템 콜이 발생된다. 이때 문맥 교환이 일어난다.

1. Blocking & Non-Blocking

Blocking

작업이 진행되는 동안 유저 프로세스가 작업을 중단한 채 대기하는 방식.

  • I/O 작업이 끝나고 결과를 반환하면 중단(Block)되었던 스레드가 다시 동작한다.
  • 기다리는 동안 다른 작업을 수행하지 못하므로 자원이 낭비된다.

동작 과정

  1. 유저 프로세스가 커널에 작업 요청.
  2. 데이터가 입력될 때까지 대기.
  3. 데이터가 입력되면 유저 프로세스로 결과 전달, 유저 프로세스는 작업 복귀.

Non-Blocking

작업이 진행되는 동안 유저 프로세스의 작업을 중단시키지 않는 방식.

  • 유저 프로세스가 시스템 콜을 호출하면 커널에서 함수의 진행 상황과 상관없이 바로 결과를 반환한다. 이때 반환된 결과는 그 순간에 가져올 수 있는 데이터이다.
  • 서버는 클라이언트에서 요청한 데이터의 사이즈가 될 때까지 데이터를 축적한다. 이때까지 데이터가 전부 도착했는지 계속 확인해야되므로 부담이 된다.
  • 반복적으로 시스템 콜이 발생하므로 자원이 낭비된다.

동작 과정

  1. 유저 프로세스가 커널에 작업 요청.
  2. 작업이 요청된 순간 바로 결과 반환.
  3. 입력 데이터가 있을 때까지 1~2번 과정 반복. 유저 프로세스는 다른 작업 진행 가능.
  4. 입력 데이터가 있으면 유저 프로세스에게 결과 전달.

2. Synchronous & Asynchronous

Synchronous(동기식)

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

Blocking 방식은 그냥 기다리지만, Synchronous 방식은 결과를 계속해서 확인한다. 즉, 요청을 보내면 응답을 받을 때까지 다른 작업을 하지 않는다.

  • 요청과 응답의 순서를 보장받으므로 요청 값에 대한 응답이 변경되는 사항에서 중요한 부분이다.

Asynchronous(비동기식)

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

Synchronous 방식과는 다르게 응답을 언제 받아도 상관하지 않는다. 즉, 요청을 보낸 쓰레드는 다른 작업을 할 수 있다.

  • 응답이 늦어지면, 다음 요청의 응답이 먼저 올 수 있다. 즉, 요청과 응답의 순서를 보장하지 않는다.
  • 자원이 낭비되지 않고 성능이 향상되지만 결과를 보장하지 않는다.

3. Blocking/Non-Blocking & Sync/Async의 조합

  • Java는 Blocking + Sync
  • JavaScript는 Non-Blocking + Asynchronous

Blocking + Sync

작업의 흐름이 순차적으로 진행되는 것을 보장받음, 어떠한 작업이 진행 중일 때는 다른 작업을 동시에 진행할 수 없음.

Non-Blocking + Async

작업의 흐름이 순차적으로 진행되는 것을 보장받음, 작업이 진행 중일 때 다른 작업을 진행할 수 있음.

Blocking + Async

요청을 여러 개 받아놓지만, 작업이 완료되기 전에 다른 작업을 수행할 수는 없음.

Non-Blocking + Async

요청에 따른 응답의 순서를 보장하지 않음, 작업의 완료 여부를 신경 쓰지 않음.

  • 여러 작업을 동시에 처리할 수 있어 효율적일 수 있음.

참조

0개의 댓글