SW사관학교 정글7기 개발일지 (09/09)

c4fiber·2023년 9월 9일
0

SW사관학교 정글7기

목록 보기
24/49

가상 메모리 주소

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라고 표현하며

  • 전자의 경우에는 알맞는 PA를 얻어 물리 메모리에 접근할 수 있게 해준다.
  • 후자의 경우에는 다시 process의 page table을 찾아본다 (page table look-up)
    그리고 찾은 PA를 따라 물리메모리에 접근해 데이터를 읽어온다.

malloc-lab 왜 DWORD 단위?

malloc-lab 프로젝트를 진행하면서 왜 DWORD(64bit, 32bit 컴파일 기준)으로 할당하는가 정말 많은 고민을 했다.

WORD단위로 데이터를 할당한다면 (초기 할당에 한정적이지만) 충분히 효율적으로 메모리를 분배할 수 있다고 생각했다.
심리적인 문제로 필요한 데이터량을 어느정도 비슷하거나 같은 값으로 할당해서 사용할 것이다 라는 추측도 들어있었다.

  • page 크기인 4kb와 관련이 있을까?
  • 외부 단편화 문제때문에? 내부 단편화보다 외부 단편화 문제가 훨씬 큰 영향이 있나?
    • 이건 동료와의 이야기를 통해 그렇다 라고 판단했다.
  • long unsigned int 는 8byte 크기니까 이를 고려해서?
    • malloc의 인자로 넣는 값은 주로 sizeof를 사용하기 때문에 이도 확신하지는 못했다.

내가 내린 결론은 WORD 단위로 할당하면 malloc을 수행하는 과정에서 추가적인 계산이 필요하기 때문이다.

WORD(32bit)로 블록을 나누어 할당한다면 malloc(sizeof(int))를 요청했을 때 헤더 4byte만 가득찬 한블록에 payload로만 가득차는 경우가 생긴다.

이때는 어떻게 할것인가? 하나의 블록을 더 만들어서 head(4) + payload(4)로 구성해서 반환해 줄 것이다.

그럼 어떤일이 일어나는가?
어떠한 요청이 오든 payload를 원하는 크기 k 만큼 공간을 확보하고, 앞에 header를 붙여서 반환해 줄 것이다.

그럼 우리가 block단위로 할당할 필요가 있을까? 내 생각엔 주객전도라고 생각한다. (block단위로 끊어서 주려는 개념인데, 그냥 원하는 만큼 던져주는 방식이 된다.)

추가로 block 이 WORD 단위로 할당되어 원하는 값만큼만 주게된다면 사용자의 입력값(원하는 메모리의 공간 크기)에 따라 외부 단편화 문제가 크게 좌우된다. (나는 충격완충장치가 사라진다고 이해했다.)

그래서 최소한 2WORD단위로 블럭을 만들어서 제공한다! 라고 생각했다.

profile
amazing idiot

0개의 댓글