21.02.13 11:08 작성
·
215
0
다름이 아니라
영상의 27분 50초 쯤
SendBuffer에 대해서
C++일경우에 레퍼런스 카운트를 이용해서 0이라면 풀에 반환한다고 말씀하셨는데요.
C#에서도 아래처럼
1) 가능한 부분이 아닌가 싶어서 궁금해서 질문드려봅니다
TLS 환경에 일정량의 SendBuffer Pool을 만들어 놓고
TLS환경에는 싱글스레드 처럼 하나의 스레드만 접근이 가능하므로 SendBuffer.Open시에
SendBuffer에 FreeSize가 reserveSize보다 크면
Pool에 반납을 하고 새롭게 미리 할당된 메모리를 가져오고 기존 메모리를 초기화해서 다시 풀에 넣는방식이라면
가능하지 않을까 싶은데 어떻게 생각하시는지 궁금합니다
추가질문 입니다.
2) 아래와 같은 이유로 SendBuffer를 새로 할당한 것인가요?
C++의 레퍼런스 카운트를 이야기한 부분이
혹시Send시에 SocketAsyncEventArgs의 BuffList에 ArraySegment값들이 들어가고(원본의 참조형태로 들고 있기 떄문에)
그걸 Socket.SendAsync에서 호출하게 되는데
커널단에서 실제 Send 처리 이후의 메모리의 레퍼런스 카운트 시점을 알아야
정확히 풀로 반환할 수 있기 때문인건가요?
위와 같은 문제라서
SendBuffer는 새로 할당하는 방법을 선택하신건지도 궁금합니다
3) C#에선 풀은 세션 별로 버퍼 풀방법 뿐인건가요?
결국 레퍼런스 카운트 때문이라도
C#에선Pool을 활용하려면 결국 세션 단위로 버퍼풀을 만들어서 사용하는 방법뿐일까요?
답변 2
0
0
2021. 02. 13. 16:21
1+2)
답은 2에서 말씀하신 내용이 맞습니다.
1에서 말씀하신대로 처리할 수 없는 이유는
SendAsync 완료 자체가 언제될지 알 수 없기 때문입니다.
어떤 이유로 클라에서 Recv가 지연된다면,
그 동안에는 버퍼를 그대로 유지해야 하기 때문에
함부로 Pool에 반납할 수 없습니다.
3)
세션 단위의 Buffer Pool의 개념이 아니라,
세션 별로 Buffer를 두는 것입니다.
Buffer Pooling을 할 수 없는 이유는 2와 같습니다.
단 이렇게 세션 별로 버퍼를 둘 경우,
동일한 패킷을 100명한테 쏴주기 위해서
100명의 Buffer에 일일히 복사를 해주는 비효율적인 복사가 일어나게 됩니다.