작성
·
477
·
수정됨
0
질문 1. TLS로 SendBuffer를 스레드별 전역변수로 지정했으면, SendBuffer 멤버필드인 buffer도 스레드별 전역변수가 아닌가요?
그런데 왜 _buffer는 공유자원처럼 다수의 스레드가 참조하는 건가요?(28:39 부분)
질문 2. 만약 _buffer는 TLS 여도 다수의 스레드가 볼 수 있다고 쳐도, 어차피 Send하는 부분은 그 스레드가 넣은 부분만(handler에서 close로 보내준 segment영역) 보내주기때문에 상관없는 것 아닌가요? (하지만 애초에 질문 1이 이해가 안됩니다.)
질문 3.
이전에 Session#2 강의 시작부분에 설명해주신 내용에서,
SEssion의 receive는 OnRecvCompleted()메서드에 여러 스레드가 동시다발적으로 들어가는 경우는 없다. 라고 하셨는데, 해당 강의에서는 어떤 이유로 멀티스레드를 생각해야 하는 상황이 된건지 궁금합니다.
질문 4.
Session 객체는 connect되는 client당 하나씩이니까 client와 연결 될 때 마다 새로운 session객체가 생성되어 다 따로 만들어지는 것이기 때문에 애초에 _sendQueue도 스레드별로 따로 아닌가요?
질문 5. _buffer는에서 읽기만 하는거니까..(30:03) 라고 하셨는데 읽는 부분이 어느부분인지, deq하는것을 읽는것이라고 표현하신건가요?
어떤 경우들을 말슴하시는건지 이해가 안되어 헷갈리는게 많습니다. 일단 질문은 더 있지만, 대표적인 질문들로 올려봅니다
답변 1
0
우선 모든 질문을 일일히 답변 드릴 여력이 없기 때문에
QnA 게시판은 모르는게 있으면 바로 질문하는 용도의 게시판이 아닙니다.
저어어엉말 심사숙고해서 아주 오랫동안 고민해도 해결이 안 되는 부분들만 답변 드릴 수 있습니다.
TLS는 쓰레드 별로 고유하게 접근하지만,
TLS에 있는 것이 참조값이고 그 참조값은 Heap 영역에 할당된 객체라면
(그리고 해당 객체의 참조값을 다른 곳에서도 참조한다면)
TLS에 변수가 있다고 안전한 것은 아닙니다.
Recv랑 Send는 본질적으로 다릅니다.
Recv는 1 클라당 처리하는 쓰레드가 1개만 있을 수 있고요,
낚시대에 비유를 하면 낚시대 1개만 던지면 1개만 끌어올릴 수 있는 것과 유사합니다.
(RegisterRecv는 한번만 하고, 처리 완료된 다음 다시 Register 함)
Send는 그렇지 않고 Broadcasting이나 다양한 상황에서 동시 다발적으로 보낼 경우가 생깁니다.
이 부분은 지금 와닿지 않으면 나중에 part7 컨텐츠를 만들다 보면 감이 옵니다.
SendQueue는 Session마다 1개는 맞지만
역시나 해당 큐에 넣는 SendBuffer는 여러 Session에 동일한 애를 밀어넣을 경우가 생깁니다.
채팅 패킷을 주변에 있는 100명의 유저한테 쏴줘야 한다면,
동일한 패킷을 100번 만들어서 일일히 SendQueue에 넣어주기 보단
한 번만 만들고 참조값을 100명한테 꽂아주는게 합리적이기 때문입니다.
저도 처음 공부할 때 같은 책을 20번씩 반복해서 돌려보고 고민해보면서 터득한 것들이라
한 번에 이해하는게 사실상 불가능합니다.
더 여유있게 모든걸 한 번에 이해하려 하지 마시고
어차피 Part7에서 연동 작업을 하면 보이는 것들이 많습니다.