dh_0e

[과제] Windows에서 사용되는 I/O 모델 본문

내일배움캠프/특강

[과제] Windows에서 사용되는 I/O 모델

dh_0e 2024. 6. 4. 13:00

Select 모델

  • Select 모델이란 네트워크 서버에서 다수의 클라이언트 연결을 처리하기 위해 사용되는 고전적인 방법 중 하나이다.
  • select()함수가 핵심 역할을 한다는 뜻에서 붙어진 이름이다.
  • Select 모델을 사용하면 소켓 모드(블로킹, 넌블로킹)와 상관없이 여러 소켓을 한 스레드로 처리할 수 있다.

소켓

  • 소켓은 프로토콜, IP 주소, 포트 넘버로 정의된 두 호스트를 연결해주는 도구로써 인터페이스의 역할을 하며 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어지는 역할을 한다.
  • 소켓의 종류에는 양방향으로 오류 수정, 정송처리, 흐름 제어를 보장하며 대량의 데이터 전송에 적합한 스트림(TCP), 비연결형소켓으로 데이터 크기에 제한이 있으며 데이터가 손실돼도 오류가 발생하지 않는 데이터그램(UDP)이 있다.

주요 개념

  • 동기 I/O (Synchronous I/O): I/O 작업이 동기적으로 수행되는 것을 의미한다. 이는 I/O 작업이 완료될 때까지 해당 스레드가 차단됨을 의미한다.
  • Multiplexing: Select 시스템 호출을 사용하여 여러 소켓을 동시에 모니터링할 수 있다는 것이다. 이는 하나의 스레드가 다수의 소켓을 감시하고 I/O 이벤트가 발생했을 때 처리할 수 있게 한다.
  • Select 시스템 호출: select(), poll(), epoll() 등의 시스템 호출을 사용하여 여러 파일 디스크립터를 모니터링하는 것이다.
    • 파일 디스크립터(File Descriptor)란  리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값이다. 일반적으로 0이 아닌 정수값을 갖는다.
    • 프로세스가 실행 중에 파일을 열면 커널은 해당 프로세스의 FD 숫자 중 사용하지 않는 가장 작은 값을 할당하며 다음 프로세스가 열려있는 파일에 시스템 콜을 이용하여 접근할 때, FD 값을 이용해서 파일을 지칭할 수 있다.
    • 프로그램이 프로세스로 메모리에서 실행될 때, 기본적으로 할당되는 FD는 표준 입력(Standard Input), 표준 출력(Standard Output), 표준 에러(Standard Error)이며 이들에게 각각 0, 1, 2라는 정수가 할당된다.

동작 방식

  1. 소켓 설정 - 서버가 클라이언트 연결을 수락할 소켓을 설정한다.
  2. 소켓 감시 - Select 시스템 호출을 사용하여 여러 소켓에서 발생하는 I/O 이벤트를 감시한다.
  3. 이벤트 발생 처리 - 소켓에서 I/O 이벤트가 발생하면, Select 호출이 해당 소켓을 반환하고, 서버가 해당 이벤트를 처리한다.
  4. 이벤트 처리 - I/O 이벤트가 발생한 소켓에 대해 필요한 작업을 수행하는 것으로, 이는 클라이언트의 데이터 수신, 처리 및 응답 전송 등을 포함한다.

Select 모델 동작 원리

  • 다음 그림과 같이 Select 모델을 사용하려면 소켓 set 3개를 준비해야한다.
  • 소켓 set은 디스크립터의 집합을 의미하며 호출할 함수의 종류에 따라 소켓을 적당한 set에 넣어두어야 한다.
  • 소켓 set을 3개 준비하여 select()함수를 호출하면 select()함수는 소켓 set에 포함된 소켓이 입출력을 위한 준비가 될 때까지 대기한다(그림 9-3).
  • 한 소켓이라도 준비를 마치면 함수가 return하여 소켓 set에는 입출력이 가능한 소켓만 남고 나머지는 제거된다.
  • 그림 9-4는 두 소켓에 대해 읽기가 가능하고 한 소켓에 대해 쓰기가 가능함을 나타낸다.
  • 그러므로 이 세 소켓에 대해서는 소켓 함수를 호출하여 원하는 작업을 할 수 있다.

읽기 set (함수 호출 시점)

  • 접속한 클라이언트가 있으므로 accept() 함수 호출이 가능하다.
  • 소켓 수신 버퍼에 도착한 데이터가 있으므로 recv(), recvfrom() 등의 함수를 호출하여 데이터 읽기가 가능하며 TCP연결이 종료되었으면 recv(), recvfrom() 함수를 호출해 연결 종료를 감지할 수 있다.

쓰기 set

  • 함수 호출 시점: 소켓 송신 버퍼의 여유 공간이 충분하므로 send(), sendto() 등의 함수를 호출하여 데이터 보내기가 가능하다.
  • 함수 호출 결과: 넌블로킹 소켓을 사용한 connect() 함수 호출이 성공한다.

예외 set

  • 함수 호출 시점: OOB(Out-Of-Band) 데이터가 도착했으므로 recv(), recvfrom() 등의 함수를 호출하여 데이터를 받을 수 있다.
    • OOB(Out-Of-Band) 데이터는 연결 지향성(스트림) 소켓(ex.TCP)에서만 의미가 있는 사용자 고유 데이터이다.
  • 함수 호출 결과: 넌블로킹 소켓을 사용한 connect() 함수 호출이 실패한다.

 

소켓 모드에 따른 Select 모델 사용 효과

  • 블로킹 소켓: 소켓 함수 호출 시 조건이 만족되지 않아 블로킹되는 상황을 막을 수 있다.
  • 넌블로킹 소켓: 소켓 함수 호출 시 조건이 만족되지 않아 나중에 다시 호출해야 하는 상황을 막을 수 있다.

 

 

IOCP(입출력 완료 포트, I/O Completion Ports)

  • IOCP (Input/Output Completion Ports)란 고성능 서버 응용 프로그램에서 비동기 I/O 작업을 관리하기 위해 Windows 운영 체제에서 제공하는 메커니즘이다.
  • IOCP는 많은 수의 클라이언트 연결을 동시에 처리해야 하는 네트워크 서버에서 특히 유용하다.
  • 통신이 많고 비동기 처리가 필요한 윈도우 기반 게임 서버에서 주로 사용한다.

주요 개념

  • 비동기 I/O (Asynchronous I/O): I/O 작업이 비동기적으로 수행되며, 완료되면 IOCP를 통해 완료 알림을 받는 것을 의미한다.
  • Completion Ports: 비동기 I/O 작업이 완료되면 그 작업의 결과를 처리하기 위해 사용되는 포트이다.
  • Worker Threads: IOCP는 여러 작업 스레드를 사용하여 I/O 작업의 완료를 처리한다. 스레드 풀을 통해 적절한 수의 스레드가 유지된다.
  • Concurrency(동시성): IOCP는 다중 스레드 환경에서 높은 동시성을 지원한다. 이는 다수의 클라이언트 요청을 효율적으로 처리할 수 있게 한다.

동작 방식

  1. I/O 요청 제출 - 애플리케이션이 비동기 방식으로 I/O 요청을 제출한다.
  2. I/O 작업 진행 - 요청된 I/O 작업이 비동기적으로 수행되며, 이 동안 스레드는 다른 작업을 계속할 수 있다.
  3. 작업 완료 통지 - I/O 작업이 완료되면 IOCP가 해당 작업의 완료를 통지한다.
  4. 완료 작업 처리 - Worker Thread가 완료된 작업을 처리하는 것으로, 스레드는 IOCP에서 I/O 완료 알림을 대기하며, 알림을 받으면 해당 작업을 처리한다.

출처: https://dev-ahn.tistory.com/114

IOCP의 장점

  • 적은 수의 스레드만을 사용하여 구현할 수 있다.
  • 적은 수의 스레드 사용으로 CPU 점유율도 낮으며, 윈도우 OS가 직접 스레드 풀링을 관리하기 때문에 Context switching 비용도 적다.
  • winsock2 API 중 확장성과 성능이 가장 뛰어나다.
  • Overrapped I/O를 확장시킨 개념이므로 커널 영역과 유저 영역의 버퍼를 공유한다.

IOCP의 단점

  • 프로그램 구현이 복잡해진다.
  • window 기반 플랫폼에서만 사용이 가능하다.
  • 하나의 I/O operation 마다 버퍼 영역에 대한 page-lock/unlock이 필요하다.
  • 하나의 I/O operation마다 시스템 콜을 호출하여 유저모드-커널모드 전환이 발생한다.

 

IOCP와 Select 모델 비교

  • 성능 측면에서 IOCP는 높은 동시성 및 비동기 I/O 처리로 인해 다수의 클라이언트를 동시에 처리할 때 더 나은 성능을 제공한다. Select 모델은 다수의 클라이언트를 처리할 수 있지만, 많은 소켓을 감시할 때 성능 저하가 발생할 수 있다.
  • 확장성 측면에서 IOCP는 더 많은 수의 클라이언트를 효과적으로 처리할 수 있으며, 스레드 풀을 통해 작업을 분산 처리한다. Select 모델은 소켓 수가 증가함에 따라 성능 저하가 발생할 수 있다.
  • 복잡성 측면에서 IOCP구현이 더 복잡하지만, 높은 성능을 제공한다. Select 모델구현이 비교적 간단하지만, 대규모 시스템에서는 성능 문제가 발생할 수 있다.
  • 플랫폼 측면에서 IOCP는 Windows에서 주로 사용되며, Select 모델은 다양한 운영 체제에서 사용할 수 있다.

이러한 차이점들을 고려하여, 애플리케이션의 요구사항에 맞는 적절한 모델을 선택하는 것이 중요하다.

 

 

 

출처

 

[Network] 소켓 I/O 모델 ① - Select 모델 (Blocking Socket)

Select 모델은 select() 함수가 핵심 역할을 한다는 뜻에서 붙인 이름이다. Select 모델을 사용하면 소켓...

blog.naver.com

 

 

[기본] 소켓(SOCKET)통신 이란?

소켓통신 소켓(SOCKET)이란?소켓(Socket)은 프로세스가 드넓은 네트워크 세계로 데이터를 내보내거나 혹은 그 세계로부터 데이터를 받기 위한 실제적인 창구 역할을 한다. 그러므로 프로세스가 데

helloworld-88.tistory.com

 

 

IOCP에 대하여

참고 출처들 - 1. https://developstudy.tistory.com/42?category=836040 C++ IOCP 서버 1. 동기 비동기 * 아직 배우고 있는 학생이라 틀린 내용이 있을 수도 있습니다. 틀린 내용이 있다면 알려주시면 감사하겠습니

its-fusion-blog.tistory.com

 

 

파일 디스크립터(File Descriptor) 란 무엇인가?

1. 개념 파일 디스크립터(File Descriptor)란 리눅스 혹은 유닉스 계열의 시스템에서 프로세스(process)가 파일(file)을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상

twofootdog.tistory.com