일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- localstorage
- string
- 백준 2623번
- JavaScript
- HTTP
- Github
- MongoDB
- ERD
- koi 2002 중등부 1번
- PROJECT
- map
- Prisma
- 자바스크립트
- 더 흔한 색칠 타일 문제
- MySQL
- html5
- insomnia
- 백준 28298번
- Express.js
- ucpc 2023 예선 i번
- 백준 28303번
- ucpc 2024 예선 e번
- branch
- router
- 게임 서버 아키텍처
- pm2
- ucpc 2023 예선 d번
- 그리디
- ccw 알고리즘
- Next
Archives
- Today
- Total
dh_0e
[과제] Windows에서 사용되는 I/O 모델 본문
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라는 정수가 할당된다.
동작 방식
- 소켓 설정 - 서버가 클라이언트 연결을 수락할 소켓을 설정한다.
- 소켓 감시 - Select 시스템 호출을 사용하여 여러 소켓에서 발생하는 I/O 이벤트를 감시한다.
- 이벤트 발생 처리 - 소켓에서 I/O 이벤트가 발생하면, Select 호출이 해당 소켓을 반환하고, 서버가 해당 이벤트를 처리한다.
- 이벤트 처리 - I/O 이벤트가 발생한 소켓에 대해 필요한 작업을 수행하는 것으로, 이는 클라이언트의 데이터 수신, 처리 및 응답 전송 등을 포함한다.
- 다음 그림과 같이 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는 다중 스레드 환경에서 높은 동시성을 지원한다. 이는 다수의 클라이언트 요청을 효율적으로 처리할 수 있게 한다.
동작 방식
- I/O 요청 제출 - 애플리케이션이 비동기 방식으로 I/O 요청을 제출한다.
- I/O 작업 진행 - 요청된 I/O 작업이 비동기적으로 수행되며, 이 동안 스레드는 다른 작업을 계속할 수 있다.
- 작업 완료 통지 - I/O 작업이 완료되면 IOCP가 해당 작업의 완료를 통지한다.
- 완료 작업 처리 - Worker Thread가 완료된 작업을 처리하는 것으로, 스레드는 IOCP에서 I/O 완료 알림을 대기하며, 알림을 받으면 해당 작업을 처리한다.
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 모델은 다양한 운영 체제에서 사용할 수 있다.
이러한 차이점들을 고려하여, 애플리케이션의 요구사항에 맞는 적절한 모델을 선택하는 것이 중요하다.
출처
'내일배움캠프 > 특강' 카테고리의 다른 글
[특강] 샤딩(Sharding) (1) | 2024.06.11 |
---|---|
[특강] 연봉 1억 받는 개발자가 되는 법 (1) | 2024.06.07 |
[과제] 서브넷 마스크, 공인/사설 IP 주소, 정적/동적 IP 주소, 라우터/라우팅 (0) | 2024.05.30 |
[과제] 네트워크 계층(Network Layer) (0) | 2024.05.28 |
[과제] 물리 계층과 데이터 계층이란 (0) | 2024.05.23 |