본문 바로가기
기초 CS 정리

Blocking/Non-Blocking 과 Synchronous/Asynchronous

by 쿠리의일상 2023. 2. 11.

Blocking/Non-Blocking

호출된 함수가 호출한 함수에게 제어권을 건네주는 유무의 차이

  • 함수 A, B가 있고 A 안에서 B를 호출했다고 가정했을 때 호출한 함수는 A이며, 호출된 함수는 B가 된다. 현재 B가 호출되면서 B는 자신의 일을 진행해야한다, 즉 제어권은 B에게 주어진 상황이다. 
    • Blocking : 함수는 B는 할일을 마칠 때까지 제어권을 가지고 있고 A는 B를 기다려야 한다.
    • NonBlocking : 함수 B는 할일을 마치지 않았어도 A에게 제어권을 바로 넘겨준다. A는 B를 기다리면서도 다른 일을 진행할 수 있다.
  • 호출된 함수에서 일을 시작할 때 바로 제어권을 리턴해주느냐 할일을 마치고 제어권을 주느냐에 따라 블록과 논블록으로 나눠진다.

 

 

Synchronous/Asynchronous

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

  • B의 수행 결과나 종료 상태를 A가 신경쓰고 있는 유무의 차이
    • Synchronous : 함수 A는 함수 B가 일을 하는 중에 기다리면서 현재 상태가 어떤지 체크
    • Asynchronous : 함수 B의 수행 상태를 B 혼자 직접 신경쓰면서 처리
  • 호출된 함수를 호출한 함수가 신경쓰는지 호출된 함수 스스로 관리하는지의 문제를 동기/비동기라고 하는 것
  • 비동기는 호출 시 callback을 전달하여 작업의 완료 여부를 호출한 함수에게 답하게 된다. callback이 오기 전까지 호출한 함수는 신경쓰지 않고 다른 일을 할 수 있다.

 I/O 작업은 Kernel level에서만 수행할 수 있다.

따라서 Process, Thread는 커널에게 I/O를 요청해야 한다.

 

Blocking I/O

  1. Process가 Kernel에게 I/O을 요청하는 함수를 호출
  2. Kernel이 작업을 완료하면 작업 결과 반환 받는다.
  • I/O작업이 진행되는 동안 user process는 자신의 작업을 중단한 채 대기
  • I/O작업이 CPU자원을 거의 쓰지 않아 Resource 낭비가 심하다.
  • 여러 클라이언트가 접속하는 서버를 Blocking 방식으로 구현하는 경우 I/O 작업을 진행하는 작업을 중지→다른 클라이언트가 진행중인 작업을 중지하면 안되므로 클라이언트별로 별도의 Thread를 생성해야함 → 접속자수가 많아지면 Thread가 많아져서 컨텍스트 스위칭 횟수가 증가한다.

 

Non-Blocking I/O

  1. User process가 recvform 함수(커널에게 해당 Socket으로부터 data 를 받고 싶다고 요청) 호출
  2. Kernel은 이 요청에 대해 곧바로 recvBuffer를 채워서 보내지 못하므로 EWOULDBLOCK을 반환
  3. Blocking 과 달리 User Process는 다른 작업을 진행할 수 있다
  4. recvBuffer에 user가 받을 수 있는 데이터가 있는 경우 Buffer로부터 데이터를 복사하여 받아온다
    1. recvBuffer는 Kernel이 가지고 있는 메모리에 적재되어 있어, memory간 복사로 인해 I/O보다 빠른 속도로 data를 받아올 수 있다.
  5. recvform 함수는 빠른 속도로 data를 복사한 후 복사한 data의 길이와 함께 반환
  • I/O 작업이 진행되는 동안 User Process 작업을 중단하지 않는다.

'기초 CS 정리' 카테고리의 다른 글

마이크로 서비스 아키텍처 (MSA)  (0) 2023.02.13
데브옵스 DevOps  (0) 2023.02.12
로드 밸런싱(Load Balancing)  (0) 2023.02.10
TLS/SSL handshaking  (0) 2023.02.09
HTTP & HTTPS  (0) 2023.02.08