2010-07-26 2 views
0

서버 (C++)와 클라이언트 (C# 응용 프로그램)간에 부스트의 공유 메모리를 구현할 계획입니다. 판독기와 기록기 만 있고 데이터 공유 빈도 (밀리 초)는 수천 분의 1 초입니다.공유 메모리 구현시 고려해야 할 점

어떤 위험이 있습니까?

+1

공유 메모리 구현 방법은 http://stackoverflow.com/questions/439787/how-to-implement-shared-memory-in-net을 참조하십시오. Steven Sudit이 대답 할 때 P/Invoke를 사용해야 할 것 같습니다. –

답변

0

글쎄,. NET 3.5에서 공유 메모리를 지원하지 않습니다. P/Invoke를 사용하면 통증이 생길 수 있습니다. 더 큰 문제는 C#의 메모리 모델이 C++와의 공유에 도움이되지 않는다는 것입니다. 추가 위험으로

편집, 어떤 실수는 과정을 죽이는 짧은 아무것도 해결할 수 없습니다 누수가 발생할 수 있음을 의미하는 OS 핸들을 잡고 요구하는 것입니다. IntPtr 대신 SafeHandle을 사용하면 대부분을 막을 수 있습니다.

5

밀리 초당 수천 번 정도는 말하지 않습니다. 1 바이트의 시간이라면 많은 것이 아닙니다. 그것이 더 많으면 .. 음, 그것은 모두 얼마나에 달려 있습니다.

메모리 공유를 권장하지 않습니다. 나는 "공유함으로써 의사 소통을하지 말고 의사 소통을 통해 공유"를 제안합니다. 일단 작업이 끝나면 프로파일 링을 통해 추가 메모리 복사본이 실제로 병목 지점에 있음을 알게되면, 아마도 일부 interop 기반 공유 메모리 솔루션이 수정 될 수 있습니다. 종종 그런 경우가 아니라는 것을 알게됩니다.

+2

좋은 조언. 실제로 공유 메모리는 RPC 메커니즘의 IPC 버전을 구현하는 데 종종 사용됩니다. 예를 들어, "localhost"에 대한 TCP/IP는 "."에 대한 명명 된 파이프와 마찬가지로 공유 메모리를 사용합니다. 이러한 일반적인 메커니즘을 사용하면 메시지 전달 아키텍처의 견고 함과 스케일 아웃 가능성을 통해 공유 메모리의 속도를 훨씬 높일 수 있습니다. –

+0

localhost에 대한 TCP/IP는 항상 공유 메모리를 사용합니까? 그건 OS 특유의 것 같습니다. 큰 3 데스크탑 OS 중 어떤 것이 (Win/Mac/Lin)하는지 알고 싶습니다.업데이트 당 약 100 바이트가 –

+0

입니다. pinvoke 등을 사용하려면 잠금과 같은 스레드 안전 기능이 필요합니다. 여기서 mem 공유에서는이 기능이 필요하지 않습니다. 육아 행사는 일반적으로 더 오래 걸립니다. – bsobaid

1

난 그냥 공유 메모리는 가상 메모리에 다른 장소에 매핑 될 것으로 기대 일반적

  1. 에 공유 메모리에 대한 의견을 만들고 싶어. 즉, 한 프로세스와 다른 프로세스 사이에 포인터를 전달하는 것은 쓸모가 없다는 의미입니다. 공유 메모리베이스 주소의 오프셋을 사용해야합니다.
  2. malloc/new 및 free/delete 힙 관리 기능에 액세스 할 수 없지만 메모리를 사용하여 자신의 메모리 관리 개체를 설정합니다.
  3. 어떤 프로세스가 어떤 메모리에 액세스 할 수 있는지 명확한 소유권 모델을 고안해야합니다.
  4. 프로세스에서 공유되는 개체 (예 : 부기 개체)에 대한 액세스는 뮤텍스로 보호해야합니다.
  5. 뮤텍스가 잠겨있는 동안 소요되는 시간을 최소화하는 전략을 찾으십시오.
  6. 모든 생산자 소비자 모델에서 흐름 제어에 대해 명확하게 생각했는지 확인하십시오. 공유 공간이 오버플로되거나 언더 플로우되지 않아야합니다. 세마포는 당신의 친구입니다.

나는 그것을 대략 커버한다고 생각한다. 그리고 위의 내용에 동의합니다. IPC를 사용하여 공유 메모리를 실제로 사용해야하는 경우가 아니면 함정이 당신을 먹을 수 있습니다.

+0

뮤텍스를 포함하여 이러한 문제를 잘 알고 있습니다. 부스트 라이브러리로 처리됩니까? – bsobaid

+0

부스트 (Boost)는 위의 사항을 돕기 위해 많은 도구를 제공하지만 위의 사항을 알고 있어야합니다 – doron