연속 메모리 할당
: 프로세스에 연속적인 메모리 공간을 할당



: 스왑은 RAM(메모리)이 부족할 때 디스크 공간을 임시 메모리처럼 사용하는 기능이다.
단점
& 필요한 이유
| 상황 | 스왑 역할 |
|---|---|
| 메모리가 모자랄 때 | 프로세스의 일부를 디스크로 옮겨 RAM 공간 확보 |
| 갑자기 메모리 사용량 증가 | 시스템 다운 방지 |
| 백그라운드 프로세스 | RAM 대신 Swap에 저장하여 RAM 여유 확보 |

→ 이 프로세스를 연속적으로 메모리에 할당하는 방식은 메모리를 효율적으로 사용하는 방법이 아니다.
→ 이유는 외부 단편화라는 문제가 발생하기 때문이다.
프로세스들이 실행되고 종료되기를 반복하며 메모리 사이사이에 빈 공간 발생
이것이 외부 단편화다.

(1) 메모리 압축

(2) 페이징
페이징을 통한 가상 메모리 관리
연속 메모리 할당의 두 가지 문제점
운영체제가 메모리를 고정된 크기의 블록으로 나누어 관리하는 기법으로, 외부 단편화를 완전히 해결하기 위해 도입된 메모리 관리 방식입니다.
프로세스의 논리 주소 공간을 페이지라는 일정 단위로 자른다.
메모리의 물리 주소 공간을 프레임이라는 페이지와 동일한 일정한 단위로 자른 뒤
페이지를 프레임에 할당하는 가상 메모리 관리 기법

→ 프로세스를 이루는 페이지가 어느 프레임에 적재되어 있는지 CPU가 일일이 알기란 어렵다. 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU 입장에서 이를 순차적으로 실행할 수가 없다. CPU 입장에서 ‘다음에 실행할 명령어 위치’를 찾기가 어려워진다.
→ 물리적으로는 분산되어 저장되어 있더라도 CPU 입장에서 바라본 논리 주소는 연속적으로 보인다.
→ CPU는 그저 논리 주소를 순차적으로 실행하면 될 뿐

→ 마지막 페이지에 사용되지 않는 공간이 생김


그런데 페이지 테이블이 메모리에 있다면? 메모리 접근 시간이 두 배로 증가한다.
페이지 테이블을 참조하기 위해 한 번
페이지를 참조하기 위해 한 번
TLB: CPU 곁에 있는 페이지 테이블의 캐시 메모리
페이지 테이블의 일부를 가져와 저장
특정 주소에 접근하고자 한다면 어떤 정보가 필요할까?
어떤 페이지/프레임에 접근하고 싶은지
접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지

페이징 시스템에서의 논리 주소
<페이지 번호, 변위>로 이루어진 논리 주소는
페이지 테이블을 통해
<프레임 번호, 변위>로 변환된다.
: PTE는 가상 페이지가 실제 물리 메모리의 어느 프레임에 있는지, 그리고 그 페이지의 상태를 설명하는 정보(메타데이터)를 담고 있는 구조체(레코드)
유효 비트
유효 비트가 0인 페이지에 접근하려고 하면?
(1) CPU는 기존의 작업 내역을 백업한다.
(2) 페이지 폴트 처리 루틴을 실행한다.
(3) 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 뒤 유효 비트를 1로 변경해 준다.
(4) 페이지 폴트를 처리했다면 이제 CPU는 해당 페이지에 접근할 수 있게 됩니다.
보호 비트
참조 비트
수정 비트(= dirty bit)
CPU가 이 페이지에 데이터를 쓴 적이 있는지 여부
수정 비트가 왜 필요한지?
: 프로세스는 기본적으로 자원을 공유하지 않는다.
→ 부모 프로세스가 적재된 별도의 공간에 자식 프로세스가 통째로 복제되어 적재
(프로세스 생성 시간 지연, 메모리 낭비)

→ 페이징 방식에서 페이지 테이블이 너무 커지는 문제를 해결하기 위해 페이지 테이블 자체를 여러 단계로 나누어 계층 구조로 만든 방식입니다.
프로세스 테이블의 크기는 생각보다 작지 않다.
프로세스를 이루는 모든 페이지 테이블 엔트리를 메모리에 두는 것은 큰 낭비이다.
프로세스를 이루는 모든 페이지 테이블 엔트리를 항상 메모리에 유지하지 않을 방법

계층적 페이징을 이용하는 환경에서의 논리 주소

장점
단점
주소 변환 단계가 늘어남 → 메모리 접근이 느려짐
그래서 TLB(Translation Lookaside Buffer)가 필수로 사용됨
정리
연속 메모리 할당은 프로세스에 연속된 물리 메모리 공간을 배정하는 방식으로, 스와핑을 통해 사용되지 않는 프로세스를 디스크로 옮겨 RAM 공간을 확보할 수 있지만 속도가 느린 디스크를 사용하기 때문에 성능 저하(스래싱)가 발생할 수 있다. 메모리에는 여러 빈 공간이 생기기 때문에 최초 적합, 최적 적합, 최악 적합 같은 전략으로 프로세스를 배치하지만, 실행과 종료가 반복되면서 작은 빈 공간이 흩어져 생기는 외부 단편화 문제가 발생한다. 이를 해결하는 방법으로는 메모리 압축(빈 공간 재배치)과 연속된 공간이 필요 없도록 메모리를 동일 크기의 블록으로 나누는 페이징 기법이 있다.
페이징은 프로그램과 메모리를 페이지·프레임 단위로 나누어 외부 단편화를 제거하고, 필요한 페이지만 메모리에 올려 더 큰 프로그램도 실행할 수 있도록 하는 가상 메모리 기반 기술이다. 프로세스의 페이지가 실제 메모리의 어떤 프레임에 위치하는지는 페이지 테이블이 관리하며, CPU는 PTBR과 TLB를 이용해 빠르게 주소 변환을 수행한다. 논리 주소는 <페이지 번호, 변위> 형태이며 페이지 테이블을 통해 <프레임 번호, 변위>로 변환된다. 페이지 테이블 엔트리(PTE)에는 유효 비트, 보호 비트, 참조 비트, 수정 비트 등이 포함되어 페이지 상태를 관리하며, 유효 비트가 0인 페이지에 접근하면 페이지 폴트가 발생해 필요한 페이지를 메모리로 불러오는 방식으로 동작한다.
참고