메모리 관리

김땡땡
4 min readJun 17, 2018

메모리 하드웨어를 구성하는 다양한 방법 및 다양한 메모리 관리 기법

  • 메모리는 각각 주소가 할당된 일련의 워드 또는 바이트들로 구성된다.
  • 주 메모리와 CPU에 내장되어 있는 레지스터들은 CPU가 직접 접근할 수 있는 유일한 저장 장치.
  • 모든 실행되는 명령어와 자료들은 주 메모리와 레지스터에 있어야 한다.

주소의 할당

주소는 언제 어떻게 할당되는가

  • 주소 바인딩 : 한 주소 공간에서 다른 주소 공간으로 사상시키는 것
  • 컴파일 시간 바인딩: 프로세스가 메모리 내에 적재될 위치를 컴파일 시간에 알 수 있을 때 컴파일 시 바인딩
  • 적재 시간 바인딩:

프로세스가 메모리 내에 적재될 위치가 컴파일 시간에 알려지지 않았을 때 최종 바인딩을 적재 시간까지 연기한다.

  • 수행 시간 바인딩: 프로세스가 실행 중에 메모리 세그먼트에서 다른 세그먼트로 이동될 수 있다면 바인딩을 실행시간까지 연기한다.

논리와 물리 주소 공간

  • 논리적 주소 → 중앙처리장치(CPU)가 생성하는 주소
  • 물리적 주소 → 메모리에 나타나는 주소
  • 컴파일, 적재 시간 바인딩은 논리, 물리 주소가 같으나, 실행시간 바인딩 기법일 때 논리적 주소는 가상 주소라고 한다.

MMU(Memory Management Unit)

가상 주소에서 물리 주소로의 사상을 수행하는 하드웨어 장치

  • 단순한 기법 — 재배치 레지스터 사용
출처

동적 적재

루틴이 호출될 때까지 메모리에 적재되지 않고 재배치 가능한 적재 형태로 대기하게 해 동적으로 적재할 수 있도록 하는 것.

연결(linking)

프로그래머가 작성한 소스코드를 컴파일하여 생성된 목적 파일과 이미 컴파일된 라이브러리 파일들을 묶어 하나의 실행 파일을 생성하는 과정.

정적연결

작성한 소스 코드와 라이브러리 코드가 모두 합쳐져서 실행 파일 생성되어 크기가 크고 동일한 라이브러리를 각 프로세스가 개별적으로 메모리에 적재해야 하므로 물리적 메모리 낭비.

동적연결

컴파일을 통해 생성된 목적 파일과 라이브러리 파일 사이의 연결을 수행 시간까지 지연하는 기법이다.

  • 프로그램이 실행되면서 라이브러리 함수를 호출할 때가 되서야 라이브러리 연결
  • 호출하기 위해 라이브러리 루틴의 위치를 찾기 위한 stub 포함

※stub: 라이브러리를 어떻게 찾을 것인가를 알려주는 작은 코드

  • 운영체제의 도움이 필요하다.

스와핑(Swapping)

메모리에 올라온 프로세스의 주소 공간 전체를 디스크의 스왑 영역에 일시적으로 내려놓는 것.

  • 모든 사용자들의 모든 프로세스를 수용할 만큼 크고 빠른 디스크여야 한다.
  • 교체 시간의 대부분이 전송시간이다.

Contiguous Memory Allocation(연속 할당 방식)

주 메모리에서 프로세스를 올릴 때 그 주소 공간을 여러개로 분할하지 않고 물리적 메모리 한 곳에 연속적으로 적재하는 방식

  • 각 프로세스는 연속된 메모리 공간을 차지한다.
  • 사용자 프로세스에 의한 변화로부터 운영체제 코드 및 데이터보호가 필요하다.

→ 기준 레지스터와 한계 레지스터를 사용.

메모리 할당

초기의 메모리

프로세스가 도착하면 충분한 크기의 이용 가능한 블록을 찾아서 할당하고 나머지를 사용 가능한 부분으로 남긴다.

  • 입력 큐에 순서대로 배치

→ 남는 메모리가 자꾸 생겨 비효율적인 문제가 생김 — 외부단편화

→ 3가지 보완 할당 방법

  • 최초 적합 : 큰 첫번째 가용 공간에 할당
  • 최적 적합 : 충분히 큰 가용 공간들
  • 최악 적함 : 가장 큰 가용 공간을 할당

외부 단편화

프로세스들이 메모리에 적재되고 제거될 때, 작은 조각 자유공간이 남는 것

해결

  • 작은 가용 공간은 큰 요구에 할당 → 남는 부분이 내부 단편화
  • 압축

남은 단편들을 하나의 큰 블록으로 만든다. →재배치가 동적이고 수행시간에 이루어지는 경우만 가능

--

--