※ 해당 글은 기술 면접 대비 CS 핵심요약을 기반으로, 해당 책의 순서를 참고하여 작성하였습니다.
1. 논리 메모리와 물리 메모리
컴퓨터에서 프로그램이 실행될 때, 우리가 흔히 '메모리'라고 부르는 공간은 사실 두 가지 차원에서 존재합니다.
하나는 논리 메모리(Logical Memory), 그리고 다른 하나는 물리 메모리(Physical Memory)에서 존재합니다.
논리 메모리(가상 메모리)란?
프로그램이 실행될 때, CPU가 직접 접근하는 주소 공간입니다. 개발자가 코드를 작성할 때 변수나 배열을 선언하면, 논리적으로 해당 데이터가 저장될 위치를 지정하지만, 이 주소는 실제 물리적인 RAM과는 다를 수 있죠.
우리가 int arr[10] 같은 배열을 선언하면, 프로그램 입장에서는 연속된 메모리 공간을 차지한다고 생각할 것입니다. 하지만 실제 물리 메모리에서는 이 배열이 연속된 위치에 있지 않을 수도 있습니다. 운영체제가 논리 메모리를 적절히 물리 메모리에 매핑해 주기 때문입니다.
물리 메모리란?
실제로 RAM(주기억장치)에서 프로그램이 실행되는 공간입니다.
CPU는 논리 메모리 주소를 직접 사용할 수 없고, 반드시 물리 메모리 주소로 변환한 후 접근해야 하는데, 이 변환 과정을 메모리 관리 장치(MMU, Memory Management Unit)에서 담당합니다.
MMU는 보호해야 하는 메모리 영역에 대한 접근을 제한해 메모리를 보호하는 역할을 합니다.
논리 메모리와 물리 메모리의 차이가 왜 중요할까? 🤔
논리 메모리와 물리 메모리를 분리하면 다음과 같은 이점이 있습니다.
- 프로그램 독립성
- 개발자는 프로그램이 실행될 메모리 주소를 신경 쓰지 않고 코드를 작성 가능
- 프로그램이 실행될 때마다 다른 메모리 영역에 로드되더라도 문제없이 동작
- 보안성 강화
- 프로그램이 직접 물리 메모리에 접근할 수 없으므로, 다른 프로그램의 데이터를 함부로 읽거나 수정할 수 없음
- OS는 메모리 보호 기법을 적용해 프로세스 간 침범을 방지
- 효율적인 메모리 관리
- 운영체제는 프로그램이 필요로 하는 만큼만 물리 메모리를 할당하고, 부족하면 스왑(swap) 영역을 활용 가능
- 같은 프로그램의 여러 프로세스가 실행될 경우 공통된 부분은 공유하고, 다른 부분만 별도로 저장 가능
2. 연속 메모리 할당 (Contiguous Allocation)
프로그램이 실행되려면 운영체제는 해당 프로그램을 메모리에 올려야 합니다.
이때 프로그램이 차지하는 메모리가 물리적으로 연속된 공간에 배치된다면 연속 메모리 할당이라고 합니다.
프로세스 A(100MB), B(200MB), C(300MB)를 실행하면,
운영체제는 100MB, 200MB, 300MB의 연속된 공간을 각각 확보해 배치한다.
2.1 고정 분할 방식
고정 분할 방식은 말 그대로 메모리를 여러 개의 고정된 크기의 블록(Partition)으로 나누어 사용하는 방식입니다.
운영체제는 메모리를 미리 나눈 후, 각 프로세스가 적절한 블록에 들어가도록 합니다.
1GB 메모리가 있을 때, 이를 256MB 크기의 4개 블록으로 나눈다면?
- 프로세스 A(200MB) → 256MB 블록 하나 차지
- 프로세스 B(300MB) → 256MB 블록 하나 차지 (50MB 낭비 발생)
- 프로세스 C(150MB) → 256MB 블록 하나 차지
- 프로세스 D(500MB) → 블록 부족으로 실행 불가
고정 분할 방식의 문제점
- 내부 단편화(Internal Fragmentation)
운영체제가 메모리를 일정한 크기로 할당하다 보면 실제 사용하지 않는 공간이 발생할 수 있습니다.
130MB짜리 프로세스를 150MB의 공간에 할당하면 남은 20MB는 사용할 수 없게 된다.
- 비효율적인 메모리 활용
블록 크기를 너무 작게 설정하면 큰 프로세스를 수용할 수 없습니다.
반대로, 블록 크기를 너무 크게 설정하면 내부 단편화 문제가 심해집니다.
- 유연성 부족
실행 중 블록 크기를 바꿀 수 없어, 다양한 크기의 프로그램을 수용하기 어렵다는 문제가 있습니다.
고정 분할 방식은 단순하지만 비효율적이죠.
그래서 이를 개선한 방식이 바로 아래에 작성된 가변 분할 방식(Variable Partitioning)입니다.
2.2 가변 분할 방식
가변 분할 방식은 할당할 프로세스의 크기에 따라 메모리 공간을 분할하는 방식입니다.
미리 블록을 나누지 않고 프로세스가 실행될 때 크기에 맞게 메모리를 동적으로 할당하고 종료시 해당 메모리 공간을 다시 사용합니다.
1GB 메모리가 있을 때,
- 프로세스 A(200MB) → 200MB 할당
- 프로세스 B(300MB) → 300MB 할당
- 프로세스 C(150MB) → 150MB 할당
- 프로세스 D(500MB) → 남은 공간이 충분하지 않아 실행 불가
이 방식은 내부 단편화 문제를 해결할 수 있지만, 외부 단편화 문제가 발생할 수 있다는 문제점이 있습니다.
가변 분할 방식의 문제점
- 외부 단편화 (External Fragmentation)
프로세스가 종료되면 해당 메모리 공간이 비게 됩니다.
하지만 새로운 프로세스와 크기가 맞지 않거나, 남아있는 공간이 충분해도 연속된 공간이 아니면 할당이 불가능해 공간을 활용하지 못하고 남아있게 됩니다.
100MB짜리 프로세스가 종료되어 빈 공간이 생겨도 110MB짜리 프로세스는 이 공간을 사용할 수 없어 다른 곳에 배치되어야 한다.
2.3 가변 분할 메모리 할당 알고리즘
가변 분할 방식에서는 프로세스를 어떤 빈 공간에 배치할 것인지 결정하는 세 가지 전략이 있습니다.
- 최초 적합 (First Fit)
최초 적합 방식은 메모리의 빈 공간을 앞에서부터 탐색하여, 차례대로 맞는 공간에 프로세스를 배치하는 방식입니다.
현재 메모리 상태
- 100MB (사용 중)
- 300MB (빈 공간)
- 150MB (사용 중)
- 500MB (빈 공간)
Q. 새로운 프로세스 X(250MB)가 들어오면?
A. 300MB 블록이 첫 번째로 적합하므로 해당 공간에 할당
빈 공간을 앞에서부터 찾기 때문에
- 불필요한 탐색을 줄여 → 탐색 속도가 빠르고
- 메모리를 정렬하거나 최적의 공간을 찾을 필요가 없어 → 구현이 간단하다는 장점이 있지만
- 큰 빈 공간을 잘게 쪼개면 나중에 큰 프로세스를 배치하기 어려워 → 외부 단편화 발생 가능성이 있고
- 초반 메모리에 작은 조각들이 남아 → 활용도가 낮아진다는 단점이 있습니다.
- 최적 적합 (Best Fit)
최초 적합을 보완하기 위해 등장한 최적 적합 방식은 프로세스가 실행될 때, 필요한 크기보다 크거나 같은 공간 중에서 가장 작은 공간을 찾아 배치하는 방식입니다.
현재 메모리 상태
- 100MB (사용 중)
- 300MB (빈 공간)
- 150MB (사용 중)
- 500MB (빈 공간)
Q. 새로운 프로세스 X(250MB)가 들어오면?
A. 300MB와 500MB 공간 중 가장 작은 300MB 블록에 할당
- 남는 공간을 최소화하려고 하기 때문에 → 메모리 활용도가 증가할 수 있고
- 큰 메모리 블록시 쉽게 나뉘지 않아 → 더 큰 프로세스가 들어와도 할당 가능성이 높아진다는 장점이 있지만
- 메모리 공간을 전부 확인해야 하기 때문에 → 탐색 시간이 오래 걸릴 수 있고
- 최적의 공간을 찾다보니 너무 작은 조각들이 남아 → 다른 프로세스를 넣기 어려울 수 있다는 단점이 있습니다.
- 최악 적합 (Worst Fit)
최적 적합의 정반대로 접근한 최악 적합 방식은 프로세스를 배치할 때 사용할 수 있는 공간 중에서 가장 큰 공간을 선택하는 방식입니다.
현재 메모리 상태
- 100MB (사용 중)
- 300MB (빈 공간)
- 150MB (사용 중)
- 500MB (빈 공간)
Q. 새로운 프로세스 X(250MB)가 들어오면?
A. 300MB와 500MB 공간 중 가장 큰 500MB 블록에 할당
- 작은 조각이 아니라 큰 조각이 남도록 하여 → 큰 공간을 활용할 기회가 많아지고
- 큰 공간을 나눠 사용함으로써 작은 공간이 흩어지는 것을 방지해 → 외부 단편화 문제를 어느정도 해결할 수 있다는 장점이 있지만
- 작은 프로세스를 너무 큰 공간에 배치하면 내부 단편화가 심해져 → 메모리 활용률이 낮을 수 있고
- 항상 가장 큰 공간을 찾기 위해 전체 빈 공간을 탐색하며 → 탐색 시간이 오래 걸릴 수 있다는 단점이 있습니다.
알고리즘 | 장점 | 단점 |
최초 적합 (First Fit) | 탐색 속도가 빠름 | 초반 메모리에 작은 조각이 남을 가능성 |
최적 적합 (Best Fit) | 메모리 활용률이 높음 | 작은 조각(외부 단편화) 발생 가능 |
최악 적합 (Worst Fit) | 큰 공간을 남겨서 외부 단편화 감소 가능 | 내부 단편화가 심할 수 있음 |
3. 비연속 메모리 할당 (Non-contiguous Memory Allocation)
연속 메모리 할당 방식에서는 외부 단편화 문제를 해결하기 어렵고 메모리 활용률이 낮아질 수 있습니다.
이 문제를 해결하기 위해 등장한 개념이 비연속 메모리 할당입니다.
비연속 메모리 할당이란?
- 프로세스가 실행될 때, 물리 메모리의 여러 비연속적인 공간에 나누어 저장하는 방식입니다.
- 논리 메모리는 연속적이지만, 실제 물리 메모리에서는 여러 곳에 나누어 저장될 수 있습니다.
비연속 메모리 할당에는 페이징과 세그멘테이션이라는 두 가지 방법이 존재합니다.
3.1 페이징 (Paging)
- 단순 페이징
페이징은 메모리를 고정된 크기의 블록(페이지)으로 나누어 관리하는 방식입니다.
물리 메모리를 일정 크기의 블록인 프레임으로, 실행되는 프로세스의 논리 메모리는 같은 크기의 페이지로 나눕니다.
페이지와 프레임에는 각각 번호를 할당하고, 페이지 테이블을 이용해 페이지와 프레임을 매핑합니다.
Q. 프로세스가 6KB의 크기를 가지고 있고, 페이지 크기가 2KB라면?
A. - 6KB를 2KB씩 나누어 3개의 페이지로 구성됨
- 운영체제는 3개의 빈 프레임을 찾아 해당 페이지를 배치
- 페이지 테이블을 이용해 논리 주소를 물리 주소로 변환
장점
- 외부 단편화 해결 : 연속된 공간이 필요 없어 자투리 메모까지 활용
- 메모리 활용도 증가 : 여러 프로세스가 작은 단위로 나뉘어 저장
- 프로세스 크기 유연 : 프로세스 크기가 커도 연속된 공간이 필요 없어 실행 가능성 높음
단점
- 내부 단편화 발생 가능 : 페이지 크기가 고정되어, 마지막 페이지에서 일부 공간 낭비 가능성 있음
- 주소 변환 오버헤드 증가 : 페이지 테이블을 통해 논리 주소를 물리 주소로 변환하는 과정에서 추가 연산 필요
페이징 방식은 기본적인 메모리 관리 기법으로 사용되지만 여전히 한계가 있기 때문에 이를 개선한 방식이 가상 메모리 페이징입니다.
- 가상 메모리 페이징 (Virtual Memory Paging)
단순 페이징 방식틔 메모리 공간이 부족시 실행할 수 없는 문제를 해결하기 위해 등장한 개념이 바로 가상 메모리 페이징입니다.
가상 메모리 페이징이란?
- 프로세스 전체를 메모리에 올리지 않고, 필요한 부분만 로드하는 방식
- 부족한 메모리를 보완하기 위해 디스크(보조 기억장치, HDD/SSD)의 일부를 가상 메모리로 활용
- 실행 중인 프로세스의 일부 페이지만 메모리에 올라가 있어도 실행 가능
프로세스 크기: 16KB | 물리 메모리 크기: 8KB | 페이지 크기: 4KB
- 프로세스를 실행하려면 4개의 페이지가 필요하지만, 물리 메모리에는 2개만 저장 가능
- 나머지 페이지는 필요할 때 디스크에서 불러옴
장점
- 물리 메모리 부족 해결 : 작은 메모리에서도 큰 프로세스 실행 가능
- 메모리 활용도 증가 : 자주 사용하는 페이지만 메모리에 올려 공간을 효율적으로 사용
- 프로세스 실행 속도 향상 : 필요한 부분만 메모리에 로드하여 초기 실행 속도 빠름
단점
- 페이지 폴드 발생 가능 : 필요한 페이지가 메모리에 없으면 디스크에서 읽어와야 하므로 속도가 느려질 수 있음
- 페이지 교체 오버헤드 발생 : 물리 메모리가 가득 차면, 기존 페이지를 삭제하고 새로운 페이지를 로드해야 함
3.2 세그먼테이션 (Segmentation)
- 단순 세그먼테이션
페이징은 메모리를 페이지로 나누어 관리하는 방식이었지만 실제 프로그램은 코드, 데이터, 스택 등 논리적으로 구분된 영역을 가지고 있으며, 크기가 일정하지 않습니다.
이러한 문제를 해결하기 위해 세그멘테이션 기법이 등장했습니다.
세그멘테이션이란?
- 메모리를 고정된 크기가 아닌 논리적 단위 - 세그먼트(Segment)로 나누어 할당하는 방식
- 프로세스는 코드, 데이터, 스택 등 여러 개의 세그먼트로 구성됨
- 각 세그먼트는 독립적인 크기를 가지며, 연속된 메모리 공간을 차지함
각 세그먼트의 시작 주소(Base)와 크기(Limit)를 기록한 세그먼트 테이블(Segment Table)을 사용
장점
- 논리적 구조 반영 : 코드, 데이터, 스택 등을 독립적인 세그먼트로 관리하며, 페이징보다 사용자 친화적인 메모리 관리 방식
- 내부 단편화 최소화 : 필요에 따라 가변 크기의 세그먼트를 할당하므로 페이징보다 메모리를 더 효율적으로 사용
- 메모리 보호 기능 강화 : 각 세그먼트는 독립적으로 보호되어 한 세그먼트에서 다른 세그먼트의 데이터를 변경하는 것을 방지 가능
단점
- 외부 단편화 발생 가능 : 세그먼트의 크기가 균등하지 않아 프로세스의 할당/해제를 반복하는 과정에서 발생 가능
- 세그먼트 테이블 관리 필요 : 각 세그먼트의 기본 주소와 크기를 관리해야 하므로 주소 변환 오버헤드 증가
- 연속된 메모리 공간 확보 어려움 : 프로그램이 종료되고 새로운 프로세스가 실행될 때, 적절한 크기의 연속된 공간을 찾기 힘들어질 수 있음
- 가상 메모리 세그먼테이션 (Segmentation with Paging)
앞서 살펴본 단순 세그멘테이션은 프로세스를 논리적인 단위로 나누어 메모리를 효율적으로 활용하지만 외부 단편화가 발생할 수 있습니다.
이를 해결하기 위해 세그멘테이션과 페이징을 결합한 방식, 즉 가상 메모리 세그멘테이션이 등장했습니다.
가상 메모리 세그멘테이션이란?
- 프로세스를 논리적 단위(세그먼트)로 나눈 후, 각 세그먼트를 다시 작은 페이지 단위로 쪼개어 관리하는 방식
- 세그먼트 크기가 가변적이므로 외부 단편화 문제가 발생할 수 있지만, 페이징을 결합하여 이를 해결
- 페이지 테이블과 세그먼트 테이블을 활용하여 주소 변환 수행
장점
- 외부 단편화 문제 해결 : 세그먼트를 다시 페이지 단위로 나누기 때문에, 연속된 큰 공간이 필요하지 않음
- 효율적인 메모리 활용 : 프로그램의 논리적 구조를 유지하면서도, 메모리를 작은 단위로 관리 가능
- 프로세스 크기 유연성 증가 : 연속된 메모리 할당이 필요 없으므로, 대형 프로세스도 실행 가능
단점
- 주소 변환 과정 복잡 : 세그먼트 테이블과 페이지 테이블을 모두 사용하므로, 주소 변환 오버헤드가 증가
- 추가적인 메모리 필요 : 두 개의 테이블(페이지, 세그먼트)을 관리해야 하므로 메모리 사용량 증가
- 페이지 폴드 발생 가능 : 필요한 페이지가 메모리에 없을 경우, 디스크에서 불러와야 하기 때문에 성능 저하 발생 가능
3.3 페이징과 세그멘테이션 방식 비교
페이징 | 고정된 크기로 메모리를 분할 | - 외부 단편화 없음 - 메모리 관리 용이 |
내부 단편화 발생 가능 |
세그멘테이션 | 논리적 단위로 분할 | - 프로그램 구조 반영 가능 - 유연한 메모리 할당 |
외부 단편화 문제 발생 |
가상 메모리 세그멘테이션 |
세그먼트를 페이지 단위로 다시 나누어 관리 |
- 외부 단편화 해결 - 효율적인 메모리 활용 |
- 주소 변환 과정이 복잡 - 테이블 메모리 추가 필요 |
출처
'CS > 운영체제' 카테고리의 다른 글
디스크 스케줄링(Disk Scheduling) (0) | 2025.04.14 |
---|---|
프로세스 동기화 - 상호배제 기법 (0) | 2025.02.11 |