메모리 관리 (Memory Management)
메인 메모리 (Main Memory)
•
메인 메모리는 CPU가 직접 접근할 수 있는 기억 장치
•
프로세스가 정상적으로 실행되려면 프로그램이 메모리에 올라와야 한다.
•
주소가 할당된 일련의 바이트들로 구성되어 있다.
•
CPU는 레지스터가 지시하는대로 메모리에 접근하여 다음에 수행할 명령어를 가져온다. 만약 명령어 수행시 메모리에 필요한 데이터가 없으면 해당 데이터를 우선 가져와야 한다.
•
이 역할을 하는 것이 MMU 이다.
Address Binding
프로세스 주소 체계
•
프로세스의 주소는 논리 주소 와 물리 주소 로 나뉜다.
논리 주소
•
CPU가 생성하는 주소
•
프로세스마다 독립적으로 가지는 주소 공간이기 때문에 프로세스 내부에서 사용한다.
물리 주소
•
프로세스가 실행되기 위해 실제로 메모리(RAM)에 올라가는 위치이다.
Address Binding 은 어떤 프로그램이 메모리의 어느 위치에, 즉 어떤 물리적 주소에 load 될지 결정하는 과정이다.
⇒ Binding 하는 시점에 따라 분류
1. Compile Time
•
프로세스의 물리적 주소가 컴파일 시 정해진다.
•
프로세스가 메모리의 어느 위치에 들어갈지 미리 알고 있다면, 컴파일러가 고정된 주소를 생성한다.
•
따라서 프로세스 내부에서 사용하는 논리적 주소와 물리적 주소가 동일하다.
2. Load Time
•
프로세스가 메모리의 어느 위치에 들어갈지 모른다면 컴파일러는 Relocatable Code 를 생성해야 한다.
•
Relocatable Code 는 메모리의 어느 위치에서나 수행될 수 있는 기계 언어 코드이다.
•
Loader 가 프로세스를 메모리에 load하는 시점에 물리적 주소를 결정한다.
•
따라서 논리 주소와 물리 주소가 다르다.
3. Execution Time
•
프로세스 수행이 시작된 이후에 실행될 때, 메모리 주소를 바꾸는 방법이다.
•
즉, 런타임 시 물리적 주소가 결정된다.
•
런타임 주소 할당은 MMU 라는 장치를 사용해서 논리 주소를 물리 주소로 바꾼다.
MMU (Memory Management Unit, 메모리 관리 장치)
•
논리 주소를 물리 주소로 변환해준다.
•
프로세스가 CPU에서 수행되면서 생성하는 모든 주소에 대해 base register 를 더해주어 물리 주소로 변환한다.
•
메모리 보호나 캐시 관리 등 CPU가 메모리에 접근하는 것을 총 관리해주는 하드웨어이다.
*base register : 접근할 수 있는 물리적 주소의 최솟값
*Limit register : 논리적 주소의 범위
*두가지를 활용하여 메모리를 보호한다
Swapping
•
메모리는 크기가 크지 않기 때문에, 프로세스를 디스크에 임시로 보냈다가 다시 로드하는 경우가 발생한다.
•
이떄, 디스크로 보내는 것을 swap out , 메모리로 다시 로드하는 것을 swap in 이라고 한다.
•
보통 스케쥴러를 통해 어떤 프로세스를 swap in/out 할 지 결정한다.
Compile Time Binding 과 Load Time Binding 은 swap in 할 때, 같은 메모리 위치로 가져와야 한다. Execution Binding 의 경우는 반환 되기 떄문에 빈 메모리 영역 아무 곳에 올릴 수 있다.
메모리 할당
•
메모리는 일반적으로 커널 영역 과 사용자 프로세스 영역 으로 나누어서 사용한다.
•
이 중 사용자 프로세스 영역 에 할당하는 방법으로 두 가지 방법이 있다.
◦
Contiguous Allocation (연속적 할당) 은 프로세스들이 연속적인 메모리 공간을 차지하게 되는 것이다.
◦
Noncontiguous Allocation (비연속적 할당) 은 프로세스들이 고정 크기의 블록으로 나뉘어 메모리에 순서 상관 없이 저장된다 ⇒ 페이징 기법
메모리 과할당 (Over Allocating)
•
실제 메모리의 사이즈보다 더 큰 사이즈의 메모리를 프로세스에 할당한 상황이다.
•
그래서 페이징 기법과 같은 메모리 관리는 사용자가 눈치 못채도록 하는 눈속임이라 할 수 있다.
•
하지만 page fault가 발생하여 메모리에 페이지를 올려야 하는 경우에는 빈 프레임을 확보해야만 한다.
•
이때 쓰이는 방법이 페이지 교체 알고리즘 과 swapping 이다.
TLB (Translation Look-aside Buffer)
•
TLB는 메모리 주소 변환을 위한 별도의 캐시 메모리로, page table에서 빈번히 참조되는 일부 엔트리를 캐싱한다.
•
TLB는 key-value 쌍으로 데이터를 관리하며, key에는 page number, value에는 frame number가 대응된다.
•
따라서 CPU는 TLB를 page table보다 먼저 참조하여, 원하는 페이지가 있다면 바로 frame number를 얻을 수 있다.