본문 바로가기
운영체제

운영체제 페이징 기법

by PainDiver 2022. 11. 27.

 

 

학교다닐 때 운영체제 시간에 배웠던건데, 진짜 헬파트였다고 생각한다.

 

운영체제 페이징 기법은, 기존 메모리들이 들쑥날쑥하게 할당되면서 실제로 할당해제된 공간이 충분히 큼에도 불구하고 메모리가 구멍구멍으로 나누어져 있어서 사용하지 못하는 메모리가 되어버리는 현상을 의미하는데, 이걸 외부단편화 현상이라고 한다.

 

이미지를 가져오자면 이런느낌,

이러다 보니까 프로세스들을 계속해서 연속적으로 위치하도록 밀어넣어주지 압축하지 않으면 중간에 구멍나있는 부분들을 채울수가 없게 되는 것이다.

 

그래서 이를 방지하기위해 메모리 할당 사이즈를 고정적인 사이즈로 분할 시키는 것이다.

이게 뭔소리냐?

 

 

그림을 보자

프로세스에서 할당요청하는 메모리들은 사실 실제 메모리상에서 연속적으로 붙어있지 않다. 그 메모리들은 사실 가상메모리 이다. 실제 메모리는 프레임이라는 고정사이즈의 크기의 슬롯형태로 이루어져있고, 그에 해당하는 부분에 가상메모리를 페이지라는 단위로 동적으로 들어가게 하는 것이다.

 

고정할당 사이즈이다 보니 예를들어 페이지 크기가 4kb단위이고, 58kb가 적재되어야 돌아가는 프로세스라 치면 60kb를 할당받을 수 밖에 없다.  그러다보니 내부단편화 현상이 일어난다.

 

내부단편화 현상은 외부단편화현상과는 다르게, 할당받은 메모리 내에서 다 쓰이지 않음에도 불구하고 메모리를 고정사이즈로 할당하다 보니 더 할당을 한 경우 일어난다. 허나, 외부단편화에 비하면 굉장히 미미한 수준의 메모리 할당이다.

 

 

자 그렇다면 페이징의 이점은 알았다.

 

 

그런데 페이징은 어떻게 메모리가 연속되는 공간에 없어도 동작할 수 있을까?

 

사진 가운데를 잘 보면 페이지 매핑이라고 적혀있다.

 

그렇다 페이지를 실제 메모리로 접근시켜주는 매핑테이블을 가지고 비연속적인 메모리를 관리하는 것이다.

 

프로세스는 각자 프레임에 매핑되는 페이징 테이블을 가지고 있다. 그 요소들을 페이지 테이블 엔트리라 일컫는다.

그 페이지 테이블 엔트리는 포인터라하면 8바이트를 가정하고, 만약 프로세스 마다 이걸 하나씩 갖는다면 64비트 컴퓨터 환경에서는 2^51개의 pte가 모든 프레임에 매핑되는데 필요할 것이다. 즉, 말도안된다. 16페타바이트가 한 프로세스당 필요하게 될 것이란 말씀.

 

그래서 모든 프레임을 매핑시키는 형태로는 안쓰고, 쓸 프레임만 테이블에 저장해두는 방식으로 쓰인다.

그것이 다 단계 페이징테이블이다.

 

 

설명해보자면, 상위비트 첫번째 테이블, 중위비트를 두번째 테이블, 마지막비트들은 페이지오프셋을 가리킨다.

 

왜 이렇게 하느냐? 상위비트만으로도 페이지단위로 건너 뛰면서, 쓰는 페이지 안쓰는 페이지를 구분 할 수 가 있다.

두번째 페이지테이블 주소가 NULL로 되어있으면 안쓰는 페이지라는 의미 인 것이다. 즉, 상위비트와 중위비트로 페이지테이블을 레벨별로 나누면서 훨씬 낮은 사이즈로도 페이지를 매핑시킬 수 있다는 것이다.

 

자 문제는 그럼 다 해결되었는가? 아니다.

사실 저 이미지에서는 저렇게 2단계로 딱 끝나지만, 저 단계가 더 많을 수 있다.

 

그렇게 되면 메모리 접근 속도가 어떻겠나? 매우 느려질 것이 당연하다.

 

그래서 쓰이는게 TLB(Transtion Lookaside Buffer)라는 것이다

쉽게말해 캐시를 쓴다는 것이다.

 

Spatial Locality : 프로그램이 메모리 x에 접근했다면, 다음번에는 x 근처의 메모리에 접근할 가능성이 높다.

Temporal Locality : 프로그램이 접근했던 메모리는 가까운 시간 내에 다시 접근할 가능성이 높다.

 

이 두가지의 캐시의 특징을 믿고 신뢰의 도약을 하는거다

 

 

TLB의 Entry는 PTE와 비슷하지만 VPN이 index 역할을 할 수 없기 때문에(VPN이 없으면 어떻게 비교를 하나?)

VPN이 같이 저장되어야 한다.

그리고 뒤쪽에는 PTE처럼 valid, protection bit와 같은 flag들이 저장된다.

 

TLB는 용량이 작기 때문에 여러 프로세스가 나누어 사용해야 한다.

VPN - PFN 둘다 들고 있어서 멀티레벨로 안되어 있을 뿐더러, 멀티레벨로 구현하면 접근속도가 느려질테니 의미가 없다.

 

그래서 프로세스별로 항상 Flush 하면서 사용해야하나 비효율적이므로 bit부분에 있는 ASID값을 이용해 어떤 프로세스의 TLB요소인지 확인하며 사용된다. 

 

TLB는 제한된용량을 가지므로 가장 오랫동안 쓰이지 않은 요소가 제거되면서, 자리를 확보한다.

 

 

[Reference]

[운영체제 OS] 메모리 관리기법 - 페이징 (paging)이란? 내부 단편화(Internal Fragmentatoin)에 대해 알아보자 (tistory.com)

Translation Lookaside Buffers - TLB란? (tistory.com)

'운영체제' 카테고리의 다른 글

커널쓰레드와 유저쓰레드  (0) 2022.11.29
쓰레드의 생명주기  (0) 2022.11.29
프로세스와 쓰레드 그리고 Context Switching  (0) 2022.11.26