2011-02-11 5 views
1

POSIX 대기열에서 메시지를받을 때 어떻게 메모리를 절약합니까?POSIX 대기열에서 메시지를받을 때 어떻게 메모리를 절약합니까?

다중 프로세스/다중 스레드 환경에서 POSIX 대기열을 사용할 때 max_msgsize보다 작은 버퍼로 메시지를 대기열에서 안전하게 제거하는 방법은 없습니다.

표준이 문제에 대한 해결책이 있습니까? 아니면 문제 일까?

다른 훌륭한 라이브러리가 있음을 잘 알고 있지만, 종속성을 다루지 않으려는 사용자를 위해 완전히 표준적인 솔루션을 포함하고자했습니다.

참고 : 저는 메시지 당 잠재적으로 수백 메가 바이트를 대기열에 넣고 처리를 위해 메시지를 대기열에서 제거하는 여러 스레드가있는 프로세스 풀이 있습니다.

덕분에, Chenz

+0

왜 액세스를 보호하기 위해 세마포를 사용할 수 없습니까? 아마 나는 그 질문을 이해하지 못한다. – frankc

+0

큐에있는 다음 메시지의 크기를 쿼리 할 방법이 없으므로 메시지에 허용 된 최대 크기와 동일한 버퍼를 할당해야합니다. –

+0

감사합니다. 이제는 이해합니다. – frankc

답변

2

POSIX 및 큐 인터페이스는, 당신은주의, 당신은 메시지의 크기를 조회 할 수 없습니다.

사실상 모든 메시지는 대기열 정의에 의해 구성된 최대 크기 일 수 있으므로 간단한 구현으로 쉽게 기록을 유지할 수 있다고 가정해야합니다.

말하듯이 멀티 메가 바이트 메시지를 처리하는 경우 이러한 메시지를 대기열에 넣는 것이 좋은 해결책이 될 수는 없습니다 (불행히도).

메시지 속도가 낮 으면 (어떤 정의로 낮은) 일부 합리적인 상한선이 있다면 실제로 시도해보십시오.

다음으로는 대기열을 작업 주문 대기열로 사용하고 작업 항목 대기열로 사용하지 않는 것이 좋습니다. 작업 항목은 다르게 파일에 저장해야합니다. 그런 다음 대기열에있는 짧은 파일 이름을 사용하여 처리 할 작업 항목의 위치를 ​​가리 킵니다.

행운

+0

제안 해 주셔서 감사합니다. 필자는 POSIX 인터페이스가 "큐잉"작업을 수행 할 수있게하는 아이디어를 좋아하지만 대기중인 것은 단순히 참조 일뿐입니다. –

0

나는이 작업을 수행 할 정말 좋은 방법이 없다 생각합니다. 여기에 아이디어가 있지만 잠금 경합으로 인해 성능이 크게 나빠질 것입니다.

최대 메시지 크기와 동일한 하나의 정적 버퍼가 있습니다. 공유 버퍼가 있기 때문에, 지금 디큐 과정은 다음과 같이해야합니다

  • 잠금 sempaphore
  • 디큐 정적 버퍼에
  • 그림 메시지의 실제 크기에서
  • 사본을 정적 버퍼 메시지의 실제 크기 스레드 로컬 버퍼
  • 를 갖는 오버 헤드가 해제 세마포어

정적 버퍼를 사용하지만 메시지 크기 분포를 조정하면 전체 메모리 사용량이 줄어들 것입니다. 그러나 이제 정적 버퍼에 대한 경합을 처리해야합니다. 특히 몇 개의 큰 메시지가 연속적으로 도착할 때 크게 작용할 수 있습니다.매우 큰 메시지가 드물다면 이것은 끔찍한 해결책이 아닐 수도 있습니다.

+0

로컬 스레드 버퍼가 잠재적으로 스택 오버플로가되지 않습니까? –

+0

"스레드 로컬 버퍼"라고 말하면 범위가 현명한 것입니다. 그 스택에있는 유일한 것은 동적으로 할당 된 메모리를 가리키는 포인터 일 수 있습니다. – frankc

관련 문제