문제

짧은 메시지가 많고 처리량이 많은 상황을 위해 .NET에서 Stream.BeginWrite Async I/O API를 사용하려고 합니다.따라서 분산/수집 API는 컨텍스트 전환 수(및 CPU 사용량)를 엄청나게 줄여줍니다.이 API는 LPBUFFERS Win32 API를 전혀 사용합니까?분산/수집 I/O를 위한 대체 API가 있습니까?

도움이 되었습니까?

해결책 4

.NET에서는 소켓 분산/수집 I/O를 수행할 수 있는 방법이 없습니다.MSFT 블로그 게시물에 따르면 .NET 4.5에도 유사한 API가 있을 수 있습니다(그게 무엇이든...).

다른 팁

.net 소스를 보면 허용되는 답변이 잘못된 것 같습니다.

SocketAsyncEventArgs 가지고있다 BufferList 기인하다.그것이 사용될 때, 대신에 Buffer 단일 연속 메모리 블록만 보유할 수 있는 특성으로 인해 작업에서는 분산/수집 DMA를 사용할 수 있습니다. Socket.SendAsync(SocketAsyncEventArgs) 용도 WSASend 내부적으로는 그

분산/수집 유형의 I/O에 적용할 수 있도록 여러 전송 버퍼를 지정할 수 있습니다.

그리고 Socket.SendAsync(SocketAsyncEventArgs) 용도 WSARecv, 저것

다중 수신 버퍼를 지정하여 분산/수집 유형의 I/O에 적용 가능

.net 3.5 소스가 없지만, BufferList .net 3.5부터 존재하므로 분산/수집은 .net 3.5부터 지원되었을 수 있습니다.WSASend 및 WSARecv에 대한 최소 OS 요구 사항은 Windows Vista/Server 2003으로 문서화되어 있습니다.

NB어떤 스트림을 사용하고 있는지는 모르겠지만, NetworkStream.BeginWrite 단일 버퍼를 WSASend로 보내므로 이를 분산/수집에 사용할 수 없습니다.

BCL에서 분산/수집 API에 접근할 수 있다면 놀랄 것입니다(l33t w1n32 haxx0rz용입니다. 아시죠?). 그러나 항상 P/Invoke가 있습니다(놀랍게도 사용하기 쉽다는 것을 알았습니다).

프레임워크의 내부를 자세히 살펴보고 싶다면 다음과 같은 몇 가지 방법이 있습니다.

1) 반사판

2) MS는 최근 디버깅 목적으로 소스를 열었습니다. 디버깅/옵션/일반에서 옵션을 활성화하면 VS2008을 사용하여 한 단계씩 실행할 수 있습니다.

3) Koders.com도 프레임워크 소스를 호스팅하는 것 같습니다.

http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top