-
강의노트 - 메모리 관리개발/서버 네트워크 2023. 8. 3. 16:46
Reference Counting
참조 횟수 계산 방식 - 위키백과, 우리 모두의 백과사전
참조 횟수 계산 방식 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 참조 횟수 계산 방식(reference counting)은 메모리를 제어하는 방법 중 하나로, 쓰레기 수집의 한 방식이다. 구성 방식은 단순하다. 어떤 한 동적 단위(객체, Object)가
ko.wikipedia.org
레퍼선스 개수를 RefCountable 클래스를 만들고, SmartPointer 클래스를 추가하여 Wrapping
이미 만들어진 클래스를 대상으로는 사용할 수 없다
스마트 포인터
- 객체 소멸 시 자동으로 삭제되는 포인터
- C++11 이전에는 auto_ptr
순환(Cycle) 문제
- 서로를 참조하는 스마트 포인터가 해제되지 않는 경우
- 둘 중 한 쪽을 일반 포인터로 해서 예방할 수 있다
unique_ptr
- 하나의 스마트 포인터만이 해당 객체 소유. 복사(= 연산) 불가 std::move는 가능
shared_ptr
- 특정 객체를 참조하는 스마트 포인터 개수 참조(Reference count)
- make_shared<T>()로 생성
- use_count() 로 참조 횟수 반환
weak_ptr
- shared_ptr 소유 객체에 접근 가능하지만, 소유자 수에는 포함되지 않는다
- Uses와 Weaks 두개의 카운터 사용
- 순환 참조를 제거하기 위해 사용
- 사용하기 전에 lock()으로 shares_ptr 객체를 만들어 확인해야 한다
Allocator
&& Universal reference 확인
원하는 대로 메모리 할당/해제를 위해 xnew와 xdelete 선언
이미 할당된 공간에 생성자를 호출하는 Placement new
https://en.cppreference.com/w/cpp/language/new#Placement_new
new expression - cppreference.com
Creates and initializes objects with dynamic storage duration, that is, objects whose lifetime is not necessarily limited by the scope in which they were created. [edit] Syntax ::(optional) new ( type ) initializer (optional) (1) ::(optional) new new-
en.cppreference.com
Allocator 클래스나 매크로를 사용해서 메모리 할당/해제 과정을 관리할 수 있다
메모리 풀링 등 다양한 기법을 사용하기 위한 인터페이스
Stomp Allocator
언리얼 엔진에서 사용
- 메모리 해제 후 사용 문제 // Use-After-Free 상황. 스마트 포인터로 어느 정도 해결 가능
- 클래스 포인터 형변환 후 사용
메모리 오염을 방지하기 위한 기술
가상 메모리/페이지 단위 메모리 할당/페이지별 권한 설정 r rw x
::VirtualAlloc(NULL, 4, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
윈도우 메모리 - 3 (VirtualAlloc)
윈도우에서 메모리를 할당하는 다음 방법은 VirtualAlloc() 함수다. 이 함수는 malloc 함수에서 보다 발전된 형태로 사용자에게 여러 가지 추가 기능을 제공한다. 가장 큰 차이점은 '예약'과 '확정' 상
diehard98.tistory.com
페이지 단위 메모리 할당: 메모리 오염을 막지만 최소 한 페이지 단위로 할당해야 하므로 낭비가 생길 수 있음
STL Allocator
이미 존재하는 컨테이너들을 직접 만든 Memory pool로 생성되도록 할 수 있다
Memory Pooling
지금까지는 메모리가 필요없어지면 해제했지만, 대신해서 Pool에 보관해서 재사용
- 해제-할당을 반복하는 Context switch 비용 절약
- 메모리 파편화 방지 ————||||||—||-|—||||—|||||——
- 현재 실제 서버에서는 거의 사용하지 않는다
다양한 크기를 담을 수 있는 메모리 풀을 생성
MemoryHeader 구조체
- 메모리 사이즈 등 필요 정보 저장
MemoryPool 클래스
- MemoryHeader로 이루어진 queue
- queue가 비어 있는지 확인하고 꺼내오거나, 없으면 새로 만드는 부분을 구현한다
Object Pool
메모리 풀을 사용. allocSize와 MemoryPool 객체를 포함한다
'개발 > 서버 네트워크' 카테고리의 다른 글
강의노트 - 네트워크 프로그래밍 (0) 2023.08.03 강의노트 - 멀티스레드 프로그래밍 (0) 2023.08.03 5. I/O Completion Ports (IOCP) (0) 2023.08.03 4. OverLapped I/O (0) 2023.08.03 3. 동기, 비동기 통신 (0) 2023.08.03