RegisterSend를 하나의 스레드만 수행하는 이유가 궁금합니다.
375
작성한 질문수 18
답변 1
3
네 WsaSend가 쓰레드 안전하지 않은 이슈도 있고요.
다만 Recv/Send 모두 하나의 쓰레드만 수행할 수 있느냐?는 애매한 문제입니다.
Recv의 경우에는, 확실히 1개의 클라에서 데이터를 보내니 굳이
단일 Session에 대해 멀티쓰레드로 Recv 처리할 이유가 없습니다.
Send의 경우에는, 비록 WSASend를 락잡고 한 번에 하나씩만 하는 것은 맞지만
이전에 보낸 Send가 완료되기 전에 또 Send를 할 수 없느냐? 는 논란의 여지가 있는데
컨텐츠를 만들다보면 이리 저리서 동일한 Session에 대해 Send를 할 일이 생기기 때문이죠.
이전에 Send한 데이터가 다 전송되지 않았을 때 대기를 타야 한다면
반응 속도에서 조금 손해를 보지만, MMO처럼 아주 많은 Session에 대해 처리가 수월해집니다.
그러면 데이터 처리가 완료되어 OnSendCompleted가 호출될 때 그 사이 추가로
요청된 Send 데이터가 있는지 판별해서 또 전송하면 되겠죠.
반대로 이전에 Send한 데이터가 다 전송되기 전에도 또 Send가 가능하다면,
반응 속도에서 이점이 있지만, 반대로 네트워크 7 Layer상의 헤더 정보가
덕지덕지 붙는 것을 감안하면 최고의 효율성은 보이지 못할 수도 있습니다.
그리고 SendEvent를 1개만 두면 안되고 보낼때마다 새로 만들야 합니다.
1
얕은 질문에도 상세하게 답변해주셔서 정말 감사드립니다..! 정말 죄송하지만 말씀해주신 Send한 데이터가 다 전송되지 않았을 때 대기한다는 방식이 이번 코드의 방식이라고 이해하면 될까요? SendQueue에 삽입만 하고 실질적인 Send는 하나의 스레드가 수행하도록 한 후 나머지는 대기함으로써 반응성은 조금 떨어질 수 있어도 Session 처리가 수월해진다. 제가 이해한게 맞는지 궁금합니다.. ㅎㅎ
저 그리고 또 궁금한게 지금 방식보다 반응이 빠른 방식이 있을지 궁금합니다. 지금처럼 하지 않는다 해도 WSASend에는 결국 동기화 처리를 해야 되는데 지금만큼 예쁜 다른 방식이 있는지 궁금합니다.
1
얕은 질문에도 상세하게 답변해주셔서 정말 감사드립니다..! 정말 죄송하지만 말씀해주신 Send한 데이터가 다 전송되지 않았을 때 대기한다는 방식이 이번 코드의 방식이라고 이해하면 될까요?
-> 네 잘 이해하셨습니다.
저 그리고 또 궁금한게 지금 방식보다 반응이 빠른 방식이 있을지 궁금합니다.
-> WSASend 호출은 Lock을 걸고 하는 것까지는 어쩔 수 없지만,
SendQueue를 두지 않고 보내는 족족 WSASend로 바로 때려주는 방식이 있습니다.
(SendEvent도 보낼때마다 새로 생성)
0
감사드립니다 ! 저 그리고 혹시 비동기 입출력 시에 overlapped 구조체와 더불어서 wsabuf는 입출력 완료시까지 보존해야 돼서 지역변수로는 잘 쓰지 않는다고 들었는데 문제가 없는지 궁금합니다. sendbuffer가 레퍼런스 카운팅이 되니까 WSABUF 자체는 문제가 없는 것인가요? 한번에 질문드린다는게 자꾸 따로 따로 올려서 정말정말 죄송합니다 ㅠㅠ
1
버퍼는 절대 건드리면 안 되고 유지시켜줘야 하지만,
wsabuf는 상관없습니다. (wsabuf.buf가 중요)
강의에선 힙영역에 올라와 있는 버퍼를 쪼개서 sendBuffer로 사용하고,
입출력 완료까지 유지되도록 RefCount 관리를 해주고 있기 때문에
버퍼의 안전성이 보장됩니다.
writeLock을 잡을때 꼭 empty 상태여야하는 이유?
0
65
2
Memory Pool에서 오버플로우 질문입니다.
0
94
2
포토폴리오 및 진로 관련하여 고민입니다.
0
174
1
포토폴리오 관련 고민입니다.
0
91
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
108
2
성능 테스트 결과
0
117
2
게임 서버 Stateful, Stateless 진로 고민
0
147
1
WaitOnAddress와 Sleep의 차이 질문
0
100
1
궁금한거 있습니다.
0
92
2
JobTimer 구동 스레드
0
116
2
TryPop() 동작 관련 질문
0
87
1
로드맵 C#서버 C++서버 방향성 질문
0
162
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
81
1
생명주기를 위한 의도적 복사
0
95
2
락프리의 실무에서 사용 질문
0
154
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
110
2
mutex와 sleep 차이점
0
133
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
167
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
102
1
공부법 관련해서
0
190
2
MakeShared 함수 관련
0
119
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
152
2
운영체제관련 질문입니다
0
145
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
125
2





