본문 바로가기
Computer Science/운영체제

[OS] 메모리란? (메모리 주소 종류, 주소 바인딩, MMU의 기능과 역할, 메모리 할당 방식)

by 그적 2024. 2. 2.

목차

  • 메모리란?
  • 메모리 주소 종류
    • 물리적 주소
    • 논리적 주소
    • 논리적 주소를 사용하는 이유
  • 메모리 주소 바인딩
    • 컴파일 시점 주소 바인딩
    • 로드 시점 주소 바인딩
    • 런타임 시점 주소 바인딩
  • MMU의 기능과 역할 (+ MMU가 잘못된 메모리 주소를 참조하려고 한다면?)
  • 메모리 할당 방식
    • 연속적 할당
    • 비연속적 할당

 


1. 메모리란?

CPU에 의해 작업이 처리되기 위해서는 프로그램이 CPU가 접근할 수 있는 위치에 존재해야 한다. 프로그램을 실행하기 위해서는 디스크에 저장되어 있던 프로그램을 메모리에 적재해야 한다는 말을 들어본 적이 있을 것이다. 이것은 쉽게 설명해 공부를 할 때 책상에서 책을 펼칠 수 있는 공간으로 비유할 수 있으며, 책상의 공간이 한정되어 있기 때문에 나중에 공부할 책은 책장에 꽂아두는 상태로 비유할 수 있다.

 

결국 메모리는 프로그램을 실행시킬 수 있는 공간이며, CPU가 접근하여 작업할 수 있는 영역인 것이다.

 


2. 메모리 주소 종류

프로세스 주소는 물리적 주소(Physical Address)와 논리적 주소(Logical Address 혹은 Virtual Address)로 나뉜다.

물리적 주소는 프로그램이 적재된 메모리의 실제 주소이다. 논리적 주소는 프로세스 내에서 사용되는 주소이며, 프로그램이 실행되기 전까지 물리적 주소를 알 수 없기 때문에 0부터 시작한다.

 

물리적 주소를 이용해 직접 메모리에 접근하면 될 텐데, 왜 논리적 주소를 사용하는 것일까?

 

그 이유는 물리적 주소가 변화하기 때문이다. 메모리의 공간을 확보하기 위해 swap-out 동작으로 다른 프로세스를 임시로 디스크에 보내고,  작업에 필요한 프로세스를 실행시키기 위해 swap-in 동작으로 메모리로 다시 불러오기도 한다. 이 과정에서 메모리에 적재된 프로세스의 주소(= 물리적 주소)가 바뀌기 때문에, 프로세스 내부의 데이터나 코드의 주소 또한 바뀌게 된다. 논리적 주소는 프로세스의 시작 주소에서부터 상대적인 위치로 주소를 파악할 수 있는데, 프로세스의 시작 주소를 한 번만 변경하면 되므로 논리적 주소를 이용하는 것이다.

 


3. 메모리 주소 바인딩 (Address Binding)

프로그램이 메모리의 어떤 물리적 주소에 적재될지 결정하는 과정을 주소 바인딩이라고 한다.  앞서 프로세스가 메모리에 적재됐다가 해제되는 과정(swap-in, swap-out)을 반복한다고 했는데, 주소 바인딩 시점에 따라 원래 메모리 위치로 swap-in 해야 하는지 혹은 아무 위치에 swap-in 해도 되는지 결정된다.

 

1) 컴파일 시점 주소 바인딩

  • 컴파일 시에 물리적 메모리 주소가 정해진다.
  • 프로세스가 메모리의 어느 위치에 들어갈지 알고 있다면, 컴파일러가 절대 주소를 생성해 프로세스를 위치시킨다.
  • 물리적 주소와 논리적 주소가 동일하다.
  • 현대 시분할 컴퓨터에서는 사용하지 않는 주소 바인딩 방식이다.

(단점)

  • 주소가 고정되어 있기 때문에, 프로세스 위치가 변경된다면 재컴파일해야 한다.
  • 로드하려는 위치에 다른 프로세스가 존재한다면 프로세스를 메모리에 로드할 수 없다.

 

2) 로드 시점 주소 바인딩

  • 프로세스가 메모리에 로드될 때 물리적 주소가 정해진다.
  • 물리적 주소와 논리적 주소가 다르며, 컴파일된 변수나 명령어의 주소는 base register를 기준으로 정해진다.
  • 현대 시분할 컴퓨터에서는 사용하지 않는 주소 바인딩 방식이다.

(단점)

  • 프로세스 내에 메모리 주소를 참조하는 명령들이 많아, 로딩 시간이 길어질 수 있다.
  • 프로세스가 차지하는 메모리 공간이 커져 다른 프로세스의 메모리 영역을 침범할 수 있다.

 

3) 런타임 시점 주소 바인딩

  • 매번 명령어가 실행될 때마다 물리적 주소가 정해진다.
  • CPU가 주소를 참조할 때마다 Address Mapping Table을 이용해 물리적 메모리 위치를 확인한다.
  • MMU(Memory Management Unit)라는 하드웨어 장치를 통해 논리적 주소를 물리적 주소로 바꿔준다.

 


4. MMU의 기능과 역할

MMU는 Memory Management Unit의 약자로, 런타임 시점 주소 바인딩을 할 때 논리적 주소를 물리적 주소로 바꿔주는 기능을 한다. 뿐만 아니라, 논리적 주소가 올바른 물리적 메모리 주소를 참조하려고 하는지 검증하는 역할도 수행한다. 주소 매핑 과정은 매우 빈번하게 일어나기 때문에 MMU는 하드웨어적으로 구현되어 있다. 

 

Limit 레지스터와 Base 레지스터(= Relocation 레지스터)는 MMU에서 주소를 변환할 때 사용된다. Limit 레지스터는 프로세스의 크기를 가지고 있어 논리적 주소의 범위로 잘못된 메모리 주소가 참조되지 않도록 검증하고, Base 레지스터는 프로세스가 메모리에 올라간 시작 주소를 가지고 있어 논리적 주소를 물리적 주소로 변환한다.

 

물리적 주소 = Base 레지스터 + Limit 레지스터

 


5. 물리적 메모리 주소 범위를 벗어나 참조하려고 한다면?

Limit 레지스터에 담긴 프로세스의 크기가 Base 레지스터보다 크다면, 물리적 메모리 주소 범위를 벗어난 상태이다. 스택은 높은 주소에서 낮은 주소로 데이터가 저장되기 때문에, 프로세스 시작 주소보다 프로세스 크기가 더 클 경우에는 할당받은 메모리 공간을 초과한 것이며 다른 프로세스의 메모리 영역을 침범할 수 있는 상황이 발생한다.

 

만약 이러한 상황이 발생했다면 Memory Portection Fault 혹은 Segmentation Fault를 발생시킨다. 이것은 CPU가 예외상황이 발생했다는 인터럽트의 일종으로, 커널에 있는 Exception Handler가 이를 처리할 수 있도록 제어권을 넘긴다.

 


6. 메모리 할당 방식

물리적 메모리 할당 방식은 크게 연속적 메모리 할당과 비연속적 메모리 할당이 있다.

 

연속적 할당은 프로세스가 필요로 하는 데이터를 메모리 상에 연속적으로 할당하는 방식이며, 0부터 시작하는 논리적 주소(Limit 레지스터)에 Base 레지스터를 더하는 방식이다. 프로세스들을 메모리에 올리기 위해 미리 메모리 공간을 분할해 두는데, 고정된 크기로 나누는 고정 분할 방식과 프로세스의 크기를 고려해 나누는 가변 분할 방식이 있다.

 

비연속적 할당은 프로세스가 필요로 하는 데이터를 연속적인 주소 공간이 아닌, 각자 동떨어진 위치로 주소를 지정할 수 있는 방식이다. 프로그램을 페이징 혹은 세그먼트 단위로 나누어 페이징/세그먼트 테이블을 통해 주소를 매핑한다.

 

  • 연속적 할당
    • 고정 분할 방식
    • 가변 분할 방식
    • Buddy 시스템 (고정 분할과 가변 분할 방식의 중간)
  • 비연속적 할당
    • 페이징
    • 세그먼트

 

댓글