패킷송신으로 인한 Memory Fragmentation

3권에서 새로 도입된 네트웍 및 멀티플레이어 프로그로그래밍 섹션을 위한 게시판입니다.

Moderator: 류광

Locked
비회원

패킷송신으로 인한 Memory Fragmentation

Post by 비회원 »

안녕하세요. 서버를 제작해보려고 하다가 궁금한것이 있어
질문드립니다.

이런식으로 패킷을 new나 malloc으로 메모리를 안잡고
보내는 경우에도 나중에 memory fragmentation이 일어날 수 있나요?

패킷 변수가 스택메모리로 잡혀서 힙 메모리 문제가 안생길것 같은데
서버관련 책들을 보니 링버퍼 같은것들을 쓰더라구요. 문제가 없다면
굳이 링버퍼를 따로 쓰지 않았을텐데 하는 생각이 들어서 말입니다.

그리고 밑에 멀티패킷은 여러 패킷을 하나로 묶는 건데
로컬변수의 버퍼에다가 이어붙여서 보내는 식입니다.
예전의 프로젝트에서는 이런건 다 메모리로 잡아서 했던 기억이나서
이렇게 해도 괜찬은건지..(되기는 됩니다만 나중이 찝찝)

고수님들의 조언부탁드립니다.

Code: Select all


struct _PACKET_ {
    unsigned short _id;
    int _data;
};


void Test()
{
    _PACKET_ packet;
    packet._id= 1;
    packet._data= 777;

    NetworkLib->SendPacket(packet, sizeof(_PACKET_));
}

void Test2()
{
    _PACKET_ packet;
    packet._id= 1;
    packet._data= 777;

    _PACKET_ packet2;
    packet._id= 10;
    packet._data= 7770;

    _MULTIPACKET_ multipacket;
    char buffer[1024];
    multipacket.AddPacket(buffer, packet);
    multipacket.AddPacket(buffer, packet2);
    
    NetworkLib->SendPacket(multipacket, multipacket.GetSize());
}

나디아
Posts: 102
Joined: 2004-08-07 11:36

Re: 패킷송신으로 인한 Memory Fragmentation

Post by 나디아 »

비회원 wrote: ...
패킷을 new나 malloc으로 메모리를 안잡고
보내는 경우에도 나중에 memory fragmentation이 일어날 수 있나요?
...
SendPacket의 구현 방법에 따라 여러가지 상황이 발생될 수 있는 상황이네요.

1. 함수가 바로 리턴되지 않으며, 모두 전송을 해야 완료되는 Blocking된 SendPacket 이고

넘겨진 인자를 바로 사용해서 전송을 처리 한다면, 이미 스택에 잡힌 메모리이기 때문에 문제가 없습니다.

그러나 런타임에 스택을 할당하지 못하면 오류가 발생하겠지요.

2. 전송 완료 여부와 상관없이 바로 리턴되는, ASync로 호출되는 SendPacket이면 반드시 넘겨온 인자에 해당

하는 메모리 만큼 복사를 하고 처리를 해야 되기 때문에 그 넘겨온 메모리를 어떻게 복사 하고 관리하느냐에

따라서 우려 하시는 fragmentation 상황이 발생할 소지가 있습니다만(실제로 가능성은 적습니다)

보통 이런 메모리는 memory pool을 사용하면 우려를 불식할 수 있습니다.

그럼 좋은날 되세요~ ^^

/나디아
^___^
Image
블루
Posts: 80
Joined: 2007-10-04 10:56

Post by 블루 »

1. memory fragmentation은 heap에서 allocation하는 경우에만 발생하며 stack상에 잡힌 경우 발생하지 않습니다.

2. 만약 SendPacket에서 내부적으로 overlapped socket을 사용하여, 제공된 buffer를 복사하지 않고 사용하는 경우가 아니라면 buffer 관련 문제는 없습니다.

3. 1KB를 stack에 잡는 것이 과하다고 판단하여 heap allocation했을 수도 있으나 1MB의 default 최대 stack size를 고려하면 대부분의 경우 문제는 없습니다.
단, 다수의 resursive call의 가능성이 있거나 function depth가 과도하게 깊게 들어가는 경우, 또는 강제 inline expansion되는 경우등이라면 stack overflow의 가능성이 있으므로 주의하여야 합니다.
Locked