목록2025/04 (18)
나만의 작은 도서관
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. Scatter-Gatherscatter-gather란 데이터를 송신할때 송신할 데이터를 모아서 한 번에 보내는 방법을 말한다.scatter-gather 방식을 사용하는 이유: 너무 잦은 시스템콜 호출 방지시스템 콜은 프로세스(또는 쓰레드)가 OS에게 서비스(파일 열기, 메모리 할당, 소켓 통신 등)을 요청하는 공식적인 인터페이스로, 시스템 콜 요청시 CPU는 해당 쓰레드를 사용자 모드 → 커널 모드로 전환한다. (즉, 시스템 콜은 다른 쓰레드에게 작업을 위임하는 것이 아니라, 동일한 쓰레드가 더 높은 권한을 일시적으로 얻어서 작업을 수행하는 것!)비동기 입출력 함수들은 시스템콜 방식으로 함수를 호출하며, 시스템콜 함수의 ..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 다시 정리하는 IOCP 함수IOCP 함수는 크게 3가지로, CICP, GQCS, PQCS가 있다. 이 3가지 함수를 통해 IOCP의 대부분의 기능을 사용할 수 있다. (여기서 PQCS는 따로 다루지 않는다.)CICP 함수CreateIoCompletionPort(1, 2, 3, 4)비동기 I/O 소켓 핸들: 클라이언트 소켓을 HANDLE로 캐스팅해서 넣는다.IOCP핸들: 만들어진 IOCP의 핸들을 넣는다.키: 연결한 장치에 대한 고유 키를 넣는다. 아무거나 넣어도 되지만 보통 해당 클라이언트 소켓의 세션 주소를 넣는다.CP 처리 쓰레드 개수: CP에 접근하는 최대 쓰레드 수를 지정한다. 0으로 설정하면, 기본값으로 프로세서..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 구조체 선언과 포인터, 그리고 Windows API 명명 규칙Winsock 라이브러리를 보다보면 아래와 같이 구조체 정의 뒤에 포인터 타입의 이름이 명명된걸 볼 수 있다.typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; union { struct { DWORD Offset; DWORD OffsetHigh; } DUMMYSTRUCTNAME; PVOID Pointer; } DUMMYUNIONNAME; HANDLE hEvent;} OVERLAP..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. NetAddress보다 직관적으로 IP 주소와 port를 저장하고 사용하기 위한 클래스.union 키워드union 키워드는 여러 변수가 같은 메모리 공간을 공유하는 데이터 구조로, union 키워드를 사용하면 같은 메모리를 다양한 크기의 변수들로 표현할 수 있다.union 키워드 예제: IN_ADDRtypedef struct in_addr { union { struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { USHORT s_w1,s_w1; } S_un_w; ULONG S_addr; ..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 두 달만에 다시 시작하는 프로젝트 커밋C++에 대한 지식이 너무 부족한 나머지 두 달동안 공부하고 오늘부터 다시 프로젝트를 시작한다.ServerService의 구상클라이언트나 서버와 같이 제공하고자 하는 내용을 서비스(Service)라고 표현했을때, 오늘은 서버 서비스에 대해 구조를 짜고자 했다.샘플 코드를 토대로 서버 서비스를 구상하였으며, 결론적으로 서버 서비스에는 아래 요소들이 필요하다고 판단했다.새로운 유저를 연결해주는 Listner서버 주소를 의미하는 NetAddress소켓 모델을 의미하는 SocketModel여기서 SocketModel은 IOCP 고정으로 사용할 것이라(나중에는 아닐 수도 있겠지만) 따로 클래스..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 멀티 쓰레드 환경에서의 쓰레드 배치에 대한 고찰쓰레드를 어떻게 배치해야 효율적인가?서버 프로그램을 제작한다고 했을때, 아래 4가지 역할을 맡는 쓰레드가 있을 것이다.리스너: 새로운 유저의 연결(Connect)를 담당패킷 처리: 네트워크를 통해 온 패킷을 받아 역직렬화인게임 로직 처리: 역직렬화된 데이터를 토대로 게임 컨텐츠 코드를 실행DB: 데이터 베이스(DB)와 통신하나의 서버 프로그램에서는 쓰레드를 30개 정도 배치할 정도로 쓰레드를 많이 배치하는데, 위 4가지 역할을 맡는 쓰레드의 비율이 어떻게 되어야하는지가 중요하다. CPU 부하를 많이 주는 작업은 1) 패킷 처리와 2) 인게임 로직 처리로, 이 둘 중에서도 ..