UE5/UE5 Lyra_Clone

Lyra) 페이징과 스와핑

PJNull 2023. 10. 10. 16:26
728x90
반응형

페이징

프로세스에게 메모리를 할당할때 가장 쉬운 방법은 통째로(연속적으로 메모리 할당)해주는 것이다. 이런 방식은 메모리가 연속적이기 때문에 관리도 쉽지만 프로세스의 크기가 커질수록 문제가 생기게 된다. 만약 동적으로 메모리를 할당하게 되면 외부 단편화( External Fragmentation)가 발생하게 된다. 이를 보안하기 위해서 사용하는것이 바로 페이징 기법이다.  

 

페이징의 원리

페이징은 프로세스의 물리적인 주소를 비연속적으로 관리하기 위해 작은 단위로 쪼개며, 이런식의 관리는 외부 단편화를 완화시키며 단편들을 모아 압축시키는 작업을 완화시킬수 있다. 다만, 메모리에 접근해야되기 떄문에 OS와 H/W의 도움이 필요 기법이다. 페이징에서 frame과 page라는 단어가 자주 등장하는데, 각각은 다음과 같은 의미를 지닌다.

frame:물리 메모리를 쪼갠 단위

page:논리 메모리를 쪼갠 단위

 

페이지 테이블

 

CPU가 주소를 생성할때 다음과 같은 논리주소를 할당한다. 논리주소를 결정하는 비트수는 페이지넘버와 오프셋에 따라 결정된다.

그렇다면 이러한 논리주소는 어떻게 물리주소에 접근하게 되는 것일까?

1.논리주소의 페이지 넘버(p)를 통해 페이지 테이블의 인덱스를 사용한다.

2.페이지 테이블에서 페이지 프레임(f)를 찾아주고 물리주소에 페이지 프레임(f)와 offset을 넣어준다.

3.해당 프레임 넘버(f)에서 offset(d)을 통해 물리 메모리에 접근한다.

 

 

 

PTBR방식(Page Table Base Register)

CPU스케쥴러가 새로운 프로세스를 실행할때, 페이지 테이블도 문맥교환이 일어나게 된다. 규모가 큰 프로세스의 경우 페이지 테이블 또한 규모가 크기 때문에 이에 맞춘 H/W적으로 관리는 쉽지 않다. 따라서 S/W적으로 관리를 해야될 필요성이 있는데, PTBR이라는 레지스터를 통해 페이지 테이블을 관리하게 된다. 

PTBR은 메인 메모리에 있는 페이지 테이블의 시작 주소를 가르킨다. 이럴 경우 문맥교환이 일어날 경우에도 빠르게 작동할수 있다는 장점이 있다. 다만 메모리 접근 속도는 느린데, 메모리에 페이지 테이블이 있기 때문에 메모리 접근을 두번(페이지테이블+실제 데이터) 해야되는 단점이 있다. 

 

TLB방식(Translation Look-aside Buffer)

메모리 접근을 두번해야되는 PTBR을 보완하기 위해 나온것이 TLB방식이다. TLB는 캐시메모리에 일정량의 프레임 넘버와 offset을 저장하고 TLB Hit시 곧바로 물리메모리에 접근하게 하는 방식이다. 단 캐시메모리 특성상 모든 정보를 담을수 없기 때문에 TLB Miss가 일어나게 되면 PTBR방식으로 메모리를 두번 접근해야된다.

 

페이징의 메모리 보호

페이징에서는 각 프레임마다 1bit인 vaild/invaild bit를 protection bit로써 추가/사용해야된다. 

protection bit가 vaild할경우 해당 페이지는 논리 주소에 포함되어 있기 때문에 legal이라 할수 있다. 

protection bit가 invaild할경우 논리 주소에 포함되어 있지 않기 때문에 illegal이라 할수 있다.

 

페이지 공유

페이지 공유는 .dll와 같이 변경이 안되는 것을 실행할때 매우 유용하다. 밑의 그림과 같이 각 프로세스는 다른 메모리에 있지만, 페이지 테이블에서 물리메모리의 주소를 공유하고 있어 메모리 낭비를 줄일수 있다.

 

 

 

페이지테이블의 종류

페이지 테이블이 점점 커짐에 따라 더욱 효율적인 방식이 나오게 되었다.

 

1.계층구조 페이징:페이지 테이블을 관리하는 별도의 테이블을 생성하는 방식

 

 

2.해쉬 페이지 테이블:논리주소를 해쉬함수를 이용하여 해쉬테이블을 생성하고 물리메모리에 접근하는 방식이다.

 

 

 

3.역 페이지 테이블:지금까지 논리주소를 이용하여 페이지테이블을 형성하는 방식을 사용하였지만 역 페이지 테이블의 경우 페이지 아이디(pid)를 논리 주소에 할당함으로써 페이징하는 기법이다.

 

 

 

 

스와핑

실제 메모리보다 크기가 큰 로직메모리를 사용하기 위해 사용하는 기법으로써 메모리에 엑세스할때만 실제 메모리에 올라오도록(swap in)하고 그렇지 않을 경우 backing store로 추방한다.(swap out)
다만 프로세스를 swap하기에는 부담이 너무 크기 때문에 페이지를 swap한다.

 

현재는 스와핑을 페이징이라고 한다.
(swap in->page in)(swap out->page out)

728x90
반응형