인프런 커뮤니티 질문&답변

elias님의 프로필 이미지
elias

작성한 질문수

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

윈도우에서 어댑터 정보 확인 방법 (예제 포함)

TCP/IP vs UDP , 멀티 스레드에서의 병목 현상에 대한 질문이 있습니다!

해결된 질문

작성

·

16

·

수정됨

0

안녕하세요! 항상 좋은 강의 감사합니다.

강의를 듣다가 궁금한 점이 있어서 질문을 드립니다!

Q1.

TCP/IP 의 경우 서버 입장에서 사용자가 연결되어 있다는 착각에 빠지지 말라고 알려주셨습니다. 하트비트를 어차피 보내줄 것이라면 UDP 로 설계를 해도 상관없는 건가요?
연결을 신뢰할 수 없음에도 TCP/IP를 사용하는 이유가 궁금합니다.

Q2.

멀티 스레드 환경에서 GQCS를 할 경우, 스레드들이 공유하는 큐에 락을 걸어서 적용해봤습니다. 하지만 이 경우 큐에 접근할 때 병목 현상이 우려됩니다. 해당 세션이 특정 스레드에서만 처리되도록 하여 락을 없애는 것과 락을 걸고 여러 스레드에서 접근할 수 있도록 하는 것 중 어느 것을 선호하시나요?

 

Q3. 어쩌면 Q2와 거의 같은 질문일 수도 있겠습니다. 멀티-스레드 환경에서 락 에 대한 대안이 있나요?

 

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

좋은 세상이네요. 우선 인프런 AI 답변도 참고하시라는 말씀을 드리겠습니다.

 

  1. 네, 상관 없습니다. 게임쪽에서 UDP를 사용하는 이유는 매우 명확합니다. 모든 데이터를 수신하지 않아도 되는 환경에서 TCP는 생각보다 거추장스럽기 때문입니다. 예를 들어 캐릭터의 이동 정보의 경우 10개 중 1~2개를 누락한다 하더라도 껄끄럽게 캐릭터가 몇 번 워프 하는 듯 움직이는 것으로 처리해 동기화를 맞춰 주는 것이 좋겠습니다. 안타깝지만 TCP는 단 하나라도 빠뜨리지 않으려 느린 속도로 하향 평준화 합니다. 결국 느린 하나에 빠른 나머지 모두가 맞춰야 하는 불상사가 발생합니다.

    그렇다고 UDP까 능사는 아닙니다. 게임내 결제를 비롯해 아이템 획득이나 구매 등 절대 놓쳐서는 안되는 내용들은 TCP로 전송해야 합니다. 결재가 1~2초 느려지는 건 참을 수 있는 일이지만 결재처리가 누락되는 일은 대형 사고로 이어집니다. 차라리 연결이 끊겨 결제 진행이 처음부터 불가능한 편이 더 낫겠습니다.

  2. 네, 맞습니다. 그래서 Lock-free queue를 만들어 사용하는 경우가 대부분입니다. Spin lock이든 Mutex든 동기화 비용이 필요합니다. 그런데 그걸 최소화 할 수 있는 가장 좋은 방법은 적어도 현재까지는 Lock-free 자료구조를 사용하는 것입니다.
    그와는 별개로 사용자별 처리를 담당하는 스레드가 일정 시간 이상 오래도록 처리에 묶인다면 시스템 전체의 처리 지연으로 이어질 가능성이 높아질 것입니다. 구조적으로 대안이 필요할 것입니다.
    물론 정답은 없습니다. 시스템 마다 상황이 천차만별일 것이기 때문입니다.

     

  3. 2번 답변에 포함된 것 입니다.

     

참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다. elias님께서 질문하신 내용을 토대로 답변을 드리겠습니다.

Q1. TCP/IP vs UDP에 대한 설계

TCP/IP의 경우 연결 지향적이며 신뢰성을 제공합니다. 예를 들어 데이터의 순서 보장, 손실 복원 기능이 자동으로 처리됩니다. 연결이 신뢰할 수 없더라도 TCP/IP를 사용하는 이유는 이러한 신뢰성과 안정성을 보장받기 때문입니다. UDP는 비연결 지향적이고 신뢰성을 보장하지 않지만, 빠른 속도와 실시간성이 요구되는 응용 프로그램(예: 스트리밍)에 유리합니다. 하트비트를 통해 상태를 지속적으로 확인하는 경우, UDP를 사용하여 효율성을 높일 수도 있지만, 애플리케이션의 요구사항에 따라 TCP의 안정성을 선택할 수도 있습니다.

Q2. 멀티 스레드 환경에서 병목 현상

GQCS(Windows의 IOCP를 이용한 비동기 I/O 처리)를 사용하는 환경에서 병목 현상을 줄이는 방법은 설계에 따라 달라질 수 있습니다. 특정 스레드가 특정 세션을 처리하도록 고정하여 락을 줄이는 방법이 있을 수 있습니다. 그러나 이 경우 스레드 간의 작업 부하가 고르게 분배되지 않을 수 있습니다. 반면, 락을 사용하면 병목은 있을 수 있으나, 작업 부하가 보다 균등하게 배분될 가능성이 높습니다. 일반적으로 병목 현상을 줄이려면 락의 범위를 최소화하고, 예상되는 회전율을 고려하여 설계해야 합니다.

Q3. 멀티-스레드 환경에서 락에 대한 대안

락을 줄이려는 시도를 하고 있는 경우, 락 프리(lock-free) 알고리즘을 고려할 수 있습니다. 락 프리 알고리즘은 성능 향상 및 데드락 방지를 위해 고안되었으며, 대개 스핀락 등 반복적인 검사를 통해 큐에 접근합니다. 또한, 스레드 로컬 스토리지(Thread Local Storage)를 사용하여 각 스레드가 고유한 데이터를 갖고 병목 현상을 줄일 수 있습니다.

https://www.inflearn.com/questions/884274 - [TCP/IP 및 네트워크 프로그래밍에 관련된 질문] - TCP와 UDP의 차이점 및 사용 시나리오에 대한 기존 답변을 참고하시길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

elias님의 프로필 이미지
elias

작성한 질문수

질문하기