2012-06-07 3 views
2

나는 소켓을 통해 작동하도록 의도 된 메시지 큐를 작성하고 있으며, 큐 공간을 사용자 공간에두고 큐를 각각의 소켓으로 배출시키는 스레드를 갖고 싶습니다.가변 크기의 청크를 std :: queue에 저장 하시겠습니까?

메시지 (4 및 4K 바이트 아마 사이) 메모리의 작은 모양이 될거야, 그래서 끊임없이의 malloc() 보내고 메모리를 피할 생각하는 것은 분열을 피하기 위해 필수입니다.

작동 모드는 사용자가 전송 (MSG) 같은 것을 호출 메시지가 다음 큐 메모리에 복사하고 편리한 시간에 소켓을 통해 전송되는 것이다.

제 질문은 가변적 인 크기의 데이터 덩어리를 std :: queue 나 std :: vector 같이 저장하는 "좋은"방법인가요? 아니면 메모리를 모으는 경로를 따라야할까요? 수영장에서 풀어 내 자신의 배정을 처리할까요?

답변

3

, 당신의 대기열에 {start pointer, length}의 버퍼로 청크에서 데이터를 저장 쌍을 복사합니다. 청크는 소비되는 순서대로 할당되기 때문에 중첩 여부를 확인하는 수학은 비교적 간단해야합니다.

메모리 할당 자 요즘 꽤 좋은되고있다, 그래서 "일반"할당 기반으로하는 솔루션은 비슷한 성능을 보였다 경우 나는 놀라지 않을 것이다.

+0

나는 이것이 최고라고 생각한다. 나는 내 머리 속에서 어떻게 든 대기열에있는 메시지를 구분해야하지만, 나는 네가 말하는 것을 할 수있다. 그리고 그것은 확고한 최대 크기가 내 메시지를 결정했다. 크기. –

1

당신은 Boost.Pool에 메모리 풀 부담을 위임 할 수 있습니다. 당신은 큰 원형 버퍼를 만들 수 있습니다

+0

내가 사용할 수있는 제 3 자 코드가 제한 될 수는 있지만, 조사해 보겠습니다. 감사합니다! –

1

4K 미만인 경우 조각화가 전혀 없을 수 있습니다. 당신은 당신의 애플리케이션을 실행할 OS를 언급하지 않았지만 Linux 나 Windows의 경우에는이 크기의 블록을 처리 할 수 ​​있습니다. 적어도 자신의 풀을 작성하기 전에 이것을 확인할 수 있습니다. 당신이 대기중인 데이터 패킷의 많은을 기대하지 않는 한 나는 아마 (말) 8K 각에 예약으로 vector<char>의 풀을 만들 것, question about small block allocator

+0

4K가 넘으면 놀랄 것이고, 나는 그것을 꽤 쉽게 어렵게 만들 수 있습니다. 나는 이것을 리눅스에서 돌릴 것이다. –

+0

이 경우 TCMalloc을 사용하여 응용 프로그램을 테스트하고 아무것도 작성하기 전에 조각화가 있는지 확인하는 것이 좋습니다. –

0

: 예를 들어이 질문을 참조하십시오. 패킷 처리가 끝나면 벡터를 버리거나 다시 사용하지 말고 재활용하십시오 (다시 사용할 준비가 된 풀에 다시 넣으십시오).

패킷이 4K를 초과하지 않을 것이라고 확신하는 경우 분명히 8K가 아닌 4K로 줄일 수 있습니다. 그러나 장기 실행 프로그램이라고 가정 할 때 재 할당을 최소화하는 것보다 더 많은 이득을 얻을 것입니다 개별 벡터의 크기를 최소화하는 것에서.

확실한 대안은 그냥 메모리 블록을 재사용하는 대신 벡터를 재사용하고, 그래서 할당 자 수준에서이 문제를 처리하는 것입니다. 이렇게하면 메모리 사용을 조금 더 쉽게 조정할 수 있습니다. 나는 여전히 블록을 미리 할당 할 것이지만 단지 64 바이트, 256 바이트, 1K, 2K, 4K (그리고 아마도 8K)와 같은 몇 가지 크기 만 할당 할 것이다.

+0

나는 주어진 시간에 최대 수천 개의 메시지가 대기 할 것으로 예상하고, 각각 소수의 바이트 만 있다면 각 메시지에 대해 4K를 할당하는 것이 낭비스러운 것처럼 보입니다 ... –

관련 문제