block I/O , non-block I/O

강민승·2023년 4월 20일
0

I/O

  • input/output, 데이터의 입출력

종류

  • network(socket)
  • file
  • pipe (프로세스 간 통신할 때 사용되는 개념)
  • device

네트워크 프로그래밍에서의 소켓(socket)은, 인터넷 프로토콜을 통해 서로 다른 두 호스트 간에 통신할 수 있도록 하는 소프트웨어적인 종착점(endpoint)을 말합니다. 일반적으로 인터넷 상에서 데이터 통신에 사용되는 소켓은 IP 주소와 포트 번호로 식별됩니다.

파일(file)은, 컴퓨터 시스템에서 데이터를 저장하는 데 사용되는 일반적인 개념입니다. 파일은 이름이 지정된 디렉토리에 저장되며, 읽기, 쓰기, 수정 및 삭제 등의 작업이 가능합니다.

파이프(pipe)는, 두 프로세스 간의 단방향 통신 채널을 생성하기 위해 사용되는 일종의 파일입니다. 파이프는 일반적으로 한쪽 프로세스에서 데이터를 쓰고, 다른 쪽에서 읽는 방식으로 사용됩니다. 프로세스 간 통신(IPC)에서 사용됩니다.

디바이스(device)는, 컴퓨터의 입출력 장치나 저장 장치와 같은 하드웨어를 말합니다. 컴퓨터와 다른 기기 간의 통신을 위해 사용되며, 운영 체제에서는 장치 드라이버를 통해 제어됩니다. 예를 들어, 하드 디스크, 프린터, 마우스 등이 대표적인 디바이스입니다.

socket - 네트워크 통신은 socket을 통해 데이터가 입출력 된다.

네트워크가 있고, 네트워크 안에 두 개의 컴퓨터와 프로세스가 있을 때, socket을 열고 socket을 통해 데이터를 주거나 받을 수 있다.

backend Server

네트워크 상의 요청자들과 각각 소켓을 열고 통신한다.

서버에서 소켓을 열고 통신.

block I/O

I/O 작업을 요청한 프로세스/스레드는 요청이 완료될 때까지 블락됨.

위의 동작은 thread가 block 이 되면 시스템 콜을 통해 커널로 들어가서 입출력을 읽으라고 하고 준비가 되어 리스폰스가 되면 자고 있던 스레드를 깨운다.

S에서 A로 데이터를 보낼려고 함.

일단 에이는 기다려야함. 센드 버퍼와 리시브 버퍼가 있는데 리시브 버퍼에 데이터가 들어올 때까지 리드 시스템 콜을 호출한 스레드는 블락이 된다. 언제까지? 리시브 버퍼에 데이터가 들어올 때까지.

에스는 센드 버퍼가 가득차면 롸이트 시스템 콜은 블락이된다. 언제까지? 공간이 생길 때 까지.

non-block I/O

  • 프로세스/ 스레드를 블락시키지 않고 요청에 대한 현재 상태를 즉시 리턴

리드 작업을 실행하고 바로 다시 스레드로 반환, 이때, 리눅스에서는 -1로 반환을 하고 동시에 EAGAIN or EWOULDBLOCK 이라는 에러코드와 함께 반환이 된다.

즉, 논 블락 아이오는 → 블락되지 않고 즉시 리턴하기 때문에 스레드가 다른 작업을 수행할 수 있다.

만약 A 소켓에서 리드를 했는데 데이터가 없다면 없다고 반환을 함.

S 소켓에 센드 버퍼에 공간이 없다면, 에러 코드를 반환.

non-block I/O 이슈

아이오 작업 완료를 어떻게 확인할 것인가?

논블락 아이오 결과 처리 방식

  1. 완료됐는지 반복적으로 확인.
    1. 단점
      1. 완료된 시간과 완료를 확인한 시간 사이의 갭으로 인해 처리 속도가 느려질 수 있음

    2. 완료됐는지 반복적으로 확인하는 것은 CPU 낭비가 발생
2. 해결책 → I/O multiplexing(다중 입출력) 사용
    1. 아이오 멀티플렉싱은 → 관심있는 아이오 작업들을 동시에 모니터링하고 그 중에 완료된 아이오 작업들을 한번에 알려줌
        

아이오 멀티플렉싱

  1. 종류
    • select
    • poll
    • epoll ( 리눅스 )
    • kqueue (맥)
    • IOCP (I/O completion port) ( 윈도우 등)

밑에 세개가 많이 쓰임, 그리고 유사함

  1. 즉, 네트워크 통신에 많이 사용

IO 멀티플렉싱은 하나의 스레드에서 여러 개의 I/O 작업을 처리하기 위한 방법 중 하나입니다. 이를 이용하면 하나의 스레드에서 여러 개의 파일 디스크립터나 소켓을 관리하면서 동시에 I/O 작업을 처리할 수 있습니다.

select, poll, epoll, kqueue, IOCP는 IO 멀티플렉싱을 구현하기 위한 여러 가지 방법 중 일부입니다. 이들은 모두 비슷한 목적을 가지고 있지만 구현 방법이 다르기 때문에 특성과 장단점이 각각 다릅니다.

select: 모든 플랫폼에서 사용 가능하며, 소켓 개수가 많아지면 비효율적일 수 있습니다.
poll: select와 비슷하지만 좀 더 최신 기술이며, select와 마찬가지로 소켓 개수가 많아지면 비효율적일 수 있습니다.
epoll: 리눅스에서 사용 가능하며, 소켓 개수가 많아져도 효율적으로 동작합니다.
kqueue: macOS와 FreeBSD에서 사용 가능하며, select와 poll보다 더 높은 성능을 가집니다.
IOCP: 윈도우에서 사용 가능하며, 성능이 매우 우수합니다.
이들은 각각의 특성과 장단점을 가지고 있기 때문에 상황에 따라 적절한 방법을 선택하여 사용해야 합니다.

Callback / signal 사용

  1. 종류
    • POSIX AIO
    • LINUX AIO
  • 하지만 널리 사용되진 않는 것 같음..

핵심 → 논블락 아이오를 통해 아이오 요청 완료 전에도 다른 일을 할 수 있다는 것.

profile
Step by Step goes a long way. 꾸준하게 성장하는 개발자 강민승입니다.

0개의 댓글