[Windows] I / O 완료 포트의 장점과 단점


Answers

I / O 완료 포트는 굉장합니다. 그들을 묘사하는 더 좋은 단어는 없습니다. Windows에서 수행 한 작업이 모두 올바르게 완료되면 완료 포트가됩니다.

몇 개의 스레드를 만들 수 있습니다 (실제로 얼마나 많은지는 문제가되지 않음). 하나의 완료 포트에서 이벤트가 발생하면 (수동으로 게시하거나 타이머 또는 비동기 I / O 등의 이벤트가 도착할 때까지) 모두 차단됩니다. . 그런 다음 완료 포트는 이벤트를 처리 할 수있는 하나의 스레드를 깨우고 지정한 한계까지 기다립니다. 아무 것도 지정하지 않으면 "최대 수의 CPU 코어"로 간주되어 정말 좋습니다.

최대 한도보다 더 많은 쓰레드가 이미 활성화되어 있다면, 그것들 중 하나가 완료 될 때까지 기다린 다음 대기 상태가되는 즉시 스레드에 이벤트를 넘깁니다. 또한 스레드는 항상 LIFO 순서로 스레드를 깨우므로 캐시가 여전히 따뜻하다는 가능성이 있습니다.

즉, 완료 포트는 "이벤트를위한 폴링"뿐만 아니라 "가능한 한 CPU를 가득 채우십시오"솔루션입니다.

완료 포트, 소켓 또는 대기 가능한 다른 파일에서 파일 읽기 및 쓰기를 던질 수 있습니다. 원하는 경우 자신의 이벤트를 게시 할 수 있습니다. 각 사용자 정의 이벤트에는 최소한 하나의 정수 및 하나의 포인터 상당의 데이터가 있습니다 (기본 구조를 사용하는 경우). 그러나 시스템이 행복하게 다른 구조를 받아들이도록 실제로 제한되지는 않습니다.

또한 완료 포트는 빠르며, 정말 빠릅니다. 옛날 옛적에 한 스레드를 다른 스레드로 통보해야했습니다. 이 스레드는 이미 파일 I / O 완료 포트를 가지고 있었지만 메시지를 펌핑하지는 못했습니다. 그래서 스레드 메시지를 게시하는 것이 훨씬 더 효율적 일지라도 간단하게 글 머리 기호를 물고 완성 포트를 사용해야하는지 궁금합니다. 나는 결정을 내리지 못했고 그래서 나는 벤치마킹을했다. 놀랍게도, 완료 포트가 약 3 배 빠르다고 판명되었습니다. 그래서 ... 더 빠르고 융통성있는 결정은 어렵지 않았습니다.

Question

왜 많은 사람들이 I / O 완료 포트가 빠르고 좋은 모델이라고 말합니까?
I / O 완료 포트의 장점과 단점은 무엇입니까?

나는 다른 모델보다 빠른 IOCP를 만드는 몇 가지 포인트를 알고 싶다.

다른 모델 (select, epoll, traditional multi thread / process)을 비교하여 설명 할 수 있다면 더 좋을 것입니다.




I / O 완료 포트는 O / S에 의해 비동기 I / O 작업으로 제공됩니다. 이는 백그라운드에서 (일반적으로 하드웨어에서) 발생한다는 것을 의미합니다. 시스템은 입출력이 완료되기를 기다리는 어떠한 자원 (예 : 스레드)도 낭비하지 않습니다. I / O가 완료되면 하드웨어는 O / S에 인터럽트를 보내고, O / S는 해당 프로세스 / 스레드를 깨우고 결과를 처리합니다. WRONG : IOCP는 하드웨어 지원이 필요하지 않습니다 (아래 주석 참조).

일반적으로 단일 스레드는 많은 수의 I / O 완료를 기다리는 반면 I / O가 반환되지 않으면 거의 리소스를 차지하지 못합니다.

I / O 완료 포트를 기반으로하지 않는 다른 비동기 모델은 일반적으로 스레드 풀을 사용하고 스레드가 I / O가 완료 될 때까지 대기하므로 더 많은 시스템 리소스를 사용합니다.

일반적으로 I / O 완료 포트는 일반적으로 하드웨어 지원이 필요하므로 일반적으로 모든 비동기 시나리오에 적용 할 수 없습니다.




필자의 경험에 따르면 드라이버의 버그로 인해 I / O 완료 포트의 단점은 일부 RS-232 직렬 어댑터의 파란색 화면이 될 수 있습니다.




IOCP를 사용하여 "클라이언트 당 하나의 스레드"문제를 극복 할 수 있습니다. 소프트웨어가 진정한 다중 프로세서 시스템에서 실행되지 않으면 성능이 크게 저하되는 것으로 알려져 있습니다. 스레드는 무제한이나 저렴한 시스템 리소스입니다.

IOCP는 몇몇 (I / O 작업자) 스레드가 여러 클라이언트의 입출력을 "공정하게"처리하도록하는 방법을 제공합니다. 스레드는 일시 중단되며 수행 할 때까지 CPU주기를 사용하지 않습니다.

또한이 좋은 책 http://www.amazon.com/Windows-System-Programming-Johnson-Hart/dp/0321256190 에서 몇 가지 정보를 읽을 수 있습니다 .