| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- Behavior Design Pattern
- 강한 연결 요소
- PROJECT
- SCC
- 비트마스킹
- trie
- Github
- HTTP
- 비트필드를 이용한 dp
- 자바스크립트
- ccw 알고리즘
- JavaScript
- Spin Lock
- Strongly Connected Component
- map
- 이분 탐색
- 벨만-포드
- reference counting
- Overlapped Model
- Binary Lifting
- 트라이
- DP
- 그래프 탐색
- 최소 공통 조상
- 2-SAT
- 게임 서버 아키텍처
- Delete
- Lock-free Stack
- Prisma
- select 모델
- Today
- Total
목록전체 글 (256)
dh_0e
SendBuffer목적메모리 파편화 해결: 작은 패킷을 보낼 때마다 메모리를 할당/해제하면 시스템 성능이 저하됨할당 비용 감소: 고성능 서버에서는 매 초당 수만 개의 패킷이 오가는데, 그때마다 커널에 메모리를 요청하는 것은 비효율적임수명 보장: 비동기 I/O(IOCP) 특성상 WSASend가 완료될 때까지 버퍼가 살아있음을 보장해야 함전송 흐름Send(): 버퍼를 당장 보내는 것이 아니라 _sendQueue에 일단 담고 RegisterSend가 이미 돌아가고 있다면 종료RegisterSend(): RegisterSend가 준비(_sendRegistered==false)됐다면 큐에 쌓인 모든 버퍼를 _sendEvent의 sendBuffers 벡터에 옮김이때, Scatter-Gather를 위해 wsaBufs..
RecvBuffer 하나의 큰 공용 버퍼를 readPos와 writePos로 관리하는 방식으로 주로 Ring buffer나 Circular buffer 형태를 사용장점단일 버퍼 방식: 하나의 큰 메모리 블록을 미리 할당(Pre-allocation)하여 관리하므로 메모리 관리가 예측 가능하며 시스템 전체의 부하를 줄임포인터 관리: readPos와 writePos만 조절하면 데이터를 실제로 옮기지 않고도 "어디까지 읽었는지"와 "어디에 써야 하는지"를 즉시 알 수 있어, CPU 사이클을 아끼는 결정적인 요인이 됨공용 버퍼: writePos는 계속 뒤로 밀리며 데이터를 채우고, readPos는 완전한 메시지 단위가 구성되었을 때만 이동하면 되므로 데이터의 흐름을 제어하기가 훨씬 수월함TCP와 같은 스트림 기반..
Storage ClassPVC: 사용자가 PV를 배정해 달라고 요청하는 것을 Spec으로 정의해 놓은 것Storage Class: 관리자가 리소스를 통해 생성할 수 있는 PV 유형을 정의해 놓은 것 (PV 생성 및 연결을 추상화한 것)이후 사용자가 PVC를 통해 원하는 Volume을 정의해 놓으면 후에 Pod가 생성될 때 자동으로 PV가 생성되고 PVC에 매핑되어 자동으로 Pod에 마운트 되게 됨 ConfigMap, Secret사용 목적: 설정 정보와 애플리케이션 코드를 분리하기 위함필요 상황 예시: database의 위치정보(IP 주소 or URL)가 이를 이용하는 응용 프로그램 코드 상에 기록하여 사용하는 상황에서 해당 DB의 service IP 주소가 변경되거나 URL이 변경되면 아래의 과정이 필요..
Session 송수신 관련 함수Register (행동 등록)RegisterConnect(): ConnectEx 등록RegisterDisconnect(): DisconnectEx 등록RegisterRecv(): WSARecv() 등록RegisterSend(): WSASend() 등록Process (행동 실행)ProcessConnect(): Client 등록 이후 행동 실행 or 다른 서버에 등록되었을 때 사용ProcessDisconnect(): 서버 Disconnect 시 행동 실행ProcessRecv(): Recv Data 확인 및 처리 (OnRecv() 실행)ProcessSend(): Send Data 확인 및 처리 (OnSend() 실행)On (컨텐츠 코드에서 오버로딩할 함수들)OnConnected(..
IocpObject Ref CountGetQueuedCompletionStatus로 이벤트를 꺼내올 때, 해당 이벤트를 보낸 객체(Listener나 Session)가 종료나 타임아웃으로 인해 메모리에서 해제되었을 가능성 발생이를 방지하기 위해 스마트 포인터 도입(IocpCoreRef, IocpObjectRef, SessionRef, ListenerRef, ServerServiceRef)enable_shared_from_this 상속: IocpOjbect가 자기 자신의 스마트 포인터를 안전하게 반환할 수 있도록 해 줌IocpEvent 내 Owner 보관: IocpEvent 구조체 내에 IocpObjectRef owner를 보관함으로써, 예약된 IO가 완료될 때까지 관련 객체의 참조 카운트가 유지되도록 보장..
Kubernetes VolumesDrive(storage device): 물리적 or 가상적인 저장 장치 자체를 의미Mount Volume: 외부의 저장소(Storage)를 컨테이너 내부의 특정 경로(Directory)에 연결하여, 컨테이너가 마치 자기 것처럼 사용할 수 있게 하는 과정Worker Node(컨테이너)에게 저장소를 할당하는 과정 Types of VolumeStorage에서 파생된 리소스의 종류Temporary space(임시 저장 공간): 임시적인 데이터 공간데이터의 생명주기가 Pod와 운명을 같이 함emptyDir, ConfigMap / Secret, Downward APIfilesystem(Node 수준의 저장 공간)호스트 노드의 파일 시스템에 있는 파일이나 디렉터리를 Pod에 마운트h..
Kubernetes VS OpenStack오픈스택: VM을 다루다가 컨테이너도 다루게 됐음Magnum (매그넘): 오픈스택 위에서 쿠버네티스, 스웜(Swarm) 같은 컨테이너 오케스트레이션 엔진을 쉽게 배포할 수 있게 해 줌쿠버네티스(k8s): 컨테이너 중심의 오픈소스를 다루다 VM도 다루게 됐음(KubeVirt)KubeVirt: 컨테이너(Pod) 내부에서 QEMU/KVM 프로세스를 실행하여 VM 구동kubectl 명령어로 컨테이너와 VM을 동시에 관리 가능 (with YAML)인터프리터 역할로 사용자의 명령어를 http message로 번역해줌구분OpenStack (Magnum/Zun)Kubernetes (KubeVirt)출발점가상 머신(VM) 관리 IaaS컨테이너 오케스트레이션 PaaS철학"인프라를 ..
IocpCore.h/*----------------- IocpObject------------------*/class IocpObject {public: virtual HANDLE GetHandle() abstract; virtual void Dispatch(class IocpEvent* iocpEvent, int32 numOfBytes = 0) abstract;};/*----------------- IocpCore------------------*/class IocpCore {public: IocpCore(); ~IocpCore(); HANDLE GetHandle() { return _iocpHandle; } bool Register(class IocpObject* iocpObject); bool Di..
Socket Utils (WinSock Wrapper)Windows 네트워크 프로그래밍의 번거로운 기초 설정을 추상화하고, 고성능 확장 기능(Ex 함수)을 안전하게 관리하기 위한 정적 유틸리티 클래스윈도우 소켓 초기화(Initialize), 고성능 확장 함수(Ex) 바인딩, 소켓 옵션 설정 등의 기능이 있음사용 이유복잡한 초기화 과정의 캡슐화 (Encapsulation)WSAStartup/WSACleanup: 윈도우 소켓 라이브러리 초기화(Initalize)/해제주소 변환: sockaddr_in 구조체 설정, IP 문자열을 바이너리로 변환하는 작업 등옵션 설정: SO_REUSEADDR, TCP_NODELAY 같은 소켓 옵션을 매번 수동으로 설정하면 실수가 생기기 쉬우므로, 이런 보일러플레이트(Boiler..
IOCP (Completion Port) 모델APC queue 대신 Completion Port를 사용하는 모델Completion Port: 스레드마다 있는 것이 아닌 유일한 포트 / 중앙에서 관리하는 APC queue 느낌멀티 스레드 환경과 궁합이 굉장히 좋음Alertable Wait 대신 Completion Port 결과 처리를 위한 함수 호출 CreateIoCompletionPort(): Completion Port를 생성 / 소켓을 Completion Port에 등록GetQueuedCompletionStatus(): OS에게 일감을 기다림 CICP (CreateIoCompletionPort)HANDLE hResult = CreateIoCompletionPort( HANDLE FileHand..
Overlapped 모델 (Completion Routine: 콜백 함수 기반)비동기 입출력을 지원하는 소켓 생성 + 비동기 입출력 함수 호출 (완료 루틴의 시작 주소를 넘겨줌)바로 완료되지 않으면, WSA_IO_PENDING 반환비동기 IO가 완료되면, OS는 완료 루틴(Callback 함수) 호출하지만 스레드가 중요한 작업 중에 완료 루틴이 호출돼서 방해받으면 안 됨비동기 입출력 함수를 호출하여 스레드를 Alertable Wait 상태로 만듦Alertable Wait 상태: 완료 루틴을 받을 수 있는 상태Alertable Wait 상태로 만들어주는 함수들WaitForSingleObjectEx(), WaitForMultipleObjectsEx(), SleepEx(), WSAWaitForMultipleE..
Overlapped Model (이벤트 기반)Overlapped IO (비동기 + 논블로킹) like node.jsOverlapped는 중첩이란 의미로 입출력(IO)을 Non-blocking 모드를 사용해 중첩해서 처리한다는 뜻동작 과정Overlapped 함수를 건다 (ex. WSARecv, WSASend)Overlapped 함수가 성공했는지 확인 후성공: 결과 얻어서 처리실패:사유 확인Pending >> EWOULDBLOCK 비슷한 느낌추후에 완료가 되었을 때 요청할 수 있는 방법이벤트 방식콜백 방식비동기 입출력을 지원하는 소켓 생성 + 통지받기 위한 이벤트 객체 생성비동기 입출력 함수(WSASend, WSARecv) 호출WSAOVERLAPPED 구조체를 통해 이전에 만든 이벤트를 넘겨줌비동기 작업이 ..
Web and HTTP(Hypertext Trnasfer Protocol)여러 형식의 객체들을 전달ex) HTML file, JPEG image, Java applet etc. 웹 페이지는 여러 참조 개체를 포함하는 기본 HTML 파일로 구성 각 객체는 URL(Uniform Resource Locator)로 주소 지정이 가능 http는 stateless(상태가 없음) 임서버가 과거 클라이언트 요청에 대한 정보를 유지하지 않음상태 없이 클라이언트 인증을 위해 쿠키, 토큰을 사용하며 http 외에도 UDP도 stateless 한 통신 방법임Session을 활용하는 TCP는 stateful(상태 유지) 서버임 Restful APIREpresentational State Transfer (대표 상태 전송)성공적..
WSAEventSelect Model (Windows Socket API Event Select Model)WSAEventSelect() 함수가 핵심이 되는 모델소켓과 관련된 네트워크 이벤트(send, recv) 사용 가능 시기를 이벤트 객체를 통해 감지함소켓과 이벤트 객체를 1대 1로 매칭하여 연동Select랑 비슷하지만 Select가 2개(소켓, 이벤트 객체)로 나뉘어진 느낌Select는 동기, WSAEventSelect는 비동기Select는 블로킹 모드, WSAEventSelect는 논블로킹 모드구분select 모델WSAEventSelect 모델동작 방식동기(Synchronous): 함수 호출 시 소켓 셋을 조사함비동기(Asynchronous): 이벤트 발생 시 OS가 신호를 줌알림 방식소켓 셋(f..
Select 모델 Select 함수가 핵심이 되는 모델로, 다양한 입출력 모델 중 가장 기초가 되는 모델Windows, Linux에 모두 존재함소켓 함수 호출이 성공할 시점을 미리 알 수 있게됨queue를 pop()할 때 if(!que.empty()) que.pop(); 이렇게 체크하는 것과 비슷하게 소켓이 send()나 recv() 준비가 되었는지 체크할 수 있음Blocking, Non-Blocking 상관 없이 모두 쓸 수 있음Problem1) 수신 버퍼에 데이터가 없는데, read 할 경우Problem2) 송신 버퍼가 꽉 찼는데, write 할 경우블로킹 소켓: 조건이 만족되지 않아서 블로킹되는 상황 예방 논블로킹 소켓: 조건이 만족되지 않아서 불필요하게 반복 체크하는 상황을 예방게임 서버에선 통상..
블로킹(Blocking) 소켓Blocking 소켓은 함수가 특정 목적을 달성할 때까지 종료하지 않고 Thread를 Block 함함수 → 종료 목적accept → 접속한 클라가 있을 때connect → 서버 접속에 성공했을 때send, sendto → 요청한 데이터를 송신 버퍼에 복사했을 때recv, recvfrom → 수신 버퍼에 도착한 데이터를 유저 레벨 버퍼에 복사했을 때블로킹 상태의 해당 스레드는 타임슬라이스를 할당받지 않고 Wait 상태로 전환(대기)하게 되며, CPU를 점유하거나 고갈시키지 않음커널이 해당 스레드가 실행 가능한 상태가 되면, 해당 스레드를 깨워 CPU를 할당받을 수 있게 해 줌 논블로킹(Non-Blocking) 소켓u_long on = 1;::ioctlsocket(listenSo..
Socket Option해당 소켓이나 소켓이 사용하는 통신 프로토콜에 옵션을 부여할 수 있음s: 해당 소켓level: 옵션을 해석하고 처리할 주체(소켓 or 프로토콜)SQL_SOCKET: 소켓 코드IPPROTO_IP: IPv4 프로토콜IPPROTO_TCP: TCP 프로토콜optval: true를 넣어서 활성화, false 시 비활성화optlen: optval의 크기 SO_KEEPALIVEbool enable = true;::setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&enable, sizeof(enable));주기적으로 연결 상태 확인 (TCP Only)상대방이 갑자기 연결을 끊으면 곤란할 수 있기 때문에 주기적으로 TCP 프로토콜 연결 상태를..
UDP 통신연결이라는 개념이 없음 [Transport Layer] UDP (User Datagram Protocol)User Datagram FormatUDP 패킷의 헤더 구조는 총 8바이트로 고정이며 4개의 필드로 구성됨Source Port Number(16bit): 송신 측 포트 번호, 범위 0~65,535Destination Port Number(16bit): 수신 측 포트 번호, 범위 0~65,535Lengthdh-0e.tistory.com 전송 순서가 보장되지 않음 "Hello", "World"를 보내도 "World", "Hello"로 전송될 수 있음 데이터 경계(Boundary)는 보장됨분실에 대한 책임 없음 (신뢰성이 별로임)일단 보내고 생각하므로 단순하기 때문에 속도가 TCP에 비해 상대적..
TCP 통신연결 지향형(Connection-oriented) 프로토콜연결을 위해 할당되는 논리적인 경로가 있음3-way-handshake로 생성4-way-handshake로 연결을 끊음 [Transport Layer] TCP (Transmission Control Protocol) Part I.Process-to-Process Communication Stream Delivery Service메시지 단위가 아닌 byte 흐름 단위로 데이터를 전송나눠서 혹은 합쳐서 받을 수 있음Segment: TCP의 data unit으로, Application에서 받은 바이트 스트림을 TCP가dh-0e.tistory.com분실이 일어나면 책임지고 다시 전송 (신뢰성이 좋음)데이터를 주고받을 상황이 아니라면 일부만 보냄 ..
Socket Programming네트워크 상에서 두 컴퓨터가 데이터를 주고받을 수 있도록 연결 통로(소켓)를 만드는 과정Windows 환경에서는 WinSock2 라이브러리를 사용 GameServer.cpp#include "pch.h"#include #include "CorePch.h"#include #include #include #include #include "ThreadManager.h"#include #include #include #pragma comment(lib, "ws2_32.lib")int main() { // 원속 초기화(ws2_32 lib 초기화) // 관련 정보가 wsaData에 저장됨 WSADATA wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsa..
