019

메모리 관리 (Memory Management)

메모리 관리(Memory Management)는 하나의 물리적인 메모리 공간에서 여러개의 프로세스를 어떻게 돌릴 것인가 관리하는 것을 뜻합니다.

메모리 관리에 대해 공부하기 전, 먼저 ‘주소 공간’ 및 ‘주소 바인딩’에 대한 개념에 대해 먼저 짚고 넘어가도록 하겠습니다.



01. 주소 바인딩

01-1. 논리적 주소 vs 물리적 주소

논리적 주소(가상 주소, Logical address) 공간

  • 프로세스마다 독립적으로 가지는 주소 공간
  • 각 프로세스마다 0번지부터 시작
  • CPU가 보는 주소 → 논리적 주소

→ 각 프로세스 관점에서 자신이 가지고 있는 메모리 크기입니다.

물리적 주소(Physical address) 공간

  • 메모리에 실제로 올라가는 위치
  • 보통 메모리의 낮은 주소 영역에는 운영체제가. 높은 주소 영역에는 사용자 프로세스가 올라간다.

→ 메인 메모리의 용량이 512MB라고 하면, 그 용량 자체를 의미합니다.


01-2. 주소 바인딩

프로그램은 디스크에 Binary Executable File 형태로 존재하는데요.
프로그램의 실행은 즉 프로세스의 컨텍스트가 메모리에 올려지고, CPU에 의해 실행되는 것을 의미합니다.

즉, 프로세스가 실행되게 되면 해당 프로세스가 가진 명령어들과 데이터를 메모리에 올리고 올려진 메모리들을 사용하고
프로세스가 종료되면 메모리가 헤제되어 다른 프로세스들이 메모리를 사용할 수 있습니다.

Untitled

프로그램 컴파일과 어셈블링 과정이 끝나면 우선적으로 logical Address가 부여됩니다.
(프로그램 실행에 필요한 라이브러리들이 로드되지 않은 상태)

Linking 과정이 일어나면, 프로그램을 실행하기 위한 코드 조각들(라이브러리 탐색)을 불러옵니다.

마지막으로 프로그램이 실제로 로드되어 사용될 때, Physical address에 매핑됩니다.

이 때, 물리 메모리에 할당되는 공간은 하위 메모리부터 채워져 나가며,
MMU라는 하드웨어 레지스터에 의해 주소 변환이 이루어집니다.


이러한 주소 변환을 주소 바인딩이라고 합니다.

즉, 프로세스의 논리적 주소를 물리적 메모리 주소로 연결하는 작업을 말합니다.


Symbolic address → Logical address(Here) → Physical address

  • Symbolic address : 프로그래머 입장에서 사용하는 주소, 변수 이름과 같은 형태의 주소

주소 바인딩의 방식은 프로그램이 적재되는 물리적 메모리의 주소가 결정되는 시기에 따라 3가지로 분류할 수 있습니다.


[1] Compile time binding (컴파일 타임 바인딩)

  • 프로그램을 컴파일할 때에, 물리적 메모리 주소가 결정되는 주소 바인딩 방식
  • 컴파일을 하는 시점에 해당 프로그램이 물리적 메모리의 몇 번지에 위치할 것인지 결정하므로
    프로그램이 절대 주소로 적재된다는 뜻에서 절대 코드 생성 바인딩 방식이라 부름.
  • 물리적 메모리의 위치를 변경하고 싶다면 재컴파일 해야 한다.
  • 현대의 시분할 컴퓨팅 환경에서 거의 사용하지 않는다.

[2] Load time binding (로드 타임 바인딩)

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

[3] Execution time binding (= Runtime binding, 실행 시간 바인딩)

  • 프로그램이 실행을 시작한 후에도 물리적 메모리 상 위치를 변경할 수 있는 바인딩 방식
  • CPU가 주소를 참조할 때 마다, 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지 확인 → MMU(주소 매핑 테이블)을 사용
  • 기준 레지스터, 한계 레지스터 등과 같은 하드웨어적 자원이 필요

Untitled 1


01-3. MMU (Memory Management Unit)

위에서 말한 것 처럼, 프로세스의 논리적 주소는 실행 시점에 어떠한 하드웨어에 의해 물리적인 주소 공간으로 매핑되는데요,

이때 Relocation Register과 Limit Register라는 하드웨어가 주소 매핑에 사용되며

MMU register는 이 두 가지 레지스터의 값을 더하여 물리적 주소 공간을 지정해주는 레지스터를 뜻합니다.

Untitled 2

Relocation Register는 현재 사용 가능한 물리 메모리의 가장 하위 주소를 가지고 있으며,

Limit Register는 논리적 주소의 범위를 가지고 있습니다.

즉 Relocation register 값에서부터 Relocation register + Limit Register까지의 범위가 논리적 주소가 물리적 주소에 매핑되는 구간이 됩니다.

→ 이 기법을 MMU 기법이라 합니다.


01-4. MMU 기법

MMU를 사용한 기법을 MMU Scheme라고 하는데,

사용자 프로세스가 CPU에서 수행되며 생성하는 모든 주소 값에 대해 기준 레지스터의 값을 더하는 방식을 말합니다.

Untitled 3

[1] CPU가 논리적 메모리 346번지에 있는 내용을 달라고 하면, MMU는 Limit, relocation 2개의 레지스터를 가지고 변환을 하게 됩니다.

[2] 이때, 실제 물리적 메모리의 시작 위치와 논리적 메모리 주소를 더한 값을 CPU에게 전달합니다.

[3] relocation register가 가지고 있는 물리적 메모리의 시작 위치 (접근할 수 있는 물리적 메모리 주소의 최솟값) 부터
limit register가 가지고 있는 논리적 주소의 범위 (프로그램의 크기) + 물리적 메모리의 시작 위치 까지의 범위를 넘어서 주소를 요청하면 안됩니다.

Untitled 4

[4] 위 순서도와 같이 CPU가 요청한 논리적 주소 값을 limit register와 비교하여 범위를 넘어서면 Trap을 발생시켜 프로세스를 강제 종료합니다.

[5] 범위를 넘지 않을 경우에는 relocation register의 값을 더해 물리적 주소로 변환합니다.


즉, 사용자 프로그램이나 CPU는 논리적 주소만 다루므로, 실제 물리적 주소를 알 필요가 전혀 없습니다.

변환 작업은 MMU가 해주기 때문이죠.



02. 메모리 관리 관련 용어


메모리 관리와 관련된 여러 용어들에 대해 살펴보겠습니다.

  1. Dynamic Loading
  2. Overlays
  3. Swapping
  4. Dynamic Linking


02-1. Dynamic Loading (동적 로딩)

프로세스 전체를 메모리에 미리 다 올리는 것이 아닌, 해당 루틴이 불려질 때 메모리에 load되는 방식 입니다.

  • Memory Utilization 향상
  • 가끔씩 사용되는 많은 양의 코드일 경우에 유용합니다 (ex) 오류 처리 루틴)
  • 운영체제의 특별한 지원 없이 프로그램 자체에서 구현이 가능하며, 운영체제가 라이브러리를 통해 지원할 수도 있다.


02-2. Overlays

프로세스의 부분 중 실제 필요한 정보만을 메모리에 올리는 기법 입니다.

  • 프로세스의 크기가 메모리보다 클 때 유용
  • 운영체제의 지원 없이 사용자에 의해 구현
    (작은 공간의 메모리를 사용하던 초창기 시스템 → 프로그래머가 직접 구현 (상당히 복잡))

동적 로딩과의 차이점

  • 동적 로딩 : 다중 프로세스 환경에서 메모리에 더 많은 프로세스를 동시에 올려놓고 실행하기 위한 용도
  • 오버레이 : 단일 프로세스만을 메모리에 올려놓는 환경에서 메모리 용량보다 큰 프로세스를 올리기 위해 어쩔 수 없는 선택


02-3. Swapping (스와핑)

메모리에 올라온 프로세스의 주소 공간 전체를 디스크의 backing store로 쫓아내는 방식입니다.

다시 말해서, 한정된 물리적 메모리 공간 안에 여러 프로세스 메모리를 올리기 위해서
기존 프로세스를 Backing store에 임시로 옮겨두고 다른 프로세스를 처리한 뒤, 다시 해당 프로세스를 불러오는 일련의 과정을 말합니다.

Backing store : 하드 디스크와 같이 많은 프로세스를 담을 만큼 충분히 빠르고 큰 저장 공간


02-3-1. swap이 일어나는 과정

[1] 일반적으로 중기 스케줄러가 swap out할 프로세스 결정

  • 우선순위가 낮은 프로세스를 swap out, 높은 프로세스를 swap in하는 우선 순위 기반 CPU 스케줄링을 주로 이용

[2] 만약 컴파일 타임 바인딩, 로드 타임 바인딩이 사용되고 있다면, swap out 되었다가 swap in이 되면 원래 존재하던 메모리 위치에 올라가야 합니다.

  • 물리적 메모리 위치 변경 불가

[3] 런타임 바인딩이 사용되고 있다면, 추후 빈 메모리 아무 곳에나 프로세스를 올릴 수 있습니다. → Swapping 에 적합


swap time은 디스크의 탐색 시간, 회전 지연 시간보다는 디스크 섹터에서 실제 데이터를 읽고 쓰는 전송 시간 (transfer time)이 대부분을 차지합니다.

하드디스크의 경우 램처럼 메모리에 대한 접근 속도가 빠르지 않으므로, 이 시간은 꽤나 클 수 밖에 없습니다.

Untitled 5


02-4. Dynamic Linking (동적 연결)

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

동적 연결은 컴파일을 통해 생성된 object file과 라이브러리 파일 사이의 연결(linking)을 프로그램의 실행 시점까지 지연하는 기법입니다.

정적 연결 vs 동적 연결

  • 정적 연결
    • 라이브러리가 프로그램의 실행 파일 코드에 포함되어, 실행 파일이 커진다
    • 동일한 라이브러리를 각각의 프로세스가 메모리에 다 올리므로 메모리 낭비가 심하다 (ex) printf 함수의 라이브러리 코드)
  • 동적 연결
    • 실행 파일에 라이브러리 코드가 포함되지 않으며, 프로그램이 실행되면서 라이브러리 함수를 호출해야 할 때가 되어서야 라이브러리 link가 이루어진다.
    • 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub라는 작은 코드를 준다.
    • 라이브러리가 이미 메모리에 올라와 있으면 해당 루틴의 주소로 가고 없으면 디스크에서 읽어온다.
    • 운영체제의 도움이 필요하다.


reference


운영체제와 정보 기술의 원리 - 반효경

https://studyandwrite.tistory.com/17

https://dheldh77.tistory.com/entry/운영체제메모리-관리-전략Memory-Management-Strategy

카테고리: ,

업데이트:

댓글남기기