Memory Management
Goals
- 프로그래밍을 편리하게 하기 위하여 추상화 기능을 제공한다.
- 개발자가 실제 물리적인 메모리 주소를 모르더라도 쉽게 사용할 수 있게 한다.
- overhead가 작은 메모리 할당 방식을 택함으로써 메모리 효율을 높인다.
- 프로세스 간에 isolation을 제공한다(memory protection)
Batch programming
- Monitor라는 관리 소프트웨어가 프로그램을 메모리로 올리고, 작업이 끝나면 새로운 프로그램을 올린다.
- 프로그램 하나가 메모리 전체를 다 사용한다.
- 프로그램이 physical address(실제 RAM의 주소)를 직접 사용한다
Multiprogramming
- 하나의 메모리에 여러 개의 프로세스가 실행되면서 메모리 관리의 개념이 등장하였다.
필요조건
- Protection : 프로세스가 사용할 수 있는 메모리 영역을 제한해야 한다
- Fast translation : 보호 체계가 있어도 메모리 조회는 빨라야 한다.
- Fast context switching : 메모리 hardware update는 빨라야 한다.
Issues
- multiple process를 지원해야 한다.
- 각각의 프로세스는 Logically contiguous space를 가져야 한다.
- 실제 메모리보다 큰 영역을 사용하는 프로세스도 실행가능해야 한다.
- Protection / Sharing / Support for multiple regions per process / Performance
Solution : Virtual Memory(VM)
- Virtual address / Logical Address : 프로세스 내부에서 사용하는 메모리 주소
- Physical address : 실제 RAM에 존재하는 물리적인 주소
Key point
- Virtual address와 physical address를 isolate한 뒤 어떻게 mapping하여 관리하는지
- 실제 RAM의 크기보다 더 큰 메모리 요구량을 가진 프로세스도 실행 가능하게 하는지
VM은 전체 메모리 주소를 Physical memory에 할당하지 않고 실행 가능하게 한다.
- 더 적은 RAM을 사용하여 프로세스를 실행시킬 수 있다.
VM은 프로세스 간을 isolate한다.
- 각 프로세스는 isolated address를 가지며 다른 프로세스가 볼 수 없다.
Binding of instructions and Data to Memory
Binding
- 명령어에 쓰인 메모리 주소를 실제 RAM의 주소와 Mapping한다.
- 메모리 주소는 명령어를 실행할 때 사용된다.
- Load : 메모리에서 데이터를 읽어가는 명령어 (메모리에서 CPU 레지스터에 데이터 저장)
- Store : 메모리에 데이터를 쓰는 명령어 (CPU레지스터에서 메모리로 데이터 저장)
- Binding 시점 : Compile time / Load time / Execution time
Binding of Memory Address
-
store # 198000, 10 의 명령어 compile
-
store명령어를 compile하면 그에 대응되는 실제 RAM의 주소에 Binding
-
문제점 : memory 주소를 결정 후 compile을 했다면, 실제 해당 RAM의 주소에 저장되어야 한다.
-
다른 주소를 사용하지 못한다.
- 하나의 프로그램이 메모리 전체를 다 쓰는 경우에 사용된다. (Arduino 등)
- 프로그램이 사용할 메모리의 첫 주소를0번지로
설정한다.
- 실제 RAM에 Binding될 때 프로세스의 메모리 주소에 base address를 더한다.
- 메모리에 Loading될 때 주소 전체를 바꾼다.
- 장점 : 프로세스에서 설정한 메모리 뿐만 아니라 다른 메모리 주소에도Binding될 수 있다.
- 문제점 : Loading시에 주소를 전부 수정해야 하므로 Load의 시간이 오래 걸린다.
- overhead가 너무 크기 때문에 사용되지 않는다.
- load time과 유사하게 메모리에 binding시킨 후 명령어 실행 시간에 base address를 더함으로써 data에 접근하는 방법
- translation 또는 mapping
- 현재 사용하는 방법
Virtual Memory Management
MMU
- 명령어가 실행될 때, Virtual address를 physical address로 빠르게 translation해주는 CPU의 레지스터
SWAP
- 실제 존재하는 RAM의 일부분을 Secondary storage에 일시적으로 저장함으로써 RAM을 개념적으로 무한대만큼 사용할 수 있게 한다.
프로그램 내에서 사용하는 변수의 주소는 여러 번 실행하든, 멀티 프로세스가 사용하든 logical address 상에 같은 위치에 존재한다.
#include <stdio.h>
int n = 0;
int main ()
{
printf (“&n = 0x%08x\n”, &n);
}
% ./a.out
&n = 0x08049508
% ./a.out
&n = 0x08049508
Address mapping 방법
Contiguous Allocation
- logically contiguous address를 physically contiguous address하게 할당하는 방법
- Physical address = logical address + relocation register(base address)
- Memory protection : Limit register를 사용함으로써 접근 불가 메모리 접근 제한
hole
- 사용가능한 메모리의 블록
- 다양한 크기로 메모리에 흩뿌려져 있다.
hole 할당 방법
- First-fit : 크기가 충분한 처음 hole에 할당한다.
- Best-fit : 크기가 충분한 hole 중 가장 작은 hole에 할당한다.
- 정렬되어 있지 않은 상태에서라면 전체를 검사해야 하며 가장 작은 leftover hole을 발생시킨다.
- Worst-fit : 가장 큰 hole에 할당한다.
- 모든 list를 검사해야 하며 가장 큰 leftover hole을 발생시킨다.
문제점 : Fragmentation ( 사용되지 않는 이유)
- 더 이상 사용될 수 없는 작은 hole들을 발생시킨다 : external fragmentation
- compaction(재조직)을 통해서 다룰 수 있다
- 동적으로 relocation이 가능하고 실행 시간에만 사용할 수 있다.
- I/O overhead가 매우 커진다.
Paging
- external fragmetation의 해결 방법
- Logical memory를 일정 크기의 page로 분할하고, physical memory도 일정 크기의 frame으로 분할한 뒤, page를 frame에 순서에 상관없이 할당한다. (page와 frame의 일반적인 크기는 4KB)
- 일부분의 page의 메모리를 다 사용하지 않아 공간이 남을 수 있다 → Internal fragmentation
Paging 의 문제점
- Page mapping의 절차가 복잡해진다. (Table 형태로 관리한다)
Translating address
- Logical address : page number :: offset → (p, d)
- Physical address : frame number :: offset → (f, d)
- OS가 관리하는 Page table이 필요하다.
- Page table은 process마다 필요하다.
Implementation of page table
- Page table은 메인 메모리에 상주한다.
- Page-table base register(PTBR)은 Page table를 가리킴
- Page-table length register(PTLR)은 Table size를 지칭.
- 2번의 메모리 접근이 필요하다.