Published on

메모리상의 데이터 배치

Authors
  • avatar
    Name
    유사공대생
    Twitter

메모리

메모리에는 명령어만 담는 게 아니라 데이터도 담는다. 이 경우에 데이터는 정적(static) 데이터다. '정적'이라는 말은 프로그램을 작성할 때 얼마나 많은 메모리가 필요한지 알고 있다는 뜻이다. 그리고 프로그램을 실행할 때 스택을 위한 메모리가 필요하다는 사실도 배웠다. 따라서 이런 여러 데이터 영역을 서로 충돌하지 않게 배치할 수 있어야 한다.

image

위 그림은 MMU가 없을 때 폰 노이만 구조와 하버드 구조의 전형적인 메모리 배치를 보여준다. 유일한 차이는 하버드 구조에서는 명령어가 별도의 메모리에 존재한다는 점뿐이다.

프로그램이 메모리를 사용하는 방법이 한 가지 더 있다. 대부분의 프로그램은 동적(dynamic) 데이터를 다뤄야 한다. 동적 데이터는 프로그램을 실행하기 전에는 크기를 알 수 없는 데이터를 말한다.

예를 들어, 메시징 시스템은 저장해야 할 메시지 개수나 각 메시지의 크기를 미리 알 수 없다.

image

동적 데이터는 주로 정적 데이터가 차지하는 영역의 바로 위 영역에 쌓이며, 이를 힙(heap)이라고 부른다. 더 많은 데이터를 저장해야 할 경우 스택은 아래로 자라나는 반면, 힙은 위로 자라난다. 힙과 스택이 서로 충돌하지 않게 하는 것이 중요하다. 메모리 배치에는 몇 가지 사소한 변형이 있다.

예를 들어, 일부 프로세서는 메모리의 시작 부분이나 끝부분에 인터럽트 벡터를 저장하는 영역이나 온칩 I/O 장치를 제어하기 위한 레지스터를 (메모리 주소를 사용해 접근할 수 있게) 확보해두기도 한다.

마이크로컴퓨터에서는 MMU가 없는 경우가 많기 때문에 이런 메모리 배치를 자주 볼 수 있다. MMU가 쓰이는 경우에는 명령, 데이터, 스택이 각기 다른 물리적 메모리 페이지에 매핑되고, 필요에 따라 할당된 크기를 변경할 수 있다. 하지만 프로그램이 바라보는 메모리(가상 메모리)는 여전히 앞에서 설명한 것과 같은 메모리 배치를 사용한다.