CS/네트워크
이상적인 스레드 풀의 적정 크기에 대하여, 스레드 풀 크기 공식, 리틀의 법칙
스레드 풀의 크기를 적절히 설정해야 하는 이유 스레드를 생성하는 것은 비용이 드는 작업이다. 플랫폼마다 오버헤드는 다르지만, 스레드가 생성될 때 요청이 처리되는 지연시간(latency)과 OS에 의한 추가적인 처리 과정에 드는 시간 등 자원이 소모된다. 이러한 스레드 생성 비용을 줄이기 위해 스레드 풀이 필요하다. 스레드 풀에서 미리 생성해둔 스레드를 재사용함으로써 자원 낭비를 막을 수 있기 때문이다. 단, 스레드를 많이 생성해둔다고 그 스레드를 다 사용할 수 있는 것은 아니다. 쓸데없이 스레드를 많이 생성한다면 생성하는 데에 드는 자원과 비용이 낭비된다. 그렇다고 스레드를 부족하게 만들어둔다면 CPU 사용률이 낮아지게 될 것이다. 따라서 스레드 풀의 크기를 적절히 설정하는 것은 매우 중요한 일이다. 하..
멀티 스레드(Thread)의 장점과 문제점
쓰레드(Thread)의 개념 쓰레드는 프로세스를 여러 개로 나눈 조각과 갖다고 설명할 수 있다. 워드를 사용하는 경우를 예로 들자. 워드에서 글자를 입력하는 동안 파일을 주기적으로 자동저장하고, 내용을 프린터에 출력하고 있고, 입력하는 동안 자동으로 맞춤법 검사를 수행한다. 사용자의 입력을 받는 동안 행하는 이 모든 작업들은 각각의 쓰레드에 의해서 이루어진다. 글자를 입력 받는 쓰레드, 파일을 디스크에 저장하는 쓰레드, 출력할 내용을 프린터에 보내는 쓰레드, 입력하는 동안 맞춤법 검사를 수행하는 쓰레드 등이 있다. 즉, 워드라는 큰 프로세스 하나에 여러 개의 쓰레드가 모여있는 것이다. 실제로 프로세스는 하나의 어드레스 공간을 갖고 있고, 모든 응용 프로그램은 메인 응응 프로그램을 위한 하나의 쓰레드를 갖..
데드 레커닝 - 온라인 게임의 이동처리 기법
현재 3D 온라인 게임 프로젝트에서 게임서버를 제작하면서 미처 예상하지 못한 부분에서 많은 문제들이 있다 그 중 캐릭터의 이동처리 부분이고 해결해 나가면서 큰 도움이 되고 있다. 사용자가 키보드를 이용한 방향키 입력으로 이동 패킷을 서버에 보내주고 그것을 서버에서는 브로드캐스트로 뿌려주는 가장 기본적이고 간단한 방법이 있지만 60프레임으로 돌아가는 게임이라고 한다면 1초에 60번이나 이동에 대한 패킷을 보내고 받게 됨으로 엄청난 서버 부하를 가져오게 된다. 이를 해결하기 위해선 기존 상태를 계속 유지하고 있다면 일정한 규칙을 가진 행동을 반복하고 있을테니 패킷을 보내지 않고 같은 처리를 계속 하도록 하고, 상태의 변화가 있을때만 패킷을 보내서 상태변화를 알리게 되면 서버는 이를 브로드캐스트하여 다른 클라..
Select 모델
Select 모델은 select() 함수가 핵심 역할을 한다는 뜻에서 붙인 이름이다. Select 모델을 사용하면 소켓 모드(블로킹, 넌블로킹)에 관계없이 여러 소켓을 한 스레드로 처리할 수 있다. Select 모델의 동작 원리 Select 모델을 사용하면 소켓 함수 호출이 성공할 수 있는 시점을 미리 알 수 있다. 따라서 소켓 함수 호출 시 조건이 만족되지 않아 생기는 문제를 해결할 수 있다. 소켓 모드에 따른 Select 모델의 사용 효과는 다음과 같다. 블로킹 소켓(blocking socket): 소켓 함수 호출 시 조건이 만족되지 않아 블로킹되는 상황을 막을 수 있다. 넌블로킹 소켓(nonblocking socket): 소켓 함수 호출 시 조건이 만족되지 않아 나중에 다시 호출해야하는 상황을 막을..
Reliable Data Transfer RDT란?
RDT는 신뢰성 있는 데이터 교환을 의미한다. 즉 송/수신하는 데이터가 오류 없이 온전히 전송되는 것을 뜻한다. Transport Layer(전송계층)에서는 신뢰성 있는 데이터 교환을 하고 싶어 하지만, 하위 레이어들에서는 신뢰성을 보장할 수 없기 때문에 문제가 발생할 수 있다. 이를 해결하기 위해 Transport Layer에서 RDT 프로토콜을 이용할 수 있다. 아래는 RDT 프로토콜을 이용해 데이터를 송/수신하는 예시이다. 송신 측 상위 레이어에서 보내려는 데이터가 있다면 rdt_send()를 호출해 데이터를 RDT 프로토콜로 전송한다. RDT 프로토콜에서 신뢰할 수 없는 채널인 하위 레이어로 보낼 때 udt_send()를 호출해 패킷을 전송한다. 수신 측 하위 레이어에서 받은 패킷이 있다면 rdt..
데드 레커닝 (Dead Reckoning) 개념
분산 네트워크 기반 실시간 시뮬레이션 환경에서 트래픽 데이터(traffic data)를 감소시키기 위해 사용하는 기법. 데드(dead)라는 말은 신호를 받지 못하고 있는 상태를 말하며 레커닝(reckoning)은 추산한다는 의미로 신호가 없는 동안에는 추측하여 상태 정보를 갱신하는 것을 말한다. 영어로 찾아보니 추측 항법이라는 용어를 찾을 수 있었다. 배의 방향, 여행 경로를 추측하는데 쓰이는 방법이라고 한다. 게임에 적용하면 캐릭터의 이동경로를 예측하는 방법이라고 할 수 있겠다. 현재 위치 = 이전위치 + (속도\*시간) + (1/2\*가속도\*시간^2) 이동 패킷을 1초 간격이라고 했을 때, 이전 패킷의 위치와 현재 패킷의 위치를 빼면 간격이 1초이므로 속도이자 예상 초당 이동 거리가 된다. 거기에 ..
스레드 풀 (Thread Pool)
쓰레드 풀에 대한 이해 쓰레드의 생성과 소멸은 시스템에 많은 부담을 준다. 따라서 빈번한 쓰레드의 생성과 소멸을 피하기 위해선 쓰레드 풀을 유지하는 것은 성능 향상에 도움이 된다. 쓰레드 풀의 기본 원리는 쓰레드의 재활용이다. 할당된 일을 마친 쓰레드를 소멸시키지 않고, 쓰레드 풀에 저장해 뒀다가 필요할 때 다시 꺼내 쓰는 개념이다. 즉, 쓰레드의 생성과 소멸에 필요한 비용을 지불하지 않겠다는 것이다. 쓰레드 풀 동작 원리 쓰레드 풀은 처리해야 할 일(work)이 등록되기 전에 생성되는데, 풀이 생성됨과 동시에 쓰레드들도 생성되어 풀에서 대기하게 된다. 쓰레드 풀에 존재하는 쓰레드 하나를 임의로 할당해서 일의 처리를 도모한다. 만약 풀에 존재하는 쓰레드 수보다 처리해야 할 일의 수가 많다면, 일이 순서대..
Overlapped (비동기) I/O, epoll, iocp 정의 및 코드
Overlapped I/O 논블록 소켓 단점을 보완한 네트워크 통신 방법이 Overlapped I/ 논블로킹 소켓 프로세스 소켓 I/O 함수가 리턴한 코드 would block 인 경우 재시도 호출 낭비 발생. 소켓 I/O 함수를 호출할 때 입력하는 데이터 블록에 대한 복사 연산 발생. CPU 안에 있는 캐시 메모리에 메모리 내용이 복사되어 있으면 데이터 액세스는 매우 빠르지만 캐시에 없는 데이터를 액세스할 때는 메인 메모리 RAM을 액세스하는데, 이 속도는 매우 느림. 물론 하드디스크나 네트워크 데이터보다는 빠르지만 고성능 서버 개발 시 이 복사 연산 무시할 수 없음. TCP, UDP 논블록 소켓에서 재시도용 호출 낭비 TCP 소켓 send() 함수를 호출하면 would block 은 절대 발생하지 않..
TCP와 UDP의 특징과 차이
전송계층은 송신자와 수신자를 연결하는 통신서비스를 제공하는 계층으로, 쉽게 말해 데이터의 전달을 담당한다. 그리고 데이터를 보내기 위해 사용하는 프로토콜이 있는데, 그 프로콜들이 바로 TCP와 UDP다. 1. TCP(Transmission Control Protocol) 인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜. 일반적으로 TCP와 IP를 함께 사용하는데, IP가 데이터의 배달을 처리한다면 TCP는 *패킷을 추적 및 관리하게 된다. TCP는 연결형 서비스를 지원하는 프로토콜로 인터넷 환경에서 기본으로 사용한다. [ TCP 특징 ] 연결 지향 방식이다. 3-way handshaking과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제한다. 흐름 ..
C# 원자적 연산 (Interlocked 클래스)
Interlocked 클래스는 int 형 값을 증가시키거나 감소시키는데 사용한다. 멀티 스레드 환경에서 하나의 int 형 전역 변수를 공유한다고 생각해보자. 이런 경우에 A 쓰레드와 B 쓰레드가 값을 동시에 읽어와서 B 쓰레드가 수정한 값을 저장하고, A 쓰레드가 다시 수정한 값을 저장하게 되면 B 쓰레드의 변경사항을 잃어버리게 된다. 지금까지 이러한 자원의 동기화를 위해서 모니터나 뮤텍스를 사용하는 방법을 설명했지만 간단한 int 형의 값을 여러 쓰레드가 공유하는 것이 일반적이기 때문에 이러한 작업을 캡슐화한 클래스를 제공한다. Interlocked 클래스는 System.Threading 클래스에 있으며 주요 멤버는 다음과 같다. 메소드 이름 설 명 CompareExchange 두 대상을 비교하여 값이..