- 가상 메모리 (virtual memory): 실행하고자 하는 프로그램의 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게하는 기술
- 가상 메모리의 기법: 페이징과 세그멘테이션
01. 페이징
- 외부 단편화의 발생 원인: 각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문
- 페이징 (paging)
- 순서
- 프로세스의 논리 주소 공간을 페이지 (page)라는 일정한 단위로 자름
- 메모리 물리 주소 공간을 프레임 (frame)이라는 페이지와 동일한 크기의 일정한 단위로 자름
- 페이지를 프레임에 할당하는 가상 메모리 기법
- 순서
- 적재될 필요가 없는 페이지들을 보조 장치로 스왑 아웃되고, 실행에 필요한 페이지들은 메모리로 스왑 인되는 것
- 페이지 아웃 (page out): 페이지 단위로 스왑 아웃
- 페이지 인 (page in): 페이지 단위로 스왑 인
- 한 프로세스를 실행하기 위해 프로세스 전체가 메모리에 적재될 필요가 없다는 의미
02. 페이지 테이블
- 문제: 프로세스가 메모리에 불연속적으로 배치되면 CPU는 다음에 실행할 명령어 위치를 찾기 어려움
- 해결: 페이지 테이블 (page table)
- 프로세스가 물리 주소에 불연속적으로 배치되더라도 논리 주소에는 연속적으로 배치되도록 하는 것
- 페이지 번호를 이용해 어떤 페이지가 어떤 프레임에 할당되었는지 알려줌
- 각각의 프로세스마다 페이지 테이블이 존재, 각 프로세스의 페이지 테이블들은 메모리에 적재되어 있음
- 페이지 테이블 베이스 레지스터 (PTGR: Page Table Base Register): 프로세스의 페이지 테이블이 적재된 주소를 가리킴
- 단점: 메모리 접근 시간이 두배로 늘어남 (페이지 테이블, 프레임)
- 해결 방안: TLB
- TLB (Translation Lookaside Buffer): 페이지 테이블의 캐시 메모리
- 페이지 테이블의 일부 내용을 저장
- 참조 지역성에 근거해 주로 최근에 사용된 페이지 위주로 가져와 저장
- TLB 히트 (TLB hit): CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우
- TLB 미스 (TLB miss): 페이지 번호가 TLB에 없을 경우 페이지가 적재된 프레임을 알기 위해 메모리 내의 페이지 테이블에 접근하는 방법
03. 페이징에서의 주소 변환
- 특정 주소에 접근하기 위한 두 가지 정보가 필요
- 어떤 페이지/프레임에 접근하고 싶은지
- 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져있는지
- 페이징 시스템에서의 논리 주소: 페이지 번호 (page number) + 변위 (offset)
- 페이지 번호: 접근하고자 하는 페이지 번호
- 변위: 접근하려는 주소가 페이지 프레임의 시작 번지로부터 얼마나 떨어져있는지 알기 위한 정보
- 논리 주소<페이지 번호, 변위> → [페이지 테이블] → 물리 주소<프레임 번호, 변위>
04. 페이지 테이블 엔트리 (PTE: Page Table Entry)
- 페이지 테이블의 각각의 행들
- 페이지 테이블 엔트리에 저장되는 중요한 정보들
- 유효 비트 (valid bit): 현재 해당 페이지에 접근 가능 여부 (적재되어 있음:1, 적재되어 있지 않음:0)
- 페이지 폴트 (page fault): 유효 비트 0인 경우에 접근하면 발생 (Exception)
- 페이지 폴트를 처리하는 과정
- CPU는 기존의 작업 내역을 백업
- 페이지 폴트 처리 루틴을 실행
- 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 후 유효 비트를 1로 변경
- 페이지 폴트를 처리했다면 CPU는 해당 페이지로 접근 가능
- 보호 비트 (protection bit): 페이지 보호 기능을 위해 존재하는 비트
- 읽기 (R) / 쓰기 (W): 2 가지로 나누는 방법
- 비트 0: 읽기만 가능
- 비트 1: 읽기 / 쓰기 가능
- 읽기(R) / 쓰기 (W) / 실행 (X): 3 가지로 나누는 방법
- 비트 0: 불가능
- 비트 1: 가능
- 읽기 (R) / 쓰기 (W): 2 가지로 나누는 방법
- 참조 비트 (reference bit): CPU가 이 페이지에 접근한 적이 있는지의 여부를 나타냄
- 비트 0: 접근한적 없음
- 비트 1: 접근함
- 수정 비트 (modified bit): 해당 페이지에 데이터를 쓴 적 있는지 없는지 수정 여부를 나타냄
- == 더티 비트 (dirty bit)
- 비트 0: 변경된 적이 없는 페이지 (접근은 존재했어도 읽기만 함)
- 비트 1: 변경된 적이 있는 페이지
- 존재 이유: 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 진행해야하는 지 판단하기 위해
- 유효 비트 (valid bit): 현재 해당 페이지에 접근 가능 여부 (적재되어 있음:1, 적재되어 있지 않음:0)
05. 페이징의 이점 - 쓰기 시 복사
- 쓰기 시 복사 (copy on write): 프로세스 간 페이지를 공유하는 방법
- 방법
- 부모 프로세스를 이용하여 자식 프로세스를 만드는 경우, 처음에는 부모 프로세스와 동일한 프레임을 가리킴
- 읽기 상태만 진행한다면 위와 같은 상태가 유지
- 쓰기 상태를 진행한다면 자식 프로세스에게 고유한 페이지를 할당함
- 장점: 프로세스 생성 시간 줄이고 메모리 공간 절약 가능
06. 계층적 페이징
- 계층적 페이징 (hierarchical paging): 프로세스를 이루는 모든 페이지 테이블 엔트리를 항상 메모리에 유지하지 않는 방법
- == 다단계 페이지 테이블 (mulrilevel page table)
- 방법
- 프로세스의 페이지 테이블을 여러 개의 페이지로 자름
- 바깥쪽에 페이지 테이블을 하나 더 두어 잘린 페이지 테이블의 페이지들을 가리키게 하는 방식
- 바깥 페이지 번호 → 페이지 테이블 엔트리
- 안쪽 페이지 번호 → 첫 번째 페이지 테이블의 페이지 번호
- 주소 변환 방법
- 바깥 페이지 번호를 통해 페이지 테이블의 페이지 찾음
- 페이지 테이블의 페이지를 통해 프레임 번호를 찾고 변위를 더함으로써 물리 주소 얻음
'CS 상식 - 운영체제' 카테고리의 다른 글
[CS 상식 - 운영체제] 페이지 교체와 프레임 할당 (1) | 2025.02.25 |
---|---|
[CS 상식 - 운영체제] 연속 메모리 할당 (1) | 2025.02.20 |
[CS 상식 - 운영체제] 교착 상태 해결 방법 (1) | 2025.02.19 |
[CS 상식 - 운영체제] 교착 상태 (0) | 2025.02.19 |
[CS 상식 - 운영체제] 동기화 기법 (2) | 2025.02.19 |