물리적 메모리는 낮은 주소 부분에 운영체제 커널이 항상 상주하고 있고, 높은 주소 영역에는 사용자 프로그램들이 올라가 있다.
사용자 프로그램이 올라간 영역을 관리하는 방법은 크게 두 가지로 나누어 볼 수 있다.
프로그램이 메모리에 올라갈 때 통째로 메모리에 올라가는 방식인 연속 할당과
프로그램을 구성하는 주소 공간을 같은 크기의 페이지 단위로 잘게 쪼개서 페이지 단위로 메모리에 올리는 방법인 불연속 할당이 있다.
● 연속 할당 (Contiguous Allocation)
✓ 고정 분할 (Fixed Partition) 방식
물리적 메모리를 몇 개의 영구적 분할 (Partition)로 나눔
분할의 크기가 모두 동일한 방식과 서로 다른 방식이 존재
분할 당 하나의 프로그램 적재
융통성이 없음 : 동시에 메모리에 Load 되는 프로그램의 수가 고정됨. 최대 수행 가능 프로그램 크기 제한
Internal Fragmentation 발생 (External Fragmentation도 발생)
✓ 가변 분할 (Variable Partition) 방식
프로그램의 크기를 고려해서 할당
분할의 크기, 개수가 동적으로 변함
기술적 관리 기법 필요
External Fragmentation 발생
연속 할당은 고정 분할 방식과 가변 분할 방식으로 나뉜다.
고정 분할 방식은 프로그램이 들어갈 사용자 메모리 영역을 미리 파티션으로 나누어 놓는다.
반면, 가변 분할 방식은 사용자 프로그램이 들어갈 메모리 영역을 미리 분할하지 않는다.
위 그림에서 고정 분할 방식(왼쪽)에서는 사용자 프로그램이 들어갈 물리적 메모리를 4 분할해 놓았다.
크기를 균일하게 할 수도, 다르게 할 수도 있다. 프로그램 A가 실행이 되면 분할 1에 할당하고 프로그램 B가 실행이 되면 분할 3에 들어갈 수 있다.
프로그램 B가 분할 2에 들어가기에는 분할 2의 크기가 너무 작기 때문에 분할 3에 할당된다.
이 경우, 낭비되는 메모리 조각이 생긴다.
외부 조각은 프로그램을 올리고 싶은데 올리려는 프로그램보다 분할된 메모리 조각의 크기가 작아서 사용이 되지 않는 것을 말하며,
내부 조각은 분할된 메모리 조각보다 프로그램의 크기가 작아서 사용이 되지 않는 공간을 말한다.
가변 분할 방식은 프로그램이 실행될 때마다 차곡차곡 메모리에 올려놓는 방법이다.
프로그램 A, 프로그램 B, 프로그램 C가 실행되며 프로그램 B가 끝나면 프로그램 D가 실행된다고 하자.
프로그램이 실행되는 순서대로 메모리에 차곡차곡 쌓이다가 프로그램 B가 종료가 되면 D가 실행이 되어 메모리에 올라가야 한다.
하지만 프로그램 B의 크기보다 프로그램 D의 크기가 더 크기 때문에 그 공간에 들어가지 못한다.
그래서 프로그램 B가 있던 자리는 빈 공간으로 남을 것이고 프로그램 D는 프로그램 C 밑에 할당이 된다.
✓ External Fragmentation (외부 조각)
프로그램 크기보다 분할의 크기가 작은 경우
아무 프로그램에도 배정되지 않은 빈 곳인데도 프로그램이 올라갈 수 없는 작은 공간
✓ Internal Fragmentation (내부 조각)
프로그램 크기보다 분할의 크기가 큰 경우
하나의 분할 내부에서 발생하는 사용되지 않는 메모리 조각
특정 프로그램에 배정되었지만 사용되지 않는 공간
● Hole
가변 분할 방식을 사용하게 되면 프로그램이 실행되다가 종료가 되면 hole이 생긴다. Hole이라는 것은 비어있는 메모리 공간을 뜻한다.
운영체제는 물리적 메모리에서 어느 부분은 프로그램에 의해서 사용이 되고 있는 부분과 사용이 되지 않고 있는 부분(Hole)들을 관리해야 한다.
홀 중에서 어떤 Hole에다가 새로운 프로그램을 집어넣을 것인지 결정해야 한다.
그 문제를 가변 분할 방식에서 생기는 Dynamic Storage Allocation Problem이라고 부른다.
지금 실행하려고 하는 프로그램의 크기가 n이라고 하면 적어도 Hole의 크기가 프로그램의 크기보다는 커야지 Hole 안에 들어갈 수 있다.
✓ Dynamic Storage-Allocation Problem
가변 분할 방식에서 size n인 요청을 만족하는 가장 적절한 Hole을 찾는 문제
✓ First Fit
Hole 중에서 가장 처음 발견되는 Hole에 할당한다. 물론 크기가 n 이상이어야 한다.
시간이 단축된다.
✓ Best Fit
Hole을 다 살펴본 다음 프로그램의 크기와 가장 비슷한 Hole에 올려놓는 방법이다.
Hole들의 리스트가 크기순으로 정렬되지 않은 경우 모든 Hole의 리스트를 탐색해야 한다.
많은 수의 아주 작은 Hole들이 생성된다.
✓ Worst Fit
가장 큰 홀에다가 프로그램을 할당하는 방법이다.
가장 큰 Hole을 찾으려면 전체 Hole을 탐색하는 시간이 필요한데 ,, 진짜 멍청한 방법이다.
First-Fit과 Best-Fit이 Worst-Fit보다 속도와 공간 이용률 측면에서 효과적인 것으로 알려졌다고 한다.
● Compaction
작은 Hole들을 한 곳으로 몰아넣음
외부 조각으로부터 생기는 Hole들을 가지고 한 군데로 모아서 아주 큰 홀을 만들면 Hole의 크기가 작아서 사용이 되지 않았던 문제가 해결될 수 있다.
디스크 조각 모음은 디스크에 있는 파일 데이터를 이동시키는 방법이고 Compaction은 메모리에 올라가서 실행 중인 프로그램의 메모리를 한 군데로 모으는 작업이다.
많은 비용이 드는 방법으로 Run Time Binding이 지원되어야지만 Compaction을 할 수 있다.
일부 Hole이 존재하더라도 최소한의 프로그램만 이동시켜서 큰 홀을 하나 만들 수 있으면 좋다.
✓ External Fragmentation 문제를 해결하는 한 가지 방법
사용 중인 메모리 영역을 한 군데로 몰고 Hole들을 다른 한 곳으로 몰아 큰 Block을 만드는 것
매우 비용이 많이 드는 방법
최소한의 메모리 이동으로 Compaction 하는 방법 (매우 복잡한 문제)
Compaction은 프로세스의 주소가 실행 시간에 동적으로 재배치 가능한 경우에만 수행될 수 있음.