.NET의 비동기 소켓 I/O 분산/수집
-
02-07-2019 - |
문제
짧은 메시지가 많고 처리량이 많은 상황을 위해 .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