2011-04-11 1 views
1

구현하기 위해 프로세스 간 통신을 위해 공유 메모리 할당에 mmap을 사용하고 있습니다. 이 공유 메모리에서 큐를 초기화합니다 (NULL에 처음 포인터와 마지막 포인터를 설정합니다).공유 메모리의 대기열 만들기 POSIX

문제는 새 항목을 대기열에 밀어 넣는 방법입니다. 일반적으로 malloc을 사용하여 '대기열 항목 구조체'를 할당 한 다음이를 가리키고 있지만 사용하지는 못합니다. 어떻게 든 공유 메모리에 할당해야합니다. 아마 또 다른 mmap을 사용하고 거기에 항목을 밀어 넣고 가리킬 수는 있지만, 여러 번 그렇게해야하기 때문에 올바르게 보이지 않습니다.

이 작업을 간단하게 수행 할 수 있습니까? 아니면 다른 솔루션을 고려해야합니까?

어떤 아이디어 주셔서 감사합니다.

답변

2

일반 규칙은 공유 메모리에 큐를 만들려면 다음

1) 공유 요소로 포인터를 사용하지 마십시오, OS가 다른 프로세스에서 다른 가상 주소를 선택할 수 있기 때문이다. 항상 공유 메모리 뷰 기본 주소 나 배열 인덱스 또는 위치 독립적 인 내용의 오프셋을 사용하십시오.

2) 공유 메모리를 수동으로 파티션해야합니다. 예 : 큐에 포함될 수있는 항목의 수를 알아야하고 공유 영역에 "haeder"(삽입 색인 및 추출 색인 ...) 및 항목 배열을 포함 할 수 있도록 치수를 지정해야합니다. 올바른 크기의 "헤더"와 "항목 배열"을 모두 포함하는 구조를 정의하는 것으로 충분합니다. 메모리 크기는 sizeof (your_structure)이고 주소는 mmap에서 반환 한 것입니다.

3) 멀티 스레딩 및 멀티 프로세싱 문제를 신중하게 고려하십시오. 액세스하는 스레드가 블록 할 수있는 경우 뮤텍스를 사용하여 공유 메모리에 대한 액세스를 보호하십시오. 그러나 "비 차단"대기열을 만들려면 최소한 관련 작업 영역을 변경하고 가능한 타이밍 문제를 고려해야합니다.

감사합니다.

+0

감사합니다. 많은 조언을드립니다. 링크 된 목록 대신 배열을 사용하는 것이 훨씬 쉬워집니다. 내가 볼 수있는 유일한 단점은 배열을 사용하면 실제로 그 순간에 필요로하는 더 많은 공간을 차지하게된다는 것입니다. 그게 내가 처음에 연결된 목록을 결정한 이유 였지만 당신의 대답에서 1 절을 깨닫지 못했습니다. 다시 thx – tsusanka