| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Binary Lifting
- reference counting
- 자바스크립트
- PROJECT
- 벨만-포드
- 비트필드를 이용한 dp
- 트라이
- HTTP
- trie
- Prisma
- Strongly Connected Component
- Spin Lock
- 게임 서버 아키텍처
- Github
- Lock-free Stack
- JavaScript
- 2-SAT
- map
- 강한 연결 요소
- 그래프 탐색
- Delete
- select 모델
- 최소 공통 조상
- Behavior Design Pattern
- SCC
- DP
- Overlapped Model
- 이분 탐색
- 비트마스킹
- ccw 알고리즘
- Today
- Total
목록전체 글 (250)
dh_0e
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..
OpenStack 데이터 센터 전체에서 대규모 컴퓨팅, 저장소 및 네트워킹 리소스 풀을 제어하는 클라우드 OS모두 공통 인증 메커니즘을 갖춘 API를 통해 관리 및 제공됨모두 RESTful API로 구성되어 있음OpenStack 안에는 수많은 서비스가 있으며 (연산 담당 Nova, 네트워크 담당 Neutron, 저장소 담당 Cinder 등) 이들이 서로 협력할 때 상대방의 내부 코드를 직접 건드리지 않고, 오직 API 요청만 주고받음(ex. VM 하나 줘 api)대시보드를 통해 관리자가 웹 인터페이스로 리소스를 제공할 수 있음표준 인프라 서비스 외에도 사용자 App의 고가용성을 보장하기 위해 Orchestration, 장애 관리 및 기타 서비스 관리 기능을 제공표준 인프라 서비스 == Instance =..
STL Allocatorvector나 map 같은 STL 컨테이너들은 내부적으로 new, delete를 기본적으로 사용하여 메모리 할당을 하고 있음new, delete는 유동적이기 때문에, 메모리 할당 오류를 제대로 잡아내지 못할 수 있음STL 컨테이너들의 메모리 할당 로직 중간에 개입하고 싶을 수 있음STL Allocator를 만들어 Allocator를 대체하는 메모리 체크 버전 STL 컨테이너를 따로 만들어서 메모리 할당 로직 중간에 개입하거나, 오류를 탐색할 때 사용할 수 있음vector v;이렇게 넣으면 될 것 같지만 STL 컨테이너마다 내부에서 기본적으로 요구하는 함수들이 BaseAllocator에 모두 구현되어 있지 않을 확률이 큼vector 뿐만 아니라 stack, queue 등 다른 컨테이..
Use-After-Free 오류용 Stomp Allocatornew & deleteint main() { SYSTEM_INFO info; ::GetSystemInfo(&info); cout _hp = 100; delete test; test->_hp = 200; return 0;}test->_hp=200; 에서 CRASH가 나지 않음new, delete 같은 힙 할당이 유동적으로 메모리를 관리하기 때문에 다음과 같이 에러를 잡지 못하는 경우가 발생 VirtualAlloc & VirtualFreeint main() { SYSTEM_INFO info; ::GetSystemInfo(&info); cout Window api(VirtualAlloc, VirtualFree)를 이용해서 직접 메모리를 사용하고 해제..
VM vs ContainerVM은 Guest OS를 포함하기 때문에 무겁고, Container는 Host OS의 커널을 공유하기 때문에 가벼움Namespaces: Instance(Bins/Libs)를 나눠주는 기술cgroups: 나누어진 영역이 사용하는 자원의 양을 조절하는 역할 Container애플리케이션과 그 실행에 필요한 모든 요소를 하나로 묶는 기술로 대표적인 예로 도커(Docker) 컨테이너가 있음Standard Packaging (표준화된 패키징)애플리케이션을 구동하기 위해 필요한 코드, 라이브러리, 환경 설정 등을 하나로 묶어 '이미지'라는 표준 규격으로 만들어 줌덕분에 어떤 환경에서도 동일하게 작동함Isolation and Efficiency (격리 및 효율성)리눅스 커널의 Namespac..
New, Delete Operator다음과 같이 new와 delete도 operator로 재정의 가능operator로 흐름을 가로채서 로그를 찍거나 무언가를 할 수 있음class Knight {public: Knight() { cout 다음과 같이 전역으로 선언하면 Global 하게(모든 new, delete에) 적용돼서 위험할 수 있음아래와 같이 클래스에 넣어서 해당 클래스에만 적용되게끔 사용이 가능함class Knight {public: Knight() { cout Allocator.h / Allocator.cppAlloc(): 메모리 할당만 하고 생성자는 직접 호출해주지 않음Release(): 메모리 해제만 담당하고 소멸자는 직접 호출해주지 않음 Memory.h#pragma once#include..
GameServer.cppclass Wraith{public: int _hp = 150; int _posX = 0; int _posY = 0;private:};class Missile{public: void SetTarget(Wraith* target) { _target = target; } void Update() { int posX = _target->_posX; int posY = _target->_posY; // TODO : 타겟을 쫓아감 }private: Wraith* _target = nullptr;};int main(){ Wraith* wraith = new Wraith(); Missile* missile = new Missile(); missile->SetTarget(wraith);..
DeadLock Profiler (데드락 탐지)DeadLock을 탐지하는 Profiler를 구성하여 RW Lock과 함께 사용Lock으로 visit check, dfs로 그래프 탐색하면서 사이클(DeadLock)을 찾는 방식 DeadLockProfiler.h#include #include #include /*-------------------- DeadLockProfiler---------------------*/// lock으로 visit check 하면서 그래프 탐색하는 느낌class DeadLockProfiler{public: void PushLock(const char* name); void PopLock(const char* name); void CheckCycle();private: void ..