페이징 & 세그멘테이션
→ 가상 메모리를 관리하는 기법
☑️ 페이징이란? (Paging)
→ 가상메모리사용, 외부 단편화 해결, 내부 단편화 존재
- 프로세스를 일정크기로 자르고, 이를 메모리에 불연속적으로 할당해서 외부단편화 문제를 해결함
- 프로세스의 논리주소 공간을
페이지(page)
라는 일정 단위로 자르고,
- 메모리의 물리 주소 공간을
프레임이(frame)
이라는 페이지와 동일한 일정한 단위로 자른뒤
- 페이지를 프레임에 할당하는 가상 메모리 관리 기법
🗣️ 메모리 주소 2가지
- 물리적 메모리주소 : 실제 메모리 상에 존재하는 주소를 의미한다.
- 논리적 메모리주소 : 프로세스에 메모리가 할당이 됐을때, 현재 물리메모리 안에서 실행중인 메모리의 위치를 나타내는 주소로, 프로세스 내부에서는 0~끝 까지를 의미하게 되며, 이말은 즉, 프로세스 내부에서 사용하는 메모리의 위치를 나타내는 값이다.
페이징에서의 스와핑
- 프로세스를 실행하기 위해 모든 페이지가 적재될 필요가 없다.
- 달리 말해 물리 메모리보다 큰 프로세스도 실행될 수 있다.
⇒ “모든프로세스를 실행하기 위해서 모든페이지가 메모리에 적재될 필요 없다
”
페이지 테이블 (PageTable)
페이지 테이블 위치 : main memory
⇒ 불연속적으로 배치된 페이징의 문제를 해결하기 위함
⇒ 각 프로세스마다 페이지 테이블이 존재함
🗣️ [불연속적 배치된 페이징의 문제]
- 프로세스를 이루는 페이지가 어느 프레임에 적재되어 있는지 CPU가 일일이 알기 어렵다.
- 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU 입장에서 이를 순차적으로 실행할 수가 없음
- (실제 메모리 내의 주소인) 물리 주소(프레임 번호)에 불연속적으로 배치되더라도
- (CPU가 접근하는 주소인) 논리 주소(페이지 번호)에 연속적으로 배치되도록 하는 방법
- 페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표
MMU(Memory Management Unit)의 개념
CPU와 Cache 사이 불연속적 메모리 주소를 논리적 연속된 가상 주소로 Mapping 관리 장치
페이지 테이블 장점
- 불연속적인 물리주소(프레임)일 지라도 CPU가 논리주소(페이지 번호)를 통해 순차적으로 실행 가능하게 함
PTBR(페이지 테이블 베이스 레지스터)
- 프로세스마다 페이지 테이블이 있고,
- CPU내의 페이지 테이블 베이스 레지스터(PTBR)은 각 프로세스의 페이지 테이블이 적재된 주소를 가리키고 있다.
페이지 테이블이 메모리에 저장되어있으면 문제점
- 메모리 접근 시간이 두배로 늘어난다.
- 첫번째는 메모리에 있는 페이지 테이블을 보기 위해
- 두번째는 그렇게 알게된 프레임에 접근하기 위해
TLB(Translation Lookaside Buffer)
- CPU 곁에 페이지 테이블의 캐시 메모리
- 페이지 테이블의 일부를 가져와 저장하는 캐쉬 메모리(자주 참조하는 것 저장)
참조 지역성
에 근거해 주로 최근에 사용된 페이지 위주로 가져와 저장함
🗣️ 참조 지역성의 원리(locality of reference)
: 참조한 데이터 다시 참조 가능성 높고 주변 데이터 역시 참조될 가능성 높음
[구체적인 설명]
'참조 지역성 원리'는 CPU가 미래에 원하는 데이터를 예측하여 속도가 빠른 장치인 캐시 메모리에 담아 놓는데 이때의 예측률을 높이기 위하여 사용하는 원리다. 간단하게 말해서 CPU가 최근 참조한 메모리를 다시 참조할 확률이 높아 '캐시 데이터'에 담아둔다는 얘기다. 이러한 특성으로 연속된 메모리를 연속으로 읽는 작업이 떨어져 있는 메모리들을 읽는 것보다 빠르다.
cf ) Heap sort ⇒ 참조 지역성을 활용하지 않는 알고리즘이다.
TLB 히트 : CPU가 접근하려는 논리주소가 TLB에 있는 경우 ( 메모리 접근 한번)
TLB 미스: CPU가 접근하려는 논리주소가 TLB에 없는 경우 (메모리 접근 두번)
페이징에서 주소 변환
페이지 혹은 프레임은 여러 주소를 포괄하고 있다.
그렇기에 특정 주소에 접근하려면 아래 같은 두가지 정보가 필요하다.
- 어떤 페이지 혹은 프레임에 접근하고 싶은지
- 접근하려는 주소가 그 페이지 혹은 프레임으로 부터 얼마나 떨어져 있는지
페이징 시스템에서 논리 주소
- 모든 논리주소는
페이지 번호
와 변위
로 이루어짐
- 즉, 논리주소
<페이지, 변위>
는 페이지 테이블을 통해 <프레임 번호, 변위>
로 변환됨
- ⇒ 논리주소상 변위와 물리주소상 변위는 같다.
- 페이지의 크기와 프레임의 크기는 같기 때문이다.
🗣️ 예시)
논리주소가 <5,2> 라면 페이지 테이블을 통해 <1,2>로 변환되고 실제 접근하고 싶은 메모리 주소는 1번 프레임에서 2만큼 떨어진 주소이므로 10번지
가 나온다.
페이지 테이블 엔트리(PTE)
- 페이지 테이블의 각각의 행 : 페이지 테이블 엔트리(PTE)
- PTE에는 페이지 번호, 프레임 번호 이외에도 많은 정보가 담긴다.
✔️유효비트
: 현재 해당 페이지에 접근가능한지 여부
즉, 현재 비트가 메모리에 적재가 되었다면 1 (접근가능) / 보조기억장치에 있으면 0 (접근 불가능)
만약 유효 비트가 0인 페이지(보조기억장치에 있는 페이지)에 접근하려면 페이지 폴트
발생
- 페이지 폴트(page fault)라는 인터럽트 발생
1. CPU는 기존의 작업내역 백업
2. 페이지 폴트 처리 루틴을 실행함
3. 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 뒤 유효비트를 1로 변경해 줍니다.
4. 페이지 폴트를 처리했다면 CPU는 해당 페이지에 접근할 수 있게 된다.
페이지 폴트(Page Fault)
가상 메모리(Virtual Memory) 시스템에서 발생하는 현상으로, 프로세스가 실행 중인 동안 필요한 데이터나 명령을 물리 메모리(실제 메모리)에 찾을 수 없어서 발생하는 상황을 나타낸다.
✔️보호비트
:페이지 접근 권한을 제한하여 페이지를 보호하는 비트
- 해당 페이지가
읽기, 쓰기
중에서 어떤 것이 가능한지 알려주는 비트이다.
- 읽기 & 쓰기 모두 가능하면 1 / 읽기만 가능하면 0 인 페이지 이다.
✔️참조비트
: CPU가 이 페이지에 접근한적이 있는지 여부를 알려줌
- 접근한 적이 있는 페이지 1 / 접근한적이 없으면 0
✔️수정비트(= dirty bit)
: CPU가 이 페이지에 데이터를 쓴적이 있는 여부를 알려줌
- 즉, 페이지가 메모리에서 사라질때 보조기억장치에 쓰기 작업을 해야하는지 판단하기 위함
- 메모리가 바뀌면 저절로 보조기억장치도 바뀌는게 아님
- 메모리에 읽기만 했다면 보조 기억장치랑 비교후 수정 안해도 되기 때문에 수정 비트가 0으로,
- 메모리에서 쓰기를 했다면 보조기억장치에도 수정을 해줘야 하기 때문에 수정 비트가 1로 알려줌
페이징의 문제점
: 홀의 크기가 균일하지 않은 문제가 없어지지만, 주소 변환이 복잡해짐
내부 단편화의 문제
🗣️ 내부 단편화 크기는 외부 단편화 크기보다 작은 경우가 많다.
🗣️ 페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 크기로 자른다.
그런데 모든 프로세스가 페이지 크기에 딱 맞게 잘리는 것이 아니다.
예시)
- 페이지 크기 10KB, 프로세스 크기 108KB
→ 2KB 내부 단편화 발생
페이징 이점 - 프로세스 간 페이지를 공유
쓰기 시 복사
- 쓰기 시 복사
- 부모 프로세스와 동일한 자식 프로세스가 복제되어 생성되면 자식프로세스는 부모 프로세스와 동일한 프레임을 가리킴 (쓰기 작업이 없다면 이 상태 유지함)
- BUT, 페이지에 쓰기작업을 한다면 ?
- 부모, 자식 프로세스 둘 중 하나가 페이지에 쓰기 작업 수행시에는 해당 페이지의 별도 공간으로 복제함(프로세스 생성 시간 절약, 메모리 절약)
계층적 페이징(다단계 페이지 테이블)
이전까지의 페이지 테이블 문제점
:
- 프로세스 테이블의 크기는 생각보다 작지 않다.
- 프로세스를 이루는 모든 페이지 테이블 엔트리를 메모리에 두는 것은 메모리의 큰 낭비
- 프로세스를 이루는 모든 페이지 테이블 엔트리를 항상 메모리에 유지하지 않을 방법
→ 이를 해결하기 위해 계층적 페이징이 나옴
계층적 페이징 개념
- 페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식
계층적 페이징 장점
- 모든 페이지 테이블을 항상 메모리에 항상 유지할 필요가 없음
계층적 페이지 이용하는 논리주소
⇒ outer 페이지 , 안쪽 페이지 번호 , 변위로 구성됨
바깥 페이지 번호
는 CPU와 근접한 페이지 테이블의 엔트리를 가리키고, 안쪽페이지
는 페이지 테이블의 페이지 번호를 가리키는 형식
⇒ 여러 단계가 있을 수 있다.
계층적 페이징 단점
- 페이지 테이블의 계층이 늘어날수록 페이지 폴트가 발생했을 경우 메모리 참조 횟수가 많아지므로 계층이 많다고 해서 좋다고 볼 수 없다.
☑️ 세그멘테이션 (Segmentation)
→ 가상메모리사용, 내부 단편화 해결, 외부 단편화 존재
- 페이징기법에서 가상메모리를 같은 크기의 단위로 분할했지만 세그멘테이션기법에서는 가상메모리를
서로 크기가 다른 논리적 단위인 세그먼트로 분할해서 메모리를 할당하여 실제 메모리 주소로 변환을 하게 된다.
- 프로세스를 서로 크기가 다른 논리적인 블록 단위인 세그먼트(Segment)로 분할하여 메모리에 할당
- 각 세그먼트는 연속적인 공간에 저장
- 세그먼트들의 크기가 서로 다르기 때문에 프로세스가 메모리에 적재될 때 빈 공간을 찾아 할당하는 기법
- 페이징과 마찬가지로 mapping을 위한 segment table 필요(각 세그먼트 항목별 세그먼트 시작주소와 세그먼트의 길이 정보를 가지고 있음)
세그멘테이션 문제점
: 프로세스가 필요한 메모리 만큼 할당해주기 때문에 내부단편화는 일어나지 않으나, 여전히 중간에 프로세스가 메모리를 해제하면 생기는 구멍, 즉 외부 단편화 문제는 여전히 존재한다.
☑️ Paging vs Segmentation
- Paging은 고정 크기를 가짐
- Segmentation은 가변 크기를 가짐
- Paging은 내부 단편화 발생 가능, Segmentation은 외부 단편화 발생 가능