서버 (C++)와 클라이언트 (C# 응용 프로그램)간에 부스트의 공유 메모리를 구현할 계획입니다. 판독기와 기록기 만 있고 데이터 공유 빈도 (밀리 초)는 수천 분의 1 초입니다.공유 메모리 구현시 고려해야 할 점
어떤 위험이 있습니까?
서버 (C++)와 클라이언트 (C# 응용 프로그램)간에 부스트의 공유 메모리를 구현할 계획입니다. 판독기와 기록기 만 있고 데이터 공유 빈도 (밀리 초)는 수천 분의 1 초입니다.공유 메모리 구현시 고려해야 할 점
어떤 위험이 있습니까?
글쎄,. NET 3.5에서 공유 메모리를 지원하지 않습니다. P/Invoke를 사용하면 통증이 생길 수 있습니다. 더 큰 문제는 C#의 메모리 모델이 C++와의 공유에 도움이되지 않는다는 것입니다. 추가 위험으로
편집, 어떤 실수는 과정을 죽이는 짧은 아무것도 해결할 수 없습니다 누수가 발생할 수 있음을 의미하는 OS 핸들을 잡고 요구하는 것입니다. IntPtr
대신 SafeHandle
을 사용하면 대부분을 막을 수 있습니다.
밀리 초당 수천 번 정도는 말하지 않습니다. 1 바이트의 시간이라면 많은 것이 아닙니다. 그것이 더 많으면 .. 음, 그것은 모두 얼마나에 달려 있습니다.
메모리 공유를 권장하지 않습니다. 나는 "공유함으로써 의사 소통을하지 말고 의사 소통을 통해 공유"를 제안합니다. 일단 작업이 끝나면 프로파일 링을 통해 추가 메모리 복사본이 실제로 병목 지점에 있음을 알게되면, 아마도 일부 interop 기반 공유 메모리 솔루션이 수정 될 수 있습니다. 종종 그런 경우가 아니라는 것을 알게됩니다.
좋은 조언. 실제로 공유 메모리는 RPC 메커니즘의 IPC 버전을 구현하는 데 종종 사용됩니다. 예를 들어, "localhost"에 대한 TCP/IP는 "."에 대한 명명 된 파이프와 마찬가지로 공유 메모리를 사용합니다. 이러한 일반적인 메커니즘을 사용하면 메시지 전달 아키텍처의 견고 함과 스케일 아웃 가능성을 통해 공유 메모리의 속도를 훨씬 높일 수 있습니다. –
localhost에 대한 TCP/IP는 항상 공유 메모리를 사용합니까? 그건 OS 특유의 것 같습니다. 큰 3 데스크탑 OS 중 어떤 것이 (Win/Mac/Lin)하는지 알고 싶습니다.업데이트 당 약 100 바이트가 –
입니다. pinvoke 등을 사용하려면 잠금과 같은 스레드 안전 기능이 필요합니다. 여기서 mem 공유에서는이 기능이 필요하지 않습니다. 육아 행사는 일반적으로 더 오래 걸립니다. – bsobaid
난 그냥 공유 메모리는 가상 메모리에 다른 장소에 매핑 될 것으로 기대 일반적
나는 그것을 대략 커버한다고 생각한다. 그리고 위의 내용에 동의합니다. IPC를 사용하여 공유 메모리를 실제로 사용해야하는 경우가 아니면 함정이 당신을 먹을 수 있습니다.
공유 메모리 구현 방법은 http://stackoverflow.com/questions/439787/how-to-implement-shared-memory-in-net을 참조하십시오. Steven Sudit이 대답 할 때 P/Invoke를 사용해야 할 것 같습니다. –