운영체제 9-3 : 페이징과 페이지 테이블 + 스와핑

Jang990·2024년 1월 5일
0

운영체제

목록 보기
9/9

가변 분할 방식인 가변 파티션과 고정 분할 방식인 페이징에 대해서 알아봤고, 두 방식에서 일어나는 단편화에 대해서 알아봤다.
하지만 페이징과 페이징 테이블에 대한 궁금한 점들이 남아 있다.
이 글에서 페이징과 페이징 테이블에 대해서 더 자세하게 알아보고 추가적으로 스와핑을 알아본다.

물리 - 프레임 테이블

운영체제는 물리 메모리를 관리하기 때문에 물리 메모리의 할당에 관해서 자세하게 파악하고 있어야 한다.

예를 들어 어느 프레임이 할당됐는지, 어느 프레임이 사용가능한지, 총 프레임은 얼마나 되는지 등등을 파악하고 있어야 한다.

이런 정보는 프레임 테이블이라는 시스템에 단 하나뿐인 자료구조에 저장된다.
이를 통해 운영체제는 모든 프로세스의 주소를 실제 주소로 매핑할 수 있어야 한다.
(만약 시스템 콜을 호출할 때 인자로 특정 주소를 넘겨준다면 운영체제는 해당 주소를 찾아서 접근할 수 있어야 한다)

논리 - 페이지 테이블

페이징을 할 때 논리 주소를 물리 주소로 변환하기 위해서 페이지 테이블은 필수적이다.
프로세스마다 각기 다른 페이지를 가지기 때문에 페이지 테이블은 프로세스마다 다르다.

결국 각각의 페이지 테이블에 대한 정보는 운영체제가 가지고 있어야 한다.
운영체제도 메모리에 올라와 있는 프로세스이기 때문에 페이지 테이블도 메모리에 저장된다.

속도를 위해 레지스터에 올려보자.

컨텍스트 스위칭을 할 때 레지스터에 페이지 테이블의 정보를 같이 적재해서 물리 주소 변환 속도를 빠르게 하는 방법이 있다.

속도가 빨라져서 그냥 좋을 것 같지만 페이지 테이블 크기가 큰 경우를 생각해보자.
컨텍스트 스위칭 시에 큰 페이지 테이블을 모두 레지스터에 적재시켜야 하기 때문에 컨텍스트 스위칭 시간을 증가시킨다.
또한 페이지 테이블의 크기가 매우 크다면(2^20) 많은 레지스터를 사용해야 하므로 적절하지 않다.
(페이지 테이블이 256 항목정도로 작다면 적절할 수도 있다)


프로세스마다 페이지 테이블은 다르기 때문에 페이지 테이블에 대한 포인터(주소)가 있어야 한다.
이 포인터는 PCB에 PTBR(Page-Table Base Register)로 저장돼 있다.
대부분의 운영체제는 페이지 테이블을 메모리에 저장하고 PTBR을 사용한다.
PTBR을 이용해서 실제 데이터에 접근하는 과정은 다음과 같다.

  1. PTBR에 해당하는 페이지 테이블 메모리 영역 접근
  2. 페이지 번호를 프레임 번호로 변환
  3. 프레임 번호에 해당하는 메모리 영역 접근

어쩔 수 없이 2번의 메모리 접근이 필요하고 실제 데이터에 접근하는 시간은 2배로 느려지게 된다.

TLB(Translation Look-aside Buffer)

2번의 메모리 접근으로 인한 성능 저하를 해결하기 위해 TLB가 사용된다.
TLB는 특수한 소형 하드웨어 캐시이다.

TLB를 검색하는 작업은 명령어 파이프라인에 포함되기 때문에 성능상의 손해가 없다.
하지만 그로인해 TLB는 32~1024개의 항목 정도의 작은 크기를 유지해야 한다.

TLB에는 페이지 테이블의 일부가 저장된다.

TLB에서 페이지 번호를 찾을 수 있다면(TLB Hit) 바로 데이터 메모리에 접근한다.
TLB에서 페이지 번호를 찾을 수 있다면(TLB Miss) 앞서 살펴본 단계대로 2번 메모리에 접근한다. 그리고 해당 페이지 번호와 프레임 번호를 TLB에 저장한다.

만약 TLB가 가득 찬다면 기존 항목 중에 교체 대상을 선택한다.
교체 정책은 LRU, RR, 무작위 등등 다양하다.(LRU는 10장에서 확인한다.)

컨텍스트 스위칭이 일어나면?

TLB를 통해서 페이지 번호에 해당하는 프레임 번호를 캐싱했다.
이렇게 TLB를 사용하고 있다가 컨텍스트 스위칭이 일어나면 어떻게 될까?
프로세스가 변경됐지만 TLB로 인해 다른 프로세스의 프레임에 접근하게 될 수 있다.

그렇기 때문에 컨텍스트 스위칭이 발생했을 때 다음 2가지 방식 중 한가지 방식으로 TLB를 처리하면 된다.

  1. TLB를 전부 지워준다. (TLB flush)
  2. TLB 항목이 어느 프로세스에 속한 것인지 적어놓는다. (ASID Address Space ID)

유효/무효 비트(Valid/Invalid)

컴퓨터에서 표현할 수 있는 주소공간이 2^14이라고 가정하자.
이 컴퓨터에 2^8내의 주소만 필요한 프로세스가 메모리에 올라왔다.
즉 2^8승을 넘어가는 주소는 잘못된 접근이 되는 것이다.

다시 페이지 테이블로 돌아오자.
페이지 테이블에는 이런 잘못된 접근을 막기위해 유효/무효 비트가 존재한다.

v는 유효한 페이지를 나타내고 i는 무효한 페이지를 나타낸다.
현재 0~5 페이지만 존재하므로 6~7페이지는 무효한 페이지이다.

만약 무효한 페이지에 접근한다면 운영체제가 하드웨어로 트랩을 발생시킨다.

페이징의 장점 : 공유 페이지

c언어로 특정 문자를 출력하는 간단한 프로그램이 있다고 가정하자.
이 프로그램은 stdio.h를 사용할 것이다.
여기서 stdio.h가 10MB라고 가정하고 이런 간단한 프로그램이 100개가 메모리에 올라간다고 생각해보자.
약 1GB의 메모리가 똑같은 stdio.h로 낭비될 것이다.

페이징의 장점은 이런 공통의 코드를 공유할 수 있다는 것이다.
stdio.h는 딱 하나만 메모리에 저장되고, 여러 프로세스가 그 코드를 공유하는 것이다.

그림의 페이지 테이블은 모두 실제 물리 메모리에 있는 똑같은 lib를 공유하고 있다.

페이지 테이블이 너무 커진다.

많은 현대 컴퓨터는 매우 큰 주소 공간을 가진다.(32비트, 64비트)
이에 따라 페이지 테이블도 상당히 공간을 차지한다.

32비트(4B) 주소 공간을 가지고 페이지 크기가 4KB로 설정됐다고 가정하고 대충 계산해보자.
페이지의 크기가 4KB(2^12B)라면 페이지의 번호 수는 2^20(2^32/2^12)으로 100만개 이상의 페이지 항목으로 구성된다.
각각의 페이지 항목은 다시 32비트(4B)로 구성되므로 약 4,000,000B가 된다.
즉 약 4MB의 공간이 된다는 것이다.

4MB는 페이지의 크기인 4KB보다 커진다.
즉 페이지 테이블도 페이징의 대상이 된다.

이런 경우 해결하는 방법이 여러가지가 있는데 언급만 하고 넘어간다.

  1. 계층적 페이징
  2. 해시 페이지 테이블
  3. 역 페이지 테이블

스와핑 (Swapping)

(나중에 작성)

참고

참고 및 출처

도서 - 운영체제
인프런 - 운영체제 공룡책 강의

profile
공부한 내용을 적지 말고 이해한 내용을 설명하자

0개의 댓글