2012-02-02 6 views
2

저는 IPC에 대한 newbee입니다. Writer 프로세스는 데이터를 공유 메모리에 씁니다. 많은 독자 프로세스가 데이터를 읽습니다. 기록 할 데이터에는 고유 한 식별자가 있으며 빠른 액세스 (예 : STL :: map 또는 조회 용 해시 맵)를 위해 고유 한 키로 인덱싱해야합니다. 또한 데이터는 가변 길이 레코드 (XML)입니다 (평균 길이는 200-250 바이트). OS는 Intel Xeon Quad Core Server에서 solaris 10 (i86pc)입니다.가변 길이 레코드 용 C++의 잠금없는 공유 메모리

총 데이터 크기가 200G 이상입니다. 그러나 우리는 공유 메모리에 최신 데이터 만 보관할 것입니다. 기록 데이터는 파일에 있습니다. 공유 메모리 크기는 약 4G ~ 6G 정도입니다.

부스트 :: 간 같은 avaiable이다 없음 외부 라이브러리

나는 질문의 커플이 될 수있는 많은 더 효율적입니다

  1. :
  2. 방법 shared_memory 또는 mmap를 (메모리 매핑 된 파일) 가변 길이 레코드에 대한 인덱스를 작성하십시오. [나도 몰라, 약간의 해싱이있을 수 있니?].
  3. XML을 고정 크기 구조로 변환하면 깔끔하게 정리할 수 있습니까? (구조체의 크기는 대략 300+ 가깝습니다)
  4. 맞춤 할당기를 제공하여 shared_memory에 STL을 배치 할 수 있습니까?
  5. 세마포어없이 구현할 수 있습니까 (CAS를 사용하여 잠금없는 구현).

감사합니다 이것에 대해

어떻게

.

|--------------------------| 
| start_id | end_id | -> range of msg id present in the segment 
|--------------------------| 
| id1 | start_mem | length | -> 
|--------------------------| -> 
| id2 | start_mem | length | -> table of index for the actual data 
|--------------------------| -> 
| id3 | start_mem | length | -> 
|--------------------------| -> 
| id4 | start_mem | length | -> 
|--------------------------| -> 
|       | 
|       | 
|       | 
|  data segment  | 
|  varibale length | 
|  xml are stored  | 
|       | 
|       | 
|--------------------------| 

새 데이터가 도착하고 세그먼트가 가득 찬 경우. 가장 오래된 데이터는 순환 방식으로 지워집니다. 지워지는 레코드가 두 개 이상일 수 있습니다.

+0

어떤 컴파일러를 사용하고 있습니까? – pyCthon

+0

제목에 질문을 기술하십시오. 사실, 우리가 그곳에있는 동안, 이것은 _ _ _ _ _ _ 질문입니다. 그것들을 게시하십시오. –

+0

독자가 동일한 데이터를 읽어야합니까? 모든 프로세스에 대해 키 수가 고정되어 있습니까? – Karlson

답변

-1

세마포어없이 구현할 수 있습니까 (CAS를 사용한 잠금없는 구현)?

잠금없는 때문에 (잠금 무료) 구현은 측면과 대안 다음 사항을 고려한다 설계 및 우리가 잠금 무료 솔루션을 가기 전에, 혼란에 끝낼 수 있습니다 어려운 :

  • 가있는 경우를 시스템의 많은 쓰레드들. 그래서 스케쥴러는 잠금을 유지하고있는 쓰레드를 선점 할 것이고, 결과적으로 다른 모든 쓰레드는 잠금을 기다리고있을 것이다. (lock-free가 현저한 개선을하지 않는다면).
  • 독자가 reader-writers lock을 사용하여 해결할 수있는 경우. (작가는 독자보다 훨씬 적습니다).
  • 잠금 경합이 거의 발생하지 않는 경우 스핀 잠금을 고려하면 잠금없는 성능과 동등한 효과를 얻을 수 있습니다.
+0

해결책을 찾고있는 다른 사람들을 위해 질문에 답하십시오 – Alex

0

복잡한 인덱싱 및 기타 작업이 필요한 경우 가장 쉬운 해결책은 공유 메모리 대신 서비스 지향 아키텍처를 고려해야합니다. 하나의 프로세스를 마스터 캐시 프로세스로 지정하고 데이터가 필요한 다른 프로세스의 로컬 연결 (유닉스 도메인 소켓 또는 TCP 소켓 등)을 받아들이기만하면됩니다. 이것은 일을 훨씬 더 간단하게 만듭니다.

이 경로를 선택하지 않은 경우 공유 메모리가 임을주의하십시오. 공유 메모리에서 확실히 할 수있는 것은 -이 shmem 청크 등에서 힙 할당자를 생성 할 수 있습니다. STL 할당 자 일 수 있지만 사용자 정의 포인터를 사용하는 STL 할당자가 만족스럽지는 않습니다. 유형. 은 자물쇠가 필요합니다 (일부 경우에는 피할 수 있지만 모든 경우는 피할 수 있습니다.이 경우 분명히 STL 작별과 키스 할 수 있습니다). 일반적으로 당연하게 여기는 모든 것을 다시 만들어야합니다 .

다시 한 번 간단한 캐시 데몬으로 시작하는 것이 좋습니다. 이것은 대부분의 시간을 잘 조절하고 조금 더 많은 대기 시간을 추가합니다.

+0

즉각적인 솔루션 SOA 아키텍처는 불가능합니다. 이 질문을 게시 한 후 우리는 shared_memory에 STL을 둘 수 없다는 것을 알게되었습니다 (다른 프로세스에서 볼 수없는 포인터를 사용합니다) – naveenhegde

+0

귀하의 경우 마스터 프로세스가 왜 불가능합니까? – bdonlan

+0

해결책을 찾는 다른 사람들을 위해 질문에 답하십시오 – Alex