메모리 관리

불불이·2021년 4월 7일
0

들어가며

메모리 역시 주소를 통해 접근하는 저장장치이다. 이때의 주소란 서로 다른 위치를 구분하기 위해 사용하는 일련의 숫자로 구성된다. 행정구역을 표시하는 주소에서 '서울시 서대문구 이화여대길'와 유사한 의미이다. 이와같이 메모리를 어떠한 행정구역으로 나누어 관리할 것인지 살펴보고, 프로그램이 물리적 메모리에 어떻게 올라가서 주소를 할당받게 되는지 살펴보도록 하겠다.


주소 바인딩

프로세스의 논리적 주소를 물리적 메모리 주소로 연결시켜주는 작업

주소 바인딩의 방식은 프로그램이 적재되는 물리적 메모리의 주소가 결정되는 시기에 따라 세 가지로 분류

1. 컴파일 타임 바인딩

물리적 메모리 주소가 프로그램을 컴파일 할 때 결정되는 주소 바인딩 방식

  • 컴파일을 하는 시점에 해당 프로그램이 물리적 메모리의 몇번지에 위치할 것인지를 결정한다.
  • 프로그램이 절대적 주소로 적재된다는 뜻에서 이와 같은 주소 바인딩 방식을 절대코드를 생성하는 바인딩 방식이라고 말하기도 한다.
  • 단점 - 물리적 메모리의 위치를 변경하고 싶다면 컴파일을 다시 하는 수고가 필요, 현대에선 쓰이지 않는다.

2. 로드 타임 바인딩

프로그램의 실행이 시작될 때 물리적 메모리 주소가 결정되는 주소 바인딩 방식

  • 로더(사용자 프로그램을 메모리에 적재시키는 프로그램)의 책임하에 물리적 메모리 주소가 부여
  • 프로그램이 종료될 때까지 물리적 메모리상의 위치가 고정
  • 컴파일러가 재배치 가능 코드를 생성한 경우에 가능한 주소 바인딩 방식

3. 실행시간 바인딩

프로그램이 실행을 시작한 후에도 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식

  • CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지, 주소 매핑 테이블을 이용해 바인딩을 점검해야 한다. (4강)
  • 기준 레지스터와 한계 레지스터를 포함해 MMU라는 하드웨어적인 지원이 뒤받침되어야 한다.
  • MMU(memory management unit: 메모리 관리 유닛): 논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치

MMU 기법(MMU scheme)

mmu를 사용해 가장 기본적인 방식으로 주소 변환을 수행하는 것에 알아보자.

  1. CPU가 특정 프로세스의 논리적 주소와 기준 레지스터의 값을 더해 물리적 주소값을 얻어낸다.

  2. MMU 기법은 프로그램의 주소 공간이 물리적 메모리의 한 장소에 연속절으로 적재되는 것을 가정으로 한다.

  3. 따라서 그 프로그램이 적재되는 물리적 메모리상의 시작 주소만 알면 주소 변환을 쉽게할 수 있다.

  4. 재배치 레지스터에는 현재 CPU에서 수행중인 프로세스의 물리적 메모리 시작주소가 저장되어 있다.

  5. CPU가 논리적 주소 123번지에 있는 내용을 요청할 경우 재배치 레지스터에 저장된 23000이라는 값에 이 주소를 더해 물리적 메모리 23123번지에 있는 내용을 참조하게 된다.

  6. 물리적 메모리 23123번지에서 CPU가 요청한 정보를 찾게 된다.

만약 주소 공간을 벗어나는 경우가 발생한다면 메모리 보안이 이루어지지 않아 다른 사람이 수행 중인 프로그램 영역을 침범하여 치명적인 결과를 초래할 수 있다.

이를 예방하기 위해 한계 리지서터 라는 또 하나의 레지스터를 사용한다.

한계 레지스터

프로세스가 자신의 주소 공간을 넘어서는 메모리 참조를 하려고 하는지 체크하는 용도

  • 현재 CPU에서 수행 중인 프로세스의 논리적 주소의 최댓값, 즉 그 프로세스의 크기를 담고 있다.
  • 따라서 CPU가 메모리 참조 요청을 했을 때 그 주소가 한계 레지스터 값보다 큰지를 먼저 체크해 운영체제 및 다른 사용자 프로세스가 존재하는 물리적 메모리 영역에 대한 보안을 유지하게 된다.

메모리 관리와 관련된 용어

동적로딩

여러 프로그램이 동시에 메모리에 올라가서 수행되는 다중 프로그래밍 환경에서 메모리 사용의 효율성을 높이기 위해 사용하는 기법 중 하나

프로세스가 시작될 때 그 프로세스의 주소 공간 전체를 메모리에 다 올려 놓는 것이 아니라 메모리를 좀 더 효율적으로 사용하기 위해 해당 부분이 불릴 때 그 부분만을 메모리에 적재하는 방식을 사용한다.

실제로 프로그램의 코드 중 상당 부분은 오류 처리루틴과 같이 아주 특별한 경우에만 가끔씩 사용되는 방어용 코드이다. 따라서 프로세스의 주소 공간 전체를 물리적 메모리에 올리는 경우 자주 발생하지는 않지만 많은 메모리를 사용하는 이러한 오류 처리 코드가 메모리 공간의 상당 부분을 차지하게 되어 메모리의 낭비가 초래된다.

동적연결

컴파일을 통해 생성된 목적 파일과 라이브러리 파일 사이의 연결을 프로그램의 실행 시점까지 지연시키는 기법


물리적 메모리의 할당 방식

운영체제의 상주 영역

profile
https://nibble2.tistory.com/ 둘 중에 어떤 플랫폼을 써야할지 아직도 고민중인 사람

0개의 댓글