학습목표
- 연속 메모리 할당 기법과 외부 단편화 문제를 이해한다
- 가상 메모리 관리 기법인 페이징의 개념과 작동을 이해한다
- 세그먼테이션 기법의 구현과 동적 주소 변환 과정을 이해한다
- 가상메모리 시스템의 동작 원리와 매핑 테이블의 역할을 이해한다
가상메모리 의미
가상 메모리가 메모리 의존성을 없애고 관리적 의미에서 보안을 포함한다는 말은, 가상 메모리 시스템이 프로그램이 물리적 메모리의 실제 위치에 구애받지 않고 독립적으로 실행될 수 있게 하며, 동시에 각 프로세스의 메모리 공간을 서로 분리하여 관리함으로써 보안을 강화한다는 의미입니다.
메모리 의존성 제거:
- 가상 메모리는 프로그램이 메모리의 어느 위치에 적재되어 있는지에 상관없이 실행될 수 있도록 합니다.
- 즉, 프로그램은 자신이 사용하는 메모리 공간을 연속적인 가상 주소 공간으로 인식하며, 실제 물리적 메모리의 위치는 가상 메모리 시스템이 관리합니다.
- 이로 인해 프로그램은 물리적 메모리의 크기나 구조에 의존하지 않고, 더 큰 가상 주소 공간에서 자유롭게 작동할 수 있습니다.
관리적 의미에서의 보안:
- 가상 메모리 시스템은 각 프로세스에게 독립된 가상 주소 공간을 제공합니다.
- 이는 프로세스가 자신의 메모리 공간 외부의 메모리에 접근하는 것을 기본적으로 방지합니다.
- 이러한 메모리 격리는 프로세스들이 서로의 데이터를 읽거나 수정하는 것을 막아, 시스템의 안정성과 보안을 향상시킵니다.
- 또한, 운영체제는 특정 메모리 영역에 대한 접근 권한을 제어할 수 있으며, 이를 통해 민감한 데이터를 보호하고 악의적인 메모리 접근을 방지할 수 있습니다.
가상 메모리는 이와 같이 프로그램의 메모리 관리를 단순화하고, 시스템의 전반적인 보안과 안정성을 강화하는 역할을 합니다.
페이징을 통한 가상 메모리 관리
배경지식
프로세스를 메모리에 연속적으로 할당하는 방식은 2가지 문제가 있을수 있음
- 외부 단편화
- 물리 메모리보다 큰 프로세스를 실행할 수 없음
이를 해결할 수 있는 방법이 가상 메모리임
가상 메모리는 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술임
이를 가능하게 하는 가상 메모리 관리 기법에는 페이징과 세그멘테이션이 있음
페이징이란

연속 메모리 할당 방식에서 외부 단편화가 생긴 근본적인 이유는 각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문
개요
- 가상 메모리 관리에서 사용되는 기법으로, 물리적 메모리를 동일한 크기의 블록인 '페이지'로 나누고, 가상 주소 공간을 같은 크기의 '페이지 프레임'으로 나누어 관리하는 방식입니다.
- 이 기법은 프로그램이 사용하는 메모리 공간을 물리적 메모리의 연속적인 위치(불연속적으로 항당)에 할당할 필요 없이, 비연속적으로 할당할 수 있게 해줍니다.
이징이 필요한 이유:
- 메모리 단편화 방지: 페이징은 외부 단편화 문제를 해결합니다. 프로그램이 필요로 하는 메모리 공간을 연속적으로 할당할 필요 없이, 여러 페이지에 걸쳐 할당할 수 있기 때문입니다.
- 가상 메모리 구현: 페이징은 가상 메모리 시스템의 핵심 구성 요소로, 프로그램이 실제 물리적 메모리보다 큰 메모리 공간을 사용할 수 있게 해줍니다.
- 보안 및 보호: 각 프로세스의 메모리 공간을 분리하여, 프로세스들이 서로의 메모리에 접근하는 것을 방지합니다.
페이징이 필요한 순간:
- 메모리가 부족할 때: 시스템의 물리적 메모리가 부족할 때, 페이징을 통해 디스크의 일부를 가상 메모리로 사용하여 메모리를 확장할 수 있습니다.
- 멀티태스킹 환경: 여러 프로세스가 동시에 실행될 때, 각 프로세스에 독립적인 메모리 공간을 제공하기 위해 페이징이 사용됩니다.
- 보안이 중요할 때: 서로 다른 프로세스가 서로의 메모리 영역을 침범하지 못하도록 보호하기 위해 페이징이 사용됩니다.
작동 원리
-
페이징 시스템에서는 가상 주소가 두 부분으로 나뉩니다:
-
페이지 번호와 페이지 내 오프셋.
-
CPU가 가상 주소를 생성하면, 페이지 번호는 페이지 테이블을 참조하여 해당 페이지가 물리적 메모리의 어느 페이지 프레임에 있는지 확인합니다. 페이지 테이블은 가상 페이지와 물리적 페이지 프레임의 매핑을 유지합니다. 페이지 내 오프셋은 실제 물리적 주소 내에서의 위치를 나타냅니다. 이렇게 해서 최종 물리적 주소가 결정됩니다.
-
페이징 시스템은 가상 주소를 물리적 주소로 매핑하는 데 페이지 테이블을 사용합니다. CPU에서 생성된 가상 주소는 '페이지 번호(page number)'와 '페이지 내 오프셋(page offset)'으로 나뉩니다.
페이지 번호는 페이지 테이블에서 해당 페이지가 물리 메모리의 어느 페이지 프레임에 있는지를 나타내는 인덱스 역할을 합니다.
페이지 테이블은 이 페이지 번호를 사용하여 해당 페이지 프레임의 시작 물리 주소를 찾고, 페이지 내 오프셋을 이용하여 최종 물리 주소를 계산합니다.
사용 예시
- 운영체제가 페이징을 사용하는 예로는, 멀티태스킹을 지원하는 현대의 거의 모든 운영체제가 있습니다.
- 예를 들어, 윈도우, 리눅스, macOS 등은 모두 페이징 기법을 사용하여 프로세스의 메모리를 관리합니다.
- 사용자가 여러 프로그램을 동시에 실행할 때, 각 프로그램은 독립된 가상 메모리 공간을 할당받고, 실제 물리적 메모리는 페이징을 통해 효율적으로 관리됩니다.
정리하면
페이징은 메모리의 물리 주소 공간을 프레임 단위로 자르고, 프로세스의 논리 주소 공간을 페이지 단위로 자른 뒤 각 페이지를 프레임에 할당하는 가상 메모리 관리 기법임
페이지 테이블

배경
- 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU 입장에서를 이를 순차적으로 실행할 수가 없음 즉 CPU 입장에서는 '다음에 실행할 명령어 위치'를 찾기가 어려워짐
- 해결법은 페이징 시스템은 프로세스가 비록 (실제 메모리 내의 주소인) 물리 주소에 불연속적으로 배치되더라도 (CPU가 바라보는 주소인) 논리 주소에는 연속적으로 배치되도록 페이지 테이블을 이용함
정의
- 페이징 시스템에서 가상 주소를 물리적 주소로 변환하는 데 사용되는 데이터 구조입니다.
- 이 테이블은 가상 메모리의 각 페이지와 해당 페이지가 실제 메모리의 어느 페이지 프레임에 매핑되는지에 대한 정보를 포함합니다.
페이지 테이블이 필요한 이유:
- 주소 변환: CPU가 생성한 가상 주소를 실제 물리적 메모리 주소로 변환하기 위해 필요합니다.
- 메모리 관리: 가상 메모리를 사용하여 프로세스가 더 큰 메모리 공간을 효율적으로 사용할 수 있도록 합니다.
- 보호: 각 프로세스의 메모리 공간을 격리하여 다른 프로세스나 시스템 영역으로부터 보호합니다.
- 공유 및 재배치: 다른 프로세스와 메모리를 공유하거나, 프로세스를 다른 메모리 영역으로 쉽게 이동시킬 수 있습니다.
페이지 테이블이 필요한 순간:
- 프로세스 실행 시: 프로세스가 시작될 때, 운영체제는 페이지 테이블을 생성하여 가상 주소와 물리적 주소의 매핑을 관리합니다.
- 메모리 접근 시: 프로세스가 메모리에 접근할 때마다 페이지 테이블을 참조하여 실제 메모리 위치를 찾습니다.
- 컨텍스트 스위칭 시: 멀티태스킹 환경에서 프로세스 간 전환 시, 각 프로세스의 페이지 테이블을 사용하여 메모리 상태를 유지합니다.
작동 원리
- 프로세스가 메모리에 접근하려고 할 때, CPU는 가상 주소를 생성합니다. 이 가상 주소는 페이지 번호와 오프셋으로 구성됩니다.
- 페이지 번호는 페이지 테이블 내에서 해당 페이지가 물리적 메모리의 어느 페이지 프레임에 있는지를 나타내는 인덱스로 사용됩니다.
- 페이지 테이블은 이 인덱스를 사용하여 물리적 페이지 프레임 번호를 찾고, 이 번호에 오프셋을 더하여 최종 물리적 주소를 결정합니다.
정리하면 페이지 테이블의 페이지 번호를 이용해 페이지가 적재된 프레임을 찾을 수 있음
페이지 테이블 베이스 레지스터

정의
- 프로세스마다 각자의 페이지 테이블을 가지고 있고 각 프로세스의 페이지 테이블들은 메모리에 적재되어 있음
- CPU 내의 페이지 테이블 베이스 레지스터는 각 프로세스의 페이지 테이블이 적재된 주소를 가르킴
TLB(translation lookaside buffer)

문제상황
- CPU에서 메모리에 접근할때 페이지 테이블 접근, 프레임 접근으로 메모리 접근 시간이 두배로 늘어남
- 이러한 문제를 해결하기 위해 CPU 곁에 TLB라는 페이지 테이블의 캐시 메모리를 둠

정의
- TLB는 페이지 테이블의 캐시이기 때문에 페이지 테이블의 일부 내용을 저장
- 참조 지역성에 근거해 주로 최근에 사용된 페이지 위주로 가져와 저장
- TLB는 가상 주소를 물리적 주소로 변환하는 과정에서 발생하는 지연 시간을 줄이기 위해 필요
TLB가 필요한 순간:
- 메모리 접근 시: 프로세스가 메모리에 접근할 때마다 가상 주소를 물리적 주소로 변환해야 하며, 이때 TLB가 사용됩니다.
- 컨텍스트 스위칭 시: 프로세스 간 전환 시, 각 프로세스의 페이지 테이블 정보가 TLB에 로드되어 빠른 메모리 접근을 가능하게 합니다.
작동 원리
- CPU가 메모리 접근을 시도할 때, 가상 주소의 페이지 번호를 사용하여 먼저 TLB에서 해당 페이지의 물리적 주소를 조회합니다.
- 만약 TLB에 해당 정보가 있으면(TLB hit), 바로 물리적 주소를 얻어 메모리 접근을 진행합니다.
- TLB에 정보가 없는 경우(TLB miss), 페이지 테이블을 조회하여 필요한 정보를 가져오고, 이 정보를 TLB에 저장합니다.
- 이후 동일한 페이지에 대한 접근이 있을 때 TLB를 통해 빠르게 주소 변환을 수행할 수 있습니다.
정리하면 TLB는 페이지 테이블의 캐시 메모리 역할을 수행하기 위해 페이지 테이블의 일부를 저장함
페이징에서의 주소 변환

배경
- 하나의 페이지 혹은 프레임은 여러 주소를 포괄하고 있음, 그렇기에 특정 주소에 접근하려면 2가지 정보가 필요함
- 어떤 페이지 혹은 프레임에 접근하고 싶은지
- 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지
위의 문제를 해결하기 위해 기본적으로 페이징 시스템에서는 모든 논리 ㅈ소가 기본적으로 페이지번호와 변위로 이루어짐
페이지번호: 접근하고자 하는 페이지 번호
변위: 접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져 있는지 알기 위한 정보
즉 논리 주소<페이지 번호, 변위>는 페이지 테이블을 통해 물리 주소<프레임번호, 변위>로 변환

위의 예시로 설명해보면
만약 CPU가 5페이지,변위 2라는 논리주소 <5,2>로 접근하고 싶다고 가정하자
그러면 5번 페이지는 현재 1번 프레임에 있음
CPU는 1번프레임,볍뉘 2에 접근
1번 프레임은 8번지부터 시작하므로 CPU는 10번지에 접근함
페이지 테이블 엔트리

개요
- 페이지 테이블 엔트리에는 페이지번호,프레임번호 이외에 유효 비트, 보호 비트, 참조 비트, 수정 비트와 같은 다른 중요정보가 있음
유효 비트

정의
- 해당 페이지가 현재 메모리에 적재되어 있는지를 나타내는 비트입니다.
필요성
- 가상 주소 변환 시 유효한 페이지인지 확인하기 위해 사용됩니다.
- 유효 비트가 0이면 페이지 폴트가 발생하고, 운영체제는 해당 페이지를 메모리로 적재하는 등의 처리를 수행합니다.
사용 예시
- 프로세스가 특정 가상 주소에 접근할 때, 페이지 테이블을 확인하여 해당 페이지가 메모리에 있는지 판단합니다.
- 유효 비트가 1이면 물리 주소로 변환하여 접근하고, 0이면 페이지 폴트 처리 루틴을 호출합니다.
페이지 폴트
- CPU가 유효 비트가 0인 메모리에 적재되어 있지 않은 페이지로 접근하려고 하면 페이지 폴트라는 예외가 발생
처리과정은 다음과 같음
1. CPU는 기존의 작업 내역을 백업
2. 페이지 폴트 처리 루틴 실행
3. 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 뒤 유효 비트를 1로 변경
4. 페이지 폴트를 처리했다면 이제 CPU는 해당 페이지에 접근할 수 있음
보호 비트


정의
- 페이지에 대한 접근 권한(읽기, 쓰기, 실행 등)을 나타내는 비트입니다.
필요성
- 프로세스 간의 메모리 보호와 공유를 제어하기 위해 사용됩니다. 권한이 없는 접근을 방지하여 시스템의 보안과 안정성을 향상시킵니다.
사용 예시
- 코드 영역은 읽기와 실행 권한만 주어 변조를 방지하고, 데이터 영역은 읽기와 쓰기 권한을 부여합니다.
- 공유 라이브러리는 여러 프로세스에 읽기 권한을 주어 효율적으로 사용할 수 있습니다.
참조 비트

정의
- 페이지가 최근에 참조되었는지를 나타내는 비트입니다.
필요성
- 페이지 교체 알고리즘에서 사용되며, 최근에 사용된 페이지를 식별하는 데 도움을 줍니다.
- 주기적으로 참조 비트를 확인하고 초기화하여 페이지의 사용 빈도를 추적할 수 있습니다.
수정 비트

정의
- 페이지의 내용이 변경되었는지를 나타내는 비트입니다.
- 스와핑때매 존재
필요성
- 페이지 교체 시 해당 페이지를 디스크에 기록해야 하는지 판단하는 데 사용됩니다.
- 수정된 페이지는 디스크에 저장해야 하지만, 수정되지 않은 페이지는 버릴 수 있습니다.
사용 예시
- 페이지 교체 알고리즘에서 희생자 페이지를 선택할 때, 수정 비트를 확인합니다.
- 수정된 페이지는 디스크에 기록한 후 메모리에서 제거하고, 수정되지 않은 페이지는 즉시 제거할 수 있습니다.
페이지 교체와 프레임 할당
핵심개념
- 요구페이징
- 페이지 교체 알고리즘
- 스레싱
- 프레임 할당
참고
가상메모리의미
페이징
페이징 테이블
TLB