[Network] Blocking I/O & Non-Blocking I/O

foresec·2023년 7월 6일
0

Computer Science

목록 보기
14/28

I/O 작업은 Kernel level에서만 수행할 수 있음. 따라서, Process, Thread는 커널에게 I/O를 요청해야함
(커널은 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로써 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할을 함)

Blocking I/O

  1. Process(Thread)가 Kernel에게 I/O를 요청하는 함수 호출
  2. Kernel이 작업 완료시 작업 결과 반환 받음

I/O작업이 진행되는 동안 User Process는 자신의 작업을 중단한 채 대기
Resource 낭비가 심함(I/O 작업이 CPU 자원을 거의 쓰지 않으므로)

+여러 Client가 접속하는 서버를 Blocking 방식으로 구현하는 경우
I/O 작업을 진행하는 작업 중지 -> 다른 Client가 진행중인 작업을 중지하면 안되므로, client 별로 별도의 Thread를 생성하여야 함 -> 접속자 수가 매우 많아짐

즉, 많아진 Threads로 컨텍스트 스위칭 횟수가 증가하는 비효율적인 동작 방식
간단하고 사용하기 쉽지만, 시스템의 리소스를 효율적으로 활용하지 못하고, 여러 작업을 동시에 처리하기 어렵다는 단점

Non-Blocking I/O

I/O 작업이 진행되는 동안 User Process의 작업을 중단하지 X

  1. User Process가 recvfrom 함수 호출(커널에게 해당 Socket으로부터 data를 받고 싶다고 요청)
  2. Kernel은 이 요청에 대해 곧바로 recvBuffer를 채워 보내지 못해 "EWOULDBLOCK"을 return함
  3. Blocking 방식과 달리, User Process가 다른 작업을 진행 가능
  4. recvBuffer에 user가 받을 수 있는 데이터가 있는 경우, Buffer로부터 데이터 복사해서 받아옴
    (이때, recvBuffer는 Kernel이 가지고 있는 메모리에 적재되어 있어 Memory간 복사로 인해 I/O보다 훨씬 빠른 속도로 data 받아오기 가능)
  5. recvfrom함수는 빠른 속도로 data 복사 후, 복사한 data의 길이와 함께 반환

복잡하고 처리 로직이 어렵지만, 시스템의 성능과 응답성을 향상

profile
왼쪽 태그보다 시리즈 위주로 구분

0개의 댓글