해결된 질문
작성
·
37
·
수정됨
1
루키스님 안녕하세요?
기존 SendBuffer.cs는 메모리 누수 이슈 등으로 삭제하고
새로운 기법을 알려준다고 말씀해주셨는데
그게 최종적으로 ClientSession.cs의 Send()함수가 되는게 맞을까요? (아래 코드블록)
맞다면 Send()가 호출 될 때 마다 버퍼를 새로 생성하기 때문에
SendBuffer.cs의 강점이었던 하나의 거대한 메모리를 사용하면서 버퍼 생성 및 Copy가 줄어드는 이점이 없어진 걸로 이해가 됐는데,
기존의 SendBuffer.cs와 새로운 대체된 Send()의 장단점이 각각 궁금합니다.
ClientSession.cs
public void Send(IMessage packet)
{
string msgName = packet.Descriptor.Name.Replace("_", string.Empty);
MsgId msgId = (MsgId)Enum.Parse(typeof(MsgId), msgName);
ushort size = (ushort)packet.CalculateSize();
byte[] sendBuffer = new byte[size + 4];
Array.Copy(BitConverter.GetBytes((ushort)(size + 4)), 0, sendBuffer, 0, sizeof(ushort));
Array.Copy(BitConverter.GetBytes((ushort)msgId), 0, sendBuffer, 2, sizeof(ushort));
Array.Copy(packet.ToByteArray(), 0, sendBuffer, 4, size);
Send(new ArraySegment<byte>(sendBuffer));
}
답변 1
1
장점 : 필요한 만큼 메모리를 할당해서 사용
단점 : 매 번 마다 할당해야 함
~입니다.
고전적인 메모리 풀링을 사용하면 큰 덩어리를 만들어서 필요할 때마다 쪼개 사용하는 개념인데요.
하지만 C++과 다르게 C#에선 자유로운 RefCount 및 메모리 관리가 힘들어서
사용한 메모리 하나라도 사용중이면 반납이 안 되면
또 MemoryChunk를 할당해야 하므로 살짝 지저분하긴 하죠.
그래서 4강 강의에서 사용하던 방식은 요렇게 수정된 것입니다.
시간 내서 답변해주셔서 정말 감사합니다!