가변 파티션 방식
연속 메모리 할당은 메모리를 나눠주는 방식 중 하나이다.
그 중에서도 가변 파티션 방식은 프로세스 크기에 맞춰 딱 맞게 메모리 덩어리를 나눠주는 것이다.
처음엔 메모리 전체가 하나의 큰 hole로 비어있고, 요청이 들어온다면 그 크기만큼 잘라서 주고, 남은 공간은 hole로 남긴다.
시간이 지나면서 프로세스가 종료되면 메모리 여기저기 작은 hole들이 생기고, 이 hole들을 다시 잘 활용하지 못하면 조각처럼 되어서 공간 낭비가 생긴다.
이 모든 문제를 통틀어서 동적 메모리 할당 문제라고 하고, 그래서 운영체제는 어떤 hole에 새로운 프로세스를 배치해야 할지 결정해야 한다.
이걸 메모리 할당 전략이라고 한다.
대표적인 전략은 3가지가 있다.
1. 최초 적합: 앞에서부터 순차적으로 찾다가 딱 들어맞는 hole이 보이면 그곳에 넣는다.
2. 최적 적합: hole들 중에서 가장 딱 맞는, 작은 크기의 hole을 골라 넣는 방식이다.
3. 최악 적합: 가장 큰 hole에 프로세스를 넣는 방식이다. 대부분 비효율적이라 거의 사용하지 않는다.
시뮬레이션 연구 결과도 실제로는 최초 적합이나 최적 적합이 성능과 공간 효율 측면에서 더 낫다는 걸 보여준다.
그리고 이 모든 문제를 통틀어서 동적 메모리 할당 문제라고 한다.
단편화
가변 파티션 방식으로 메모리를 할당하다 보면, 프로세스들이 생성되고 제거되는 과정에서 메모리에 자투리 공간들이 생긴다.
이걸 외부 단편화(external fragmentation)라고 부르며, 쓸 수 있는 공간이 전체적으로는 많아 보이지만 각각이 너무 작거나 조각나 있어서 정작 새로운 프로세스가 들어올 수 없는 문제가 발생한다.
최악의 경우는 거의 모든 공간이 단편화 되어 있어서 아무것도 못 넣는 상황이 생긴다.
이건 할당 전략과도 관련이 있는데, 최초 적합 같은 방식은 빠르지만 앞쪽에 자잘한 조각을 남기기 쉽고, 최적 적합도 자주 쓰는 쪽에 조각을 몰아넣게 돼서 결국 전체적으로 단편화를 유발한다.
통계적으로도 이런 식으로 메모리를 나누면 절반 가까이가 단편화로 손실된다는 50% 규칙이 있을 정도다.
반대로 내부 단편화(internal fragmentation)는 고정된 메모리 블록에 프로세스를 넣다 보면, 애매하게 남는 공간이 생겨서 버려지는 걸 말한다.
이런 낭비를 줄이기 위해 운영체제는 가급적 정해진 블록보다 약간 더 큰 블록을 주기도 하지만, 그 자체가 내부 단편화를 만드는 원인이 된다.
외부 단편화를 해결하는 방식 중 하나는 압축(compaction)이다. 이건 메모리에 있는 모든 프로세스를 한쪽으로 몰아서, 남은 자투리 공간들을 합쳐 하나의 큰 연속 공간을 만드는 방식이다.
하지만 이 과정은 주소값을 모두 재계산하고, 레지스터까지 바꿔야 하므로 비용이 매우 크고, 실제로는 거의 사용되지 않는다.
그래서 근본적인 해결책으로 등장한 게 페이징이다. 페이징은 애초에 메모리를 연속된 블록으로 할당하지 않고, 물리적으로는 떨어져 있어도 논리적으로 이어지게 만드는 방식이라 단편화 문제를 원천 차단할 수 있다.
'독서기록장' 카테고리의 다른 글
9. 운영체제 9장 메모리 (4) 페이징 (0) | 2025.03.31 |
---|---|
7. 운영체제 9장 메모리 (2) with java spring.. (0) | 2025.03.29 |
6. 운영체제 9장 메모리 (1) with redis.. (0) | 2025.03.28 |