메모리
가상 메모리와 가상 주소 공간
가상 메모리와 가상 주소 공간 서로 다른 개념이지만 혼용되서 사용된다. 가상 주소 공간은 각 프로세스 당 주어지는 논리적인 공간이다. 가상 주소 공간의 크기는 물리 메모리(RAM)의 크기와는 독립적이며, 레지스터 크기에 종속적이다. Word Size가 32비트인 컴퓨터의 경우, 일반적으로 레지스터의 크기도 32비트다, 이는 2^32 개의 주소를 나타낼 수 있음을 의미하고, 1 바이트당 주소가 주어지므로 최대 4GB의 가상 주소 공간을 갖을 수 있다. 같은 원리로 64비트 컴퓨터의 경우 2^64 바이트(16 엑사 바이트) 크기의 가상 주소 공간을 갖을 수 있게 된다. 프로세스의 주소 공간은 페이지(Page) 단위로 관리된다. 가상 주소 공간의 주소를 논리 주소라고 하는데, 모든 논리 주소가 반드시 물리적인..
[Unreal] 메모리 관리
메모리 관리는 안정성이 높고 버그가 없는 프로그램을 작성하는 과정에서 늘 중요한 주제다. dangling pointer는 이미 메모리에서 지워진 대상을 참조하는 포인터이며, 추적하기 어려운 버그를 만드는 대표적인 사례다. UE4의 UObject 참조 카운팅 시스템은 UObject 클래스로부터 파생된 액터와 클래스의 메모리를 관리하는 기본적인 수단으로, 이를 통해 UE4 프로그램 내에서 메모리가 관리된다. 만약 UObject에서 파생하지 않은 C++ 클래스를 작성한다면 TSharedPtr/TWeakPtr 를 사용하면 된다. 이번 글에선 메모리 관리와 코드 디버깅 방법을 설명한다. 메모리 관리 기능의 도움을 받으면 메모리 해제를 잊는 실수를 걱정하지 않아도 된다. 메모리 관리를 하는 프로그램에서는 동적으로 ..
[C++] 디버그 모드에서 변수의 메모리 차지 공간
int64의 크기는 8바이트이고 로컬변수 선언시 스택 메모리에 8바이트씩 차지하게 된다. 8바이트 크기의 변수 3개를 선언 후 메모리 주소를 확인해보자. int64 n1 = 1; int64 n2 = 2; int64 n3 = 3; cout
[C/C++] 메모리 오류에 대하여
1. C/C++에서 메모리 오류의 종류 일단 메모리 공간에 따라 크게 Heap Memory 에러와 Stack (local variables) Memory 에러가 있다. Heap 메모리 영역에서 발생가능한 에러는 이미 해제된 메모리 다시 해제 할때 할당된적도 없는 메모리 해제 할라고 할때 이미 해제된 메모리 영역에 뭔가 데이터를 쓰려고 할때 할당된 적이 없는 메모리에 뭔가 데이터를 쓰려고 할때 메모리 할당 에러 동적으로 할당된 메모리 배열에서 초과된 index의 위치를 읽거나 쓰려고 할때 1,2 번과 3,4번을 묶어서 볼 수 있는데 해제시에 발생하는 문제 vs 데이터 입력시 발생하는 문제로 볼 수 있다. 스택 메모리 영역에서 발생가능한 에러들로는 정적 배열에서 초과된 index의 위치를 읽거나 쓰려고 할때..
메모리 (RAM) 구조
RAM과 ROM RAM은 자유롭게 읽고 쓸 수 있는 기억장치로, RWM(Read Write Memory)라고 부르기도 한다. 또한 RAM에는 현재 사용 중인 프로그램이나 데이터가 저장되어 있다. 시스템의 전원이 꺼지면 기억된 내용이 모두 사라지는 휘발성 메모리의 특징을 가진다. 일반적으로 주기억장치 또는 메모리라고 불린다. ROM은 기억된 내용을 읽을 수만 있는 기억장치로서 일반적으로 쓰기가 불가능하다. 또한 시스템의 전원이 꺼져도 기억된 내용이 지워지지 않는 비휘발성 메모리다. 실제로 ROM은 주기억장치로 사용되기보단 주로 변경 가능성이 없는 시스템 소프트웨어를 기억시키는데 이용된다. (ex. 기본 입출력 시스템, 자가 진단 시스템) 프로그램 실행 순서 프로그램이 실행되는 과정을 도식화하면 다음과 같다..
[C#] 구조체 (struct)로 메모리 절약하기
메모리의 타입(유형) 스택(Stack) 스택은 매우 단순하고 균일한 방식으로 할당되는 연속적인 메모리 영역이다. 메모리는 스택의 하위 메모리 주소에서 상위 메모리 주소로 할당 된다. 가장 최근에 할당된 메모리만 해제 할 수 있으며, 당연히 스택 맨 아래에 할당 된(먼저 할당 된) 메모리를 해제하려면 위에 할당된 메모리를 모두 해제해야만 한다. 스택에 할당 되지 않은 메모리는 단순한 메모리 포인터로 추적된다. 스택 영역에 메모리가 할당 되면 포인터가 적절한 양만큼 위로 이동한다. 반대로 메모리가 해제되면 포인터가 다시 아래로 이동한다. 실제 스택 영역에서 메모리가 해제 된다고 하더라도 메모리에 저장되어 있는 값을 지우는 것이 아닌 단순히 포인터만 이동하고, 해당 메모리는 필요 할 때 덮어 쓰여지게 된다. ..
C# 클래스 할당시 메모리 구성 디버깅
디스어셈블링 및 실제 메모리를 디버깅하면서 데이터와 객체를 할당시 어떤 구조로 메모리에 올라가는지와 C#에서 클래스를 할당하면, 힙이 어떻게 동작하는지를 보자 쉽게 보기 위해서 예제는 x86(32bit)로 컴파일되었고 이를 기준으로 설명한다 예제로 사용할 모습은 이와 같다. 아무 클래스나 하나 만들고 그 안에 문자열 하나와 int 하나를 선언, 구조체 역시 메모리를 살펴보기 쉽게 int형 두개로 선언했다 먼저 Case1 메소드를 디버깅해보자 Watch창에서 살펴보면 현재 testObject의 상태를 알 수 있고, '&testObject'로 testObject의 실제 메모리 주소를 볼 수 있다. C# 문법에서는 직접적인 포인터를 사용하려면 unsafe 옵션을 이용해서 사용 할수 있으나, 이는 그리 권장하는..
캐시 히트율/메모리 적중률 (Hit Rate)
캐시 메모리는 CPU의 처리 속도와 주기억장치의 접근 속도 차이를 줄이기 위해 사용하는 고속 Buffer Memory이다. ※ 캐시 메모리 이용 효과 프로그램의 실행과정을 분석해 보면, 주어진 시간 동안에 참조하는 메모리 영역은 국한된다는 사실을 알 수 있다.(메모리 참조의 국부성) 따라서 자주 참조되는 프로그램의 일부를 속도가 빠른 기억장치에 저장해 놓고 실행시키면 프로그램의 총 실행시간을 단축시킬 수 있다. 이때 이용하는 기억장치를 캐시 메모리라고 한다. 캐시 메모리의 특징 캐시는 주기억장치와 CPU사이에 위치하며, 자주 사용하는 프로그램과 데이터를 기억한다. 캐시 메모리는 메모리 계층 구조에서 가장 빠른 소자이며, 처리 속도가 거의 CPU의 속도와 비슷할 정도이다. 캐시를 사용하면 주기억장치를 접근..
프로세서, 메모리, 캐시 개념 및 원리 (메모리 및 버스/연결 관한)
시스템 버스 시스템 버스는 하드웨어를 물리적으로 연결하여 서로 데이터를 주고받을 수 있게하는 통로 역할을 한다. 이때 버스는 데이터 버스, 주소 버스, 제어 버스로 나뉜다. 데이터 버스 프로세서와 메인 메모리 그리고 주변 장치들 사이에서 데이터를 전송할 때 쓰인다. 이때 버스는 데이터를 주고받아야 하므로 양방향이다. 주소 버스 프로세서에서 메모리의 주소를 지정할 때, 그 주소가 어디인지에 대한 정보를 보내는 버스이다. 즉, 프로세서에서 01110011이라는 위치에 데이터를 보내려면 데이터 뿐만 아니라 데이터의 목적지인 01110011도 버스를 통해 보내는데 이를 주소 버스를 통해 보낸다. 결국 프로세서가 주소를 지정하면서 보내는 버스이다. 이 버스는 주소를 보내면 되니 단방향이다. 제어 버스 프로세서가 ..
CPU 그리고 캐시 메모리
cpu의 퍼포먼스는 다음으로 결정된다. 코어 수 클럭 속도 캐시 메모리 프로세서 타입 (따로 글로 빼둠) 코어 cpu는 하나 또는 그 이상의 프로세서를 가질 수가 있다. 내부 논리 구조는 아래와 같다. 컴퓨터 메모리에 담겨있는 프로그램을 실행하라는 입력이 들어와서 프로그램이 실행되는 순서는 입력 - CU(컨트롤유닛)가 메모리에 프로그램 데이터를 호출 메모리에서 레지스터로 자료가 이동 ALU(산술연산장치)에서 프로그램을 계산 또는 해독 출력 CU (Control Unit) 명령 제어장치 입력된 명령어를 해독하여 cpu 내부의 움직임을 총괄하고 각 과정을 통제한다. 주로 데이터를 메모리로부터 ALU로 옮기라는 명령과 그 후 다시 메모리로 옮기는 명령을 내린다. CU의 명령에 의한 명령 처리 과정 캐시나 파이..