[CS] 불연속할당_Page기법

do yeon kim·2022년 10월 22일
0

CS-운영체제

목록 보기
14/20

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

물리적메모리 관리 방법_불연속할당

사용자 프로세스를 물리 메모리에 할당하는 방법은 크게 두가지로 나뉜다.
연속할당(프로그램을 통째로 올리는방법)불연속 할당이 있다.

연속할당의 경우 주소변환이 간단했다.
연속할당에서 프로그램의 논리적주소를 물리적인 주소로 바꾸는 것은 시작주소만 알면 변환이 쉬웠다. 레지스터를 이용해서 시작위치에 논리적위치를 더해서 물리적위치를 알기 쉬웠다.

하지만 지금의 시스템은 불연속 할당 방식으로 동작하고 있다.



Paging기법

실제로는 통째로 올라가는 것이 아닌 프로그램을 구성하는 주소공간이 동일한 크기의 페이지로 나누어서 물리적위치에 올리는 방법이다.

각각의 페이지들이 어느 위치에 올라가는 지를 알기 위해서는 각각의 페이지에 대해서 주소 변환을 해주어야 한다.

내부단편화가 일어나는 이유는 프로세스를 모두 같은 크기로 나눈다고 했지만, 프로세스마다 크기가 다르기 때문에 맨 마지막의 페이지의 경우 페이지의 크기보다 작을 수 있다. 그렇기 때문에 내부단편화가 발생한다.

각각의 페이지별로 나누어서 비어 있는 공간에 물리적위치에 할당한다.

페이지테이블은 각각의 논리적페이지들이 물리적메모리에 어디에 위치하는지 적어둔것이다.
물리적메모리에서 페이지가 들어갈 수 있는 공간을 페이지 프레임이라고 한다.

논리적페이지 0번이 물리적프레임 어디에 올라가 있는지, 논리적페이지별로 주소변환을 하기 위한 테이블이 페이지 테이블이다.

페이지테이블은 논리적메모리의 페이지 개수만큼 엔트리가 존재한다.
각각의 엔트리에는 페이지가 몇번 물리적메모리의 페이지프레임에 올라가있는지 나타내고 있다.

cpu가 논리적인 주소를 주게되면 물리적인 주소로 바꾸어야 한다.



주소변환을 위해 두번 접근한다?

페이지테이블이 어디에 들어가야 할까?

기본적인 MMU기법에서는 레지스터 2개로 주소변환을 했고, 레지스터는 cpu안에 들어 있었다.

페이지단위로 짜르게 되면 각 그 용량은 굉장히 크게 된다. 페이지테이블을 위한 용량이 엄청 크기 때문에 cpu안에는 들어갈 수 없다. 페이지테이블은 각 프로그램마다 있기 때문에 페이지테이블의 용량은 더 커진다. 그래서 페이지테이블을 메모리에 저장하게 된다.

메모리를 접근하기 위해서는 주소변환을 해서 접근을 해야하는데, 주소변환을 하려면 페이지테이블에 접근을 해야되고, 다시 페이지테이블이 메모리에 접근해야 하기 때문에 메모리를 한번 접근하려면 두번의 메모리 접근이 필요하다.

한번은 주소변환을 위해서 메모리에 접근하고, 두번째는 주소변환 후 실제로 데이터를 메모리에 접근하기 위해서 접근한다.


앞선 MMU기법에서는 두개의 레지스터가 있었는데, 페이징기법에서는 페이지테이블 **Basic register**와 페이지테이블 **Length register**라는 용도로 사용되게 된다.

메모리상에 페이지테이블이 어디에 있는지 시작위치를 PTBR이 가지고 있고, 페이지테이블의 길이를 PTBL이 가지고 있다.


매번 메모리 접근을 위해서 2번 메모리에 접근해야하는데 이는 상당히 비용이 큰것이다. 그러다보니까 속도 향상을 위해서 별도의 하드웨어가 있다. **TLB라는 캐쉬**를 이용한다. 메인메모리보다 빠르면 메인메모리와 cpu사이에 존재하는 주소변환을 해주는 계츰이다.


TLB 캐쉬

메모리에 접근하기 위해서 두번의 메모리 접근을 하기 때문에 이를 해결하기 위해서 TLB라는 별도의 하드웨어를 둔다.

메인메모리 위에 캐시메모리가 있다. 운영체제한테는 감추어져있는 계층이다. 메인메모리에서 빈번히 사용되는 데이터를 캐시메모리에 저장해서 cpu에서 빠르게 접근하게 하는 것이다.
메모리 주소변환을 위한 별도의 캐시를 두고 있는데 그게 TLB라는 계층이다.

데이터를 저장하는 캐쉬메모리와는 용도가 다르다.
주소변환을 위한 캐시메모리이다.

TLB는 페이지테이블에서 빈번히 참조되는 일부 엔트리를 캐싱하고 있다.

페이지테이블 접근전에 TLB를 먼저 접근해서 해당하는 것이 있는지 보고 있으면 바로 주소변환이 이루어진다. 이경우는 메모리를 한번만 접근한다.
없으면 일반적인 접근을 하므로 메모리에 두번 접근한다.

TLB는 페이지테이블의 데이터의 전체를 담는 것이아니라 일부를 담게 된다. 빈번히 참조되는 엔트리를 담는다.

TLB는 논리적인페이지번호 p와 p에 대한 주소변환 프레임번호f를 가지고 있어야 한다.
TLB는 전체를 검색해야 한다. TLB는 특정항목을 검색하는 것이 아니라 전체를 서치하기 때문에 시간이 오래걸린다. 그것을 막기 위해서 병렬적으로 탐색이 가능하게 한다.(Associative regiter를 이용해서 병렬적(parallel)으로 탐색이 가능하게 한다.)

TLB에 찾는 것이 없으면 캐시미스라고 한다. 그렇게 되면 페이지테이블을 통해서 주소변환을 한다.

페이지테이블을 이용한 주소변환은 전체를 탐색하지 않아도 된다. 배열의 인덱스를 이용해서 p에 해당하는 곳으로 이동해서 그에 해당하는 주소변환이 이루어지게 된다.

페이지테이블은 각각의 프로세스마다 존재하게 된다.
그러므로 TLB도 프로세스마다 다르게 된다.
그러므로 context switch될 때 flush해서 모든 엔트리를 비우게 된다.



2단계 페이지 테이블

페이지 테이블이 두단계로 존재하게 된다.
페이지테이블을 위한 공간이 줄어들게 된다. 그래서 사용한다.



다단계 페이지 테이블

프로그램의 주소공간이 넓기 때문에 점점더 여러단계의 페이지테이블을 사용하는게 가능하다.
이렇게 되면 테이블을 위한 주소공간을 줄일 수 있지만, 한 번 주소변환을 하려면 여러번의 페이지테이블을 거쳐야 하고, 페이지테이블이 물리적인 메모리 상에 있기 때문에 메모리를 한번 접근하기 위해서 주소변환을 위해서 여러번 접근해야한다.
만약 4단계 페이지테이블이라면 주소변환을 위해서 4번의 페이지테이블접근과 실제데이터접근 1번의 메모리 접근을 해서 총 5번의 메모리 접근이 이루어져야 한다.

TLB는 주소변환을 담당하는 캐시메모리이다.
대부분의 주소변환은 TLB를 이용해서 이루어지기 때문에 그렇게 오래 걸리지 않는다.
TLB를 통해서 주소변환을 한다고 가정을 하며, 다단계 페이지테이블이 큰 오버헤드가 발생하지는 않는다.



shared page

다른프로세스와 공유가능한 페이지

프로세스들이 같은 코드를 가지고 프로세스를 동작한다면, 프로그램의 코드는 똑같은 것을 사용해도된다. 하나만 물리적이 위치에 올려서, 다른 프로세스에서도 하나만 올라간 물리적 메모리에 접근한다. 공유할 수 있는 코드는 별도로 올리는 것이 아니라 같은 frame으로 올려서 공유할 수 있다.

여러 프로세스가 공유할 수 있는 코드를 같은 물리적 메모리에 매핑해주는 기법을 의미한다.
페이지들을 readonly로 설정을 해 주어야 한다.
shared code의 조건은 두가지

  • readonly로 설정
  • 동일한 논리주소공간에 위치해야 한다.

프로세스마다 별도로 가지는 데이터는 따로 맵핑되게 된다.

0개의 댓글