페이징(Paging)
Programming/운영체제

페이징(Paging)

1. 페이징(Paging)

  페이징을 통해 외부단편화 문제를 완전히 해결할 수 있다. 페이징(Paging)이란 프로세스를 일정 크기(=페이지)로 잘라서 메모리에 담는 기법을 말한다.

- 프로세스는 페이지(page)의 집합

- 메모리는 프레임(frame)의 집합

 

MMU 내의 재배치 레지스터 값을 바꿈으로서 페이지를 프레임에 할당한다. 즉, 프로세스 조각들인 페이지가 어느 위치의 프레임에 저장될 지를 재배치 레지스터가 기억한다.

이를 통해, CPU는 프로세스가 연속된 메모리 공간에 위치한다고 착각하게 된다.

MMU는 페이지 테이블(page table)이 된다.

페이지 테이블의 모습

2. 주소 변환(Address Translation)

1) 논리주소 (Logical address)

  - CPU가 내는 주소는 2진수로 표현 (전체 m 비트)

  - 하위 n 비트는 오프셋(offset) 또는 변위(displacement)

  - 상위 m-n 비트는 페이지 번호

 

2) 주소변환 : 논리주소 → 물리주소 (Physical address)

  - 페이지 번호(p)는 페이지 테이블 인덱스 값

  - p에 해당되는 테이블 내용이 물리주소의 프레임 번호(f)가 된다.

  - 변위(d)는 변환되지 않고 그대로 가져간다.

3. 내부 단편화, 페이지 테이블

1) 내부 단편화 (Internal Fragmentation)

  프로세스 크기가 페이지 크기의 배수가 아니라면, 마지막 페이지는 한 프레임을 다 채울 수 없다. 즉 메모리의 조각인 프레임 내 빈 공간이 생기게 된다.

=> 메모리 낭비 발생

 

2) 페이지 테이블 만드는 방법

a. CPU 레지스터  이용 : CPU의 일부분을 페이지 테이블로 만든다

=> 장점 : 속도가 빠르다, 단점: 공간을 많이 생성할 수 없다.

 

b. 메모리 이용 : 메모리의 일부분을 페이지 테이블로 만든다.

=>장점: 공간을 많이 생성할 수 있다, 단점: 속도가 느리다.

 

c. TLB(Translation Look-aside Buffer) 이용

4. 보호와 공유

  페이징을 통해 보호와 공유 측면에서 추가적인 이점을 얻을 수 있다.

 

1) 보호(Protection) : 해킹 등 방지

  - 모든 주소는 페이지 테이블을 경유하므로, 페이지 테이블 엔트리마다 r, w, x 비트를 두어 해당 페이지에 대한 접근제어가 가능해진다. r은 read(읽기), w는 write(쓰기), x는 execute(실행하기)를 의미한다.

아래의 예시를 보면 인덱스 0번의 페이지의 경우 r, w, e가 모두 1인데 이것은 이 페이지가 읽기, 쓰기, 실행하기가 모두 가능하다는 것을 의미한다.

페이지 테이블에 r,w,x 비트를 둔 모습

2) 공유(Sharing) : 메모리 낭비 방지

  - 같은 프로그램을 쓰는 복수 개의 프로세스가 있다면, Code+date+stack에서 Code는 공유 가능

(단, non-self-modifying code=reentrant code=pure code인 경우만 가능)

이를 통해 프로세스의 페이지 테이블 코드 영역이 같은 곳을 가리키게 된다.

 

cf) non-self-modifying code 란 스스로 그 내용을 바꾸지않는 코드를 의미한다.

코드가 스스로 수정된다면 프로세스끼리 코드를 재활용할 수 없게 된다.(코드가 프로세스마다 달라지게 되니까.)