413236-3158 / 3079-5158
Subaru, Honda, Suzuki, Toyota, Mitsubishi, Nissan

iocp 예제

또한 시스템은 동일한 I/O 완료 포트와 연결된 다른 실행 중인 스레드가 다른 이유로 대기 상태가 되는 경우 GetQueuedCompletionStatus에서 대기 중인 스레드가 완료 패킷을 처리할 수 있도록 합니다(예: SuspendThread 함수). 대기 상태의 스레드가 다시 실행되기 시작하면 활성 스레드 수가 동시성 값을 초과하는 짧은 기간이 있을 수 있습니다. 그러나 시스템은 활성 스레드 수가 동시성 값 아래로 떨어질 때까지 새 활성 스레드를 허용하지 않음으로써 이 수를 빠르게 줄입니다. 이는 응용 프로그램이 동시성 값보다 스레드 풀에 더 많은 스레드를 만드는 이유 중 하나입니다. 스레드 풀 관리는 이 항목의 범위를 벗어나지만 시스템에 프로세서가 있는 스레드 풀에 최소 두 배의 스레드를 두 배로 두는 것이 좋습니다. 스레드 풀링에 대한 자세한 내용은 스레드 풀을 참조하십시오. 여기서 사용되는 파일 핸들이라는 용어는 디스크의 파일뿐만 아니라 중첩된 I/O 끝점을 나타내는 시스템 추상화를 나타냅니다. 예를 들어 네트워크 끝점, TCP 소켓, 명명된 파이프 또는 메일 슬롯일 수 있습니다. 겹친 I/O를 지원하는 모든 시스템 개체를 사용할 수 있습니다. 관련 I/O 함수 목록은 이 항목의 끝을 참조하십시오. Windows에서 이 문제에 대한 해결책은 “IO 완료 포트”라는 흥미로운 개념에 있습니다.

이러한 개체는 파일 또는 네트워크 HANDL과 연결할 수 있는 큐 개체(HANDLE로 표시)이며 많은 스레드가 기다릴 수 있습니다. 연결된 HANDLE의 입력 또는 출력 작업이 완료되면(예: 네트워크 쓰기) 대기 중인 스레드 중 하나(하나만)가 깨어나 이벤트를 처리합니다. 또한 사용자 이벤트를 포트에서 큐에 대기할 수 있으므로 대기 스레드를 사용하여 IO가 아닌 특정 작업을 수행할 수도 있습니다. 스레드는 PostQueuedCompletionStatus 함수를 사용하여 I/O 완료 포트의 큐에 완료 패킷을 배치할 수 있습니다. 이렇게 하면 완료 포트를 사용하여 I/O 시스템에서 I/O 완료 패킷을 수신하는 것 외에도 프로세스의 다른 스레드로부터 통신을 수신할 수 있습니다. PostQueuedCompletionStatus 함수를 사용하면 응용 프로그램이 비동기 I/O 작업을 시작하지 않고 I/O 완료 포트에 고유한 특수 목적 완료 패킷을 큐에 대기할 수 있습니다. 예를 들어 외부 이벤트의 작업자 스레드에 알리는 데 유용합니다. 이전 예제에서는 추가 스레드가 쓸모없는 것처럼 보이지만 실행 중인 스레드가 다른 메커니즘에 의해 대기 상태에 놓이거나 종료되거나 연결된 I/O 완료 포트를 닫지 않았다고 가정합니다. 응용 프로그램을 디자인할 때 이러한 모든 스레드 실행 파급 효과를 고려합니다.

IOCP를 사용하여 작업하는 동안 소켓을 완료 포트에 연결하고 비동기 I/O 호출을 만들고 스레드와 동기화하는 세 가지 작업을 처리해야 합니다. 비동기 I/O 호출에서 결과를 얻고 예를 들어 어떤 클라이언트가 호출했는지 알기 위해 CompleteKey 매개 변수와 OVERLAPPED 구조라는 두 개의 매개 변수를 전달해야 합니다. 큐에 패킷이 없거나 최대 활성 스레드 수에 도달하면 스레드가 차단됩니다. 새 패킷이 도착하거나 동시성 값이 허용하는 경우 또는 활성 스레드 중 하나가 차단될 때(예: 동기화 개체, I/O 작업 등) 자체적으로 활성화될 때 해제됩니다. 이전에 활성 스레드가 차단해제된 경우 패킷 처리를 계속하므로 동시 활성 스레드 수가 짧은 시간 동안 동시 값값을 초과할 수 있습니다.

Comments are closed.