2013-04-26 2 views
3

각 프로세스가 동일한 데이터를 메모리에로드하는 오래된 C++ 프로젝트로 작업해야합니다. 이것은 읽기 전용이며 각 프로세스는 정확히 동일한 데이터 사본을 가지고 있습니다. 늦게 서비스가 실행되는 시스템을 쓰러 뜨리기 시작했습니다.시간이 지남에 따라 확장 될 수있는 공유 메모리 영역을 만들려면 어떻게해야합니까?

나는 이것을 변경할 수있는 방법을 평가하고 있었고, boost interprocess 라이브러리가 나의 사용 사례에 잘 맞다고 생각했다. 내가 고려한 또 다른 사항은 외부 데이터 저장소를 사용하는 것이지만 대기 시간 때문에 사용하지 않을 것입니다.

나는 boost apis를보고 공유 메모리 영역의 크기를 지정해야 할 것 같습니다. 필자의 경우 시간이 지남에 따라로드해야하는 데이터의 양이 커지면 일정하지 않습니다. 이 공유 메모리의 크기를 조정할 수 있습니까?

유사한 상황에서 boost interprocess과 관련된 문제 또는 대안에 대한 제안을 자유롭게 제안하십시오.

+0

그렇게 할 수는 없지만 공유 메모리를 사용하는 프로세스가 어떻게 성장했는지 알 수 있습니까? 더 많은 공간이 필요할 때 여러 지역을 사용하고 더 많은 지역을 추가 할 수 있습니까? 나는 이것에 대한 "boost"라이브러리에 익숙하지 않아서 말할 수 없다. –

+0

@MatsPetersson 가장 간단한 경우,'size'와'capacity'를 기록한'vector'와 비슷한 것을 사용할 수 있습니다. –

+0

데이터를 사용하는 응용 프로그램에서 "성장했는지 확인"하거나 일부 필요합니다. 나는 여전히 여러 가지 가능한 해결책이 있다고 생각하는데, 모두가 공유 영역의 크기를 "성장"시키는 것과 관련이있는 것은 아닙니다. –

답변

1

공유 메모리의 크기를 조정하려면 shmctl (cmd=SHM_SIZE)을 사용할 수 있습니다.

이렇게 할 때주의해야합니다. 크기를 줄이고 다른 프로세스가 크기를 초과하여 메모리에 액세스하면 SIGBUS 신호를 받게됩니다.

또 다른 문제점은 다른 프로세스에게 공유 메모리의 크기가 조정되었음을 알리는 방법입니다. 나는 당신이 메시지 대기열, 또는 다른 IPC 메커니즘을 사용할 수 있다고 생각한다.

+0

이 작업은'boost'에서도 가능합니까? – nikhil

+1

@nikhil 의견이 없습니다. 그것이 shared_memory_object :: truncate 메서드를 사용하여 크기를 설정하는 것을 볼 수 있지만 공유 메모리의 크기를 조정할 수 있는지 확실하지 않습니다. 또한 읽기 전용 공유 메모리 객체의 크기가 생성자에 전달됩니다. 개체를 다시 만들어야합니다. –

+0

오케이, 영역을 쓸 수있는 경우에만자를 호출해야합니다. 고마워, 나는'shmctl'에 대해서도 읽을 것이다. – nikhil