MMOServer 25

메모리 관련

CPU의 메모리 정렬CPU가 메모리를 효율적으로 읽을 수 있도록 데이터를 특정 크기 단위로 정렬하는 것이다.보통 2의 배수 byte단위로 정렬하는데, 1,2,4,8...로 정렬된다. 정렬되지 않은 데이터를 읽을려고 하면 컴파일러에 따라서는 바로 끊어버릴 수도 있다.정렬되어있지 않다면 데이터들을 여러번에 걸쳐서 읽어들여야 하기 때문에 그만큼 cpu의 효율이 감소한다.메모리가 정렬되면, 메모리 단위가 규칙적으로 바뀌게 되는데, 16바이트로 정렬된다면 마지막 주소값은 0이 된다.0001 0000 = 16바이트/ 8바이트로 정렬되어 있다면 끝자리가 8아니면 0일 것이다. address boundary값이 정렬하고 싶은 값의 배수가 되지 않는다면 CPU가 그 주소값에 접근하는데 추가적인 비용이 들기도 하고, 하드..

MMOServer 2025.03.27

Smart_Pointer(C++)

전에 포스팅한 RefCounting과 스마트 포인터는 RefCounting을 상속받는 클래스에만 사용할 수 있고, 순환 문제를 해결할 수 없다. SmartPointer에는 총 3종류가 있는데, 각각 unique_ptr, shared_ptr, weak_ptr이 있다.unique_ptr는 복사생성자, 복사연산자 등 복사연산이 delete되어 있는 포인터라고 생각하면 된다. (이동연산자는 가능) 1. RefCountBlock shared_ptr는 ptr가 가리키는 객체와 RefBlock이라는 RefCount를 관리하는 메모리가 같이 할당된다.RefCount는 ptr을 가리키는 shared_ptr의 개수만큼 늘어나고, RefCount가 0이되면 ptr가 가리키는 객체를 delete로 소멸시킨다.RefCountB..

MMOServer 2025.03.22

멀티스레드의 메모리 이슈

가시성: 각 코어들은 캐시를 가지고 있는데, 공유 변수의 값을 메모리에 저장 안하고 자기 캐시에만 저장해놓았을 수도 있고, 각 캐시마다 변수의 값이 다르게 저장되있을 수도 있음. 코드 재배치: cpu나 컴파일러의 최적화 이슈로 코드가 재배치됨. fetch -> decode -> execute -> write back 각각 데이터 가져오기, 데이터 해석, 실행, 저장을 의미한다. int x = 0; int y = 0; int r1 = 0; int r2 = 0;일 때, 쓰레드 1이 x = 1; r2 = y;를 실행하고, 쓰레드 2가 y = 1; r1 = x;를 실행할 때, 계속 실행하다보면 x = 0과 y = 0이 결과값으로 나올 수 있다.  (가시성과 코드 재배치의 이슈) 쓰레드 1에서 x는 1이지만, 자..

MMOServer 2025.03.13