Virtual Memory Address. 가상 메모리 시스템에서 사용하는 가상 주소를 뜻한다.
가상 메모리
->페이지 테이블
->물리 메모리
이렇게 접근을 하면서 우리가 사용하는 가상 메모리 주소(VA라고 칭한다)는 물리 메모리 주소(PA라고 칭한다)로 변환된다.
각 프로세스는 page table을 개별로 가지고 있으며 이는 PA로 변환될 수 있다.
항상 메모리에 적재된 페이지 테이블을 참고하여 주소를 변환하면 어떻게 될까?
주소를 사용하려고 할 때마다 process의 kernel space에 있는 page table을 읽어들여야 하기때문에 memory access가 빈번하다.
하지만 이를 캐싱(Caching)을 통해 해결할 수 있지 않을까?
이를 이용한 것이 TLB(Translation Lookaside Buffer)이다.
TLB는 MMU(Memory Management Unit)에 포함되어 있으며 최근에 변환한 VA와 PA를 가지고 있다.
VA를 PA로 바꿔야 하는 상황이 올때 MMU는 먼저 TLB에서 찾아본다(TLB look-up)
있으면? TLB hit!, 없으면 TLB miss라고 표현하며
malloc-lab 프로젝트를 진행하면서 왜 DWORD(64bit, 32bit 컴파일 기준)으로 할당하는가 정말 많은 고민을 했다.
WORD단위로 데이터를 할당한다면 (초기 할당에 한정적이지만) 충분히 효율적으로 메모리를 분배할 수 있다고 생각했다.
심리적인 문제로 필요한 데이터량을 어느정도 비슷하거나 같은 값으로 할당해서 사용할 것이다 라는 추측도 들어있었다.
내가 내린 결론은 WORD 단위로 할당하면 malloc을 수행하는 과정에서 추가적인 계산이 필요하기 때문이다.
WORD(32bit)로 블록을 나누어 할당한다면 malloc(sizeof(int))를 요청했을 때 헤더 4byte만 가득찬 한블록에 payload로만 가득차는 경우가 생긴다.
이때는 어떻게 할것인가? 하나의 블록을 더 만들어서 head(4) + payload(4)로 구성해서 반환해 줄 것이다.
그럼 어떤일이 일어나는가?
어떠한 요청이 오든 payload를 원하는 크기 k 만큼 공간을 확보하고, 앞에 header를 붙여서 반환해 줄 것이다.
그럼 우리가 block단위로 할당할 필요가 있을까? 내 생각엔 주객전도라고 생각한다. (block단위로 끊어서 주려는 개념인데, 그냥 원하는 만큼 던져주는 방식이 된다.)
추가로 block 이 WORD 단위로 할당되어 원하는 값만큼만 주게된다면 사용자의 입력값(원하는 메모리의 공간 크기)에 따라 외부 단편화 문제가 크게 좌우된다. (나는 충격완충장치가 사라진다고 이해했다.)
그래서 최소한 2WORD단위로 블럭을 만들어서 제공한다! 라고 생각했다.