컴퓨터 아키텍처와 운영체제

허상무·2021년 12월 13일
0

메모리상의 데이터 배치

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

그림 5-15는 MMU가 없을때 폰 노이만 구조와 하버드 구조의 전형적인 메모리 배치를 보여준다.

유일한 차이

하버드 구조에서는 명령어가 별도의 메모리에 존재한다는 점뿐인다.

MMU (Memory management Unit)

메모리 관리 장치는 CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품이다. 가상 메모리 주소를 실제 메모리 주소로 변환하며, 메모리 보호, 캐시 관리, 버스 중재 등의 역할을 담당하며 간단한 8비트 아키텍처에서는 뱅크 스위칭을 담당하기도 한다

프로그램이 메모리를 사용하는 방법이 한 가지 더 있다.
대부분의 프로그램은 동적 데이터를 다뤄야 한다. 동적 데이터는 프로그램을 실행하기 전에는 크기를 알 수 없는 데이터를 말한다.
그림 5-16처럼 동적 데이터는 주로 정적 데이터가 차지하는 영역의 바로 위 영역에 쌓이며, 이를 힙heap이라고 부른다.
더 많은 데이터를 저장해야 할 경우 스택은 아래로 자라나는 반면, 힙은 위로 자라난다. 힙과 스택이 서로 충돌하지 않게 하는 것이 중요하다. 메모리 배치에는 몇 가지 사소한 변형이 있다. 예를 들어, 일부 프로세서는 메모리의 시작 부분이나 끝부분에 인터럽트 벡터를 저장하는 영역이나 온칩 I/O 장치를 제어하기 위한 레지스터를 확보해두기도 한다.


그림 5-16 힙이 있는 경우의 메모리 배치

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

프로그램 실행

프로그램은 라이브러리뿐 아니라, 여러 조각으로 이뤄진다. 프로그램 전부를 한 파일에 저장할 수도 있지만, 이를 여러 파일로 나눠놓는 편이 더 좋은 이유가 있다. 가장 큰 장접은 여러 사람이 한 프로그램의 여러부분을 동시에 개발할 수 있다는 점이다.

프로그램을 여러 조각으로 나누면 이 조각을 하나로 엮거나 연결할 방법필요
각 프로그램을 링크하기 편한 파일로 나누고,
링커라는 프로그램을 사용해 여러 조각을 하나로 연결해 실행함.

과거에는 라이브러리를 필요한 함수가 들어 있는 파일로 간주해서 프로그램의 나머지 부분과 직접연결해 실행 파일을 만들었다. 이런 방식을 정적링크라고 한다.

정적 링크를 사용하면 같은 라이브러리 코드가 여러 실행 파일에 메모리를 낭비함

공유라이브러리를 용하는 동적링크

그래서 프로그래머들이 발명함.
MMU가 여러 프로그램이 같은 라이브러리를 공유할 수 있게 해줌.

공유 라이브러리에서 가져온 명령어는 이 라이브러리를 사용하는 모든 프로그램에서 공통적임
이로 인해 라이브러리 함수를 작성할 때 호출하는 프로그램의 스택과 힙을 사용하도록 함수를 설계해야만 함

프로그램에는 진입점이 있는데 프로그램의 첫 번째 명령어가 위치한 주소를 뜻함. 하지만 실제 프로그램이 가장 먼저 실행되는 명령어는
프로그램을 이루는 모든 부분이 하나로 합쳐져서 실행파일을 이룰 때 런타임 라이브러리가 추가 되고 이 런타임 라이브러리에 있는 명령어가 먼저 실행되고 나중에 진입점의 명령어가 실행됨

메모리 전력 소비

지금까지는 성능 측면에서 메모리에 접근했다 하지만 다른 점도 고려해야함.
데이터를 메모리에서 이리저리 옮기려면 전력이 소비된다.
데스크톱 컴퓨터에서는 문제될게 없지만 모바일 장치에서는 전력소비도 중요함.

0개의 댓글