Skip to content

Memory Management Units (MMU)

Address 종류

memory에 접근하기 위해서는 address가 필요하며, 이 address를 지정하는 방식은 다음의 2가지로 크게 나뉨.

Logical Address ( = Virtual Address )

  • 기본적으로 Process마다 독립적으로 할당되는 주소 공간
  • 각 process마다 0부터 시작한다.
  • CPU 와 program, programmer 가 사용하는 address!

Physical Address

  • 메모리에 실제 올라가는 위치

MMU

CPU (or Program)가 Physical Memory에 접근하는 것을 관리하는 하드웨어 장치.

MMU를 통해 Program(or CPU)가 사용하던 logical address(=virtual address)가 실제 Memory의 physical address로 변환됨.

  • logical address를 physical address로 변환하는 작업을 address translation이라고 하며 MMU가 담당함.
  • MMU는 각 Program (or Process)에 해당하는 index register(=base register)의 값을 가지고 있음 : Segment table의 base address (=해당 process의 사용하는 physical address의 시작 address, STBR)
  • 동시에 각 Process가 사용가능한 범위의 한계 address도 알고 있음: limit register.
  • MMU는 OS에 대해 transparent하지 않음.

현재는 CPU와 MMU가 하나의 chip으로 통합되어 있어서 마치 phsycal memory가 CPU에서 나오는 것처럼 보일 수 있으나 CPU의 core에서는 logical address만을 사용하며, 이를 MMU가 table lookup등을 통해 해당 process의 실제 physical address로 변환해줌.

주의할 건 logical address와 physical address간의 변환은 MMU 즉 HW상에서 이루어진다는 점으로 OS는 여기에 관여하지 않음.

MMU는 von Neumann Architecture와 Havard Architecture의 구분을 모호하게 만든다.
하나의 bus를 사용하면서도 MMU는 data memory영역과 instruction memory 영역의 구분 이 가능함.
(MMU를 통해 여러 process별로 사용하는 memory 영역이 구분가능한 virtual memory가 가능해짐.).


Logical Address 와 Symbolic Address

CPU core에서 데이터에 접근하기 위해 사용하는 logical address가 programmer가 사용하는 address임.

  • 하지만 오늘날 대부분의 programmer는 low level programming(기계어, assembler)를 하지 않기 때문에 variable을 통한 symbolic address를 사용 함.
  • 때문에 실제로 logical address를 사용하는 것은 compiler, linker, interpreter 등의 program임.
  • 이같은 이유로 CPU가 사용한다고 표기되거나 program이라고 표기됨.

Address Binding

Symbolic address와 logical address, physical address 간의 binding을 의미함.

source code에서는 symbolic address가 사용됨.

  • Add A B와 같이 A, B로 memory에 저장된 데이터를 가르킴.

compiler 및 linker에 의해서 symbolic address는 logical address로 변환됨 (symbolic address와 logical address간의 binding).

  • logical address는 cpu와 low level program language를 사용하는 programmer가 사용함.

logical address는 해당 process가 loader에 의해 load되거나, 아니면 실행될 때 MMU등을 통해 physical address로 binding이 됨

  • load time binding : memory에 적재시 binding.
    • loader 가 memory address 부여
    • compiler가 재배치가능코드(relocatable code) 를 생성
    • 메모리에 비어있는 공간 어디에도 올라갈 수 있음
  • run time binding : 실행시 binding.
    • run time 중에도 process의 memory 위치가 변경가능함.
    • cpu에서 memory 접근이 이루어질 때마다 MMU에 의해 address translation이 이루어짐.

과거에는 compile과정에서 physical address가 결정되던 Complie Time Binding도 있었음. compiler가 relocatable code가 아닌 absolute code를 생성하는 방식으로 시작위치를 변경하려면 컴파일을 다시 해야함.

MMU 등을 통한 virtual memory는 OS가 문제가 발생한 process의 memory영역을 파악하고 해당 resource를 다시 환수할 수 있음. 때문에 전체 system이 특정 process들의 문제로 down되는 것을 막아주는 효과가 있다.
실제로 VMS (Virtual Memory System)이 도입 된 이후로 C 프로그래밍 실습시간에서 pointer문제로 인해 OS가 뻗는 상황이 일어나는 횟수가 어마어마하게 줄어들었다.


Paging과 Segmentation

Multiprogramming system의 경우, memory에 여러 process들이 적재되어야 함.

각 process가 사용하는 memory영역이 구분이 되어야 함.

이같은 이유와 함께 오늘날 OS에선 하나의 process가 사용하는 physical memory 영역도 효율적인 사용을 위해 noncontiguous allocation이 이루어짐.

이를 위해 memory 영역은 특정 단위로 나뉘어지게 된다

이때 나누는 단위가 segment와 page 두가지가 존재함.

Paging

Memory를 동일한 크기로 자르며, page table이 base register와 limit reigster 등으로 관리됨.

  • Paging은 Virtual memeory와 Physical memory 공간을 고정 크기의 작은 block으로 나눈다.
  • Virtual memeory 공간의 block은 page라고 하고 Physical memory 공간의 block은 frame이라고 한다.
  • 각 page를 frame에 하나씩 매핑할 수 있어서 대량의 메모리를 연속되어 있지 않은 frame들에 나눠서 놓을 수 있다.

다음 그림은 여러 process의 virtual memory와 physical memory의 관계를 보여줌.

  • paging table을 MMU가 관리함.

여러 process가 데이터를 공유해야하는 경우, shared page등을 제공.

paging에선 internal fragmentation(내부파편화)가 발생함. 페이지 크기가 100 바이트이면 크기가 105 바이트인 프로그램은 페이지 2개를 사용하고 95 바이트가 낭비됨.

또한 일부 CPU가 사용하지 않는 영역은 secondary memory에 둘 수도 있음.

Segmentation

Paging과 달리 의미 단위(segment)로 Memory를 자름(ex. 스택, 데이터, 코드 / 함수 하나하나 / 프로그램 전체).

Segment table에서 각 segment별로 segment-number, base, limit등의 D정보를 관리한다.

각 segment별로 protection bit를 할당하여 접근권한을 지정할 수 있음.

segmentation의 경우 external fragmentation(외부단편화)가 발생함.

외부 단편화(external fragmentation)는 프로세스가 메인 메모리에서 소멸할 때 다른 프로세스가 올라오는 과정에서 발생한다. 프로세스 소멸 후 그 소멸한 프로세스 파티션 자리에 그보다 작은 프로세스가 올라온다면 남은 파티션이 생긴다. 예를 들어, 위 그림에서 d~f 상황을 보면, 14M짜리 프로세스2가 소멸되면서 8M짜리 프로세스4가 올라오는데 이 과정에서 6M 크기의 남는 파티션이 생긴다. 전체적인 메인메모리를 보면 10M 크기의 메모리가 남는데 10M 크기의 프로세스는 올라갈 수가 없다. 이러한 현상이 메인 메모리 상에서 반복해서 발생하다보면 말 그대로 구멍이 숭숭 뚤린 메인 메모리가 될 것이다. 그 구멍(남는 파티션)들은 각각 사용할 수 있지만 한 프로세스가 올라가기에는 각각의 크기가 너무 작아 올라갈 수 없는 이런 현상을 외부 단편화라고 한다.

Paging vs. Segmentation

Segmentation의 경우 가변길이로 memory가 나누어지기 때문에 external fragment가 보다 쉽게 발생한다는 단점이 있으나 paging에 비해 상대적으로 table 크기가 작은 장점을 가지며 메모리에 로드될 수 있는 프로그램의 숫자에 제한이 없다는 장점 등을 가짐.

오늘날 OS는 paging과 segmentation이 같이 사용됨 (segment로 먼저 나누고 한 segment가 page로 나누어지는 방식등이 사용됨)

References