추상화가 없다는 뜻은 생각한 그대로 동작하는 것이라 생각한다. 그렇다면 추상화 없는 메모리 관리는 무엇일까?
아래의 그림을 살펴보자
(a)는 과거에 메인프레임, 미니컴퓨터에 사용
(b)는 palmtop, 혹은 임베디드 시스템에서 사용되었음
(c)는 초기 세대의 PC(MS-DOS 구동하는 PC)등에서 사용됨
이런 방식으로 메모리를 관리하면 한 번에 하나의 프로그램만 실행할 수 있다는 문제점이 있다.
IBM 360에서 위의 문제를 해결한 방법을 알아보자.
이렇게 동시에 여러 프로그램을 메모리에 올릴 수 있게 되었지만 모든 문제가 해결되지는 않았다. 여러 프로그램을 메모리에 올릴 때 어떻게 배치를 할지 애매한 부분이 있다. 그림을 통해 살펴보자
(a) 프로그램과 (b)프로그램을 동시에 메모리에 올려서 (C)의 형태가 되었다. 16KB 프로그램2개를 하나로 합친 모양이고 간단하다. 하지만 내부의 명령어 중에서 JUMP 28이 문제가 된다. (b)에서 JUMP 28는 문제가 되지 않지만 (c)에서 JUMP 28는 다른 프로그램의 영역으로 점프한다.
이 역시 IBM 360에서 static relocation이라는 방법으로 해결했다.
주소공간은 프로세스가 사용할 수 있는 모든 주소들의 집합을 말한다. 여기서 주소들은 실제 물리적 주소가 아니라 물리적 주소에 대응되는 임의의 주소이다.
각 프로세스는 각자의 주소공간을 가지기 때문에 위의 그림에서 나타난 문제가 발생하지 않는다. 그렇다면 JUMP 28을 어떻게 해결한 것일까
Dynamic Relocation의 간단한 구현이다. 프로그램의 주소공간을 실제 물리 메모리에 매핑시키는 역할을 한다.
base: 프로세스의 시작 물리주소
limit: 주소공간의 크기
위 그림에서 프로세스의 논리주소 0에 접근하고 싶으면 CPU에서 Base를 더해서 실제 주소로 연결된다. 또한 limit을 통해서 메모리 보호의 기능도 한다.
(프로세스들의 base/limit값은 PCB에 저장되어 있다가 문맥 전환 시 CPU 레지스터에 저장)
장점
Dynamic Relocation을 통해서 프로그램이 어떤 물리 주소에 올라가도 실행될 수 있게 됨. 이를 기반으로 OS는 현재 CPU를 차지하지 않는 프로세스를 메모리 -> Disk 반대의 경우 Disk -> 메모리로 swap
여러 프로세스가 메모리에 들어오고 나가는 모습
그림에서 보이듯 사용되지 않은 메모리 공간이 있다. 여러 프로세스들이 들어오고 나가다 보면 빈 공간이 여기저기 흩어져 있을 수 있는데 이를 외부 단편화라 한다. 1KB의 빈 공간이 4군데로 퍼져 있는데 실행할 프로그램이 4KB라면 흩어져 있는 메모리를 한곳에 모으면 실행할 수 있다.
메모리의 빈 공간(미사용 영역)을 잘 모으고 통합해서 효율적인 메모리 사용을 해보자
비트맵 사용
연결 리스트 사용
통합
압축
앞서 살펴본 추상화의 개념이 발전하면서 나타난 기법. 사용자에게 메모리의 모든 물리적 측면을 숨기는 것이다.
가상 주소 공간을 동일한 사이즈의 페이지로 나누는 것.
물리 메모리도 이에 상응하는 과정이 있고 페이지 프레임으로 나뉨.
MMU(Memory Management Unit)이 페이지를 페이지 프레임으로 매핑 시켜줌.
사용자가 가상 메모리를 사용하면 CPU가 알아서 실제 메모리에 매핑에서 사용
페이즈를 프레임에 매핑 시키는 방법
가상 주소에서 페이지 넘버를 프레임 넘버로 변환시킨다.(오프셋은 그대로 유지)
가상 주소를 매핑할 때 매번 RAM의 페이지 테이블을 살펴보는 것은 비효울적이다. -> 그럼 캐시처럼 CPU내부에 저장하자.
지금까지 살펴본 것은 싱글 레벨 페이징. 이 경우 사용하지 않는 page도 유지 해야함. 왜? 할당되지 않은 목록을 알아야 나중에 할당을 해주니까. 그러다보니 페이지 테이블이 너무 커져서 다음과 같은 해결 방법이 등장함
말 그대로 페이징을 여러번 하는 것. 32bit 시스템을 예로 들면 싱글레벨의 경우 개의 페이지를 모두 기록해야 함. 하지만 싱글레벨의 경우 Top-level 의 항목만 필수로 유지하고 나중에 하위 페이지가 필요하면 그 때 할당하는 방식 하위 테이블을 모두 유지하지 않아 테이블을 효율적으로 사용가능. TLB 역시 멀티레벨로 하는데 miss시 성능이 좀 떨어지는 듯.
64bit는 4레벨 멀티 페이징 하는 모양
기존 페이지 테이블은 가상 주소 공간의 크기에 따라서 테이블의 크기가 정해짐. 여기서 설명하는 역 페이지 테이블은 실제 프레임의 크기만큼으로 테이블 크기를 줄임
페이지 테이블의 valid bit가 0(페이지가 프레임에 매핑되지 x)인 경우. 다음의 과정을 거침
현재 사용되지 않는 페이지들은 디스크에 저장됨.
Optimal page replacement
NRU
FIFO
Second chance page replacement
Clock page replacement
LRU
Working set page replacement
WSClock page replacement
Local vs Global
Thrashing
Cleaning Policy
lock bit를 사용해 swap에서 제외가능
정책과 매커니즘의 분리
파일을 가상 메모리에 매핑해서 메모리를 사용하는 것 처럼 사용하는 방식. 마치 파일이 프로세스의 일부인 것 처럼 사용
IO 성능이 대폭 향상된다.
페이징이 물리적으로 크기를 나누었다면, Segmentaiton은 논리적으로 나눠서 배치하는 것이다. 페이징과 다르게 가변길이!
우리가 자주보는 segmentation fault의 segmentation임
먼저 컴파일러가 컴파일을 하면서 만드는 테이블들, 결과물의 예시를 알아보자
이러한 항목들이 Segment가 될 수 있고, 이를 통해서 메모리를 매핑하는 것.
각 프로세스마다 seg table이 있고, 각 seg의 길이를 기록함.
외부 단편화가 발생하는데, 페이징과 결합한 Segment-paging으로 해결