운영체제

메모리 할당(2)

xodnek 2021. 8. 13. 20:01

페이징이 무엇인가요??

프로세스의 물리적 주소 공간을 비연속적으로 하는 것입니다.

연속 메모리 할당의 외부 단편화문제와 외부 단편화를 해결하기 위한 압축의 큰 오버헤드를 해결할 수 있습니다.

물리적인 메모리를 고정된 사이즈(프레임)으로 쪼개서 사용합니다. 논리적 메모리에서도 같은 크기로(페이지)로 쪼개서 사용합니다.

페이지 번호와 프레임 번호를 매핑시켜 사용할 수 있습니다.

 

어떻게 매핑이 되나요??

CPU는 페이지 번호와 페이지 오프셋을 이용하여 물리적 메모리에 접근할 수 있습니다.

페이지 번호는 프로세스 마다의 페이지 테이블의 인덱스를 사용합니다.

페이지 테이블을 이용하여 어떤 프레임에 있는지 찾아내어 오프셋을 더하여 물리적 메모리에 접근이 가능합니다.

 

페이지 테이블은 무엇으로 만든다고 생각하세요??

CPU 레지스터 구현한다면 너무 비싸다고 생각합니다.

그렇다고 메모리 내에 둔다면 너무 느리다고 생각합니다. 메모리에 접근을 두번 해야하는 단점이 발생합니다.

따라서, TLB(Translation look a side buffer)로 별도의 Chip으로 만듭니다.

하지만 현재는 반도체 기술이 좋아져서 CPU 내에 내장되어 있다고 생각합니다.

 

혹시 페이지 크기나 프레임 크기는 어떻게 정해야 한다고 생각하나요??

페이지의 크기는 내부 단편화, Page in/ Page out, 입출력 오버헤드, 페이지 테이블의 크기, 페이지 부재 발생 확률에 맞게 적당하게 설정해야 한다고 생각합니다.

 

페이지 크기가 작으면 좋을까요??

페이지 크기가 작으면 내부 단편화가 작아질 것이며, 메모리 해상도도 좋아질 것 같습니다.

페이지가 크다면 불필요한 영역까지 함께 적재될 수 밖에 없기에, 반대로 적을 수록 필요한 부분만 메모리에 적재되는 정밀도가 증가하기 때문입니다.

 

페이지가 크면 무엇이 좋을까요??

입출력 시간은 대부분 디스크의 헤드의 이동시간입니다. 페이지가 클 수록 한 번 이동에서 많은 데이터를 읽어 올 수 있어 좋습니다.

페이지의 크기가 클수록 페이지 테이블의 개수는 줄어들게 됩니다.

페이지 내에 많은 내용을 담고 있기 때문에 재 사용 가능성이 높아서 페이지 부재가 덜 발생합니다.

 

CPU에서 문맥 교환이 일어날 때 페이지 테이블은 어떻게 되나요??

프로세스 마다 페이지 테이블을 가지고 있기 때문에 테이지 테이블도 재로딩이 됩니다.

페이지 테이블을 프로세스 정보와 함께 운영체제가 유지하므로 프로세스가 가지게 된 정보가 많아진 것입니다.

이것이 즉, 문맥교환 비용의 증가로 이어지게 됩니다.

 

문맥교환을 그럼 가볍게 할순 없을까요??

문맥 교환 비용 증가를 감소하는 방법은 페이지 테이블 기준 레지스터(PTBR)를 사용하는 것입니다.

운영체제는 페이지 테이블을 메인 메모리에 전부 올려 놓고, 현재 작업에 연관된 페이지 테이블을 가르키도록 PTBR레지스터의 값을 지정하는 것입니다.

문맥교환이 발생하면 레지스터의 값만 바꾸어 해결할 수 있습니다.

이 방식은 논리적 주소를 통해 데잉터를 읽으려 할 떄 2번의 액세스가 발생하므로 비 효율성을 가지고 있습니다. CPU는 1클럭 연산인데 반해서 RAM은 매우 느리다는 것을 생각하게 되면 2번의 RAM 액세스가 치명적인 것을 알 수 있습니다.

메인 메모리에 저장된 테이블 페이지에 액세스하기 위해 한번.. 변환된 물리적 주소로 메인 메모리에서 값을 가져오기 위해 한번...

 

그럼 페이지 테이블에 무조건 2번 접근해야하나요??

아닙니다. PTBR는 혼자서 매우 느려서 현재는 TLB라는 빠르고, 비싸고 작은 딕셔너리 캐시를 동시에 사용합니다.

주어진 페이지 번호에 연관된 프레임의 번호를 얻어와야 할 때, 먼저 캐시를 들여다보고 없는 경우에만 PTBR을 통해 가져옵니다.

지역성의 원리에 의해 프로세스는 모든 페이지를 골고루 액세스 하지 않아서, 자주 사용되는 페이지를 캐싱해두면 성능향상이 됩니다.

 

단, 문맥교환이 발생하면 페이지 번호에 연관된 프레임 번호가 바뀌게 되므로, 잘못된 프레임 번호를 반환하지 않도록 캐시를 초기화해야합니다.

 

공유페이지가 무엇인가요??

여러 프로세스가 동일한 라이브러리를 사용한다면, 해당 라이브러리에 연관된 페이지를 다수의 프로세스에게 공유시켜 메모리를 절약시킬 수 있습니다.

지역성의 원리가 무엇인가요??

CPU가 참조하는 주소가 지역에 모여져 있다는 의미입니다. 동일한 값 또는 해당 값에 관계된 스토리지 위치가 자주 엑세스되는 특성입니다.

즉, 한번 읽었던 코드는 다시 읽을 확률이 높다는 것입니다. 저희가 자주 쓰는 반복문이 그렇다고 생각합니다.

 

페이징 기법을 쓰면 올바른 접근인지 확인을 어떻게 하나요?

연속할당기법은 연속적으로 활동되어 있기 때문에 base, limit 레지스터리르 활용하지만, 페이징 기법은 비연속할당이라서 보호비트라는 것을 활용합니다.

유효/무효 비트와 읽기/쓰기 비트를 활용합니다.

유효-무효 비트를 통해 해당 페이지가 그 프로세스에게 소유되었는지 확인하고 읽기-쓰기 비트를 통해 읽기 전용 페이지에 쓰기를 시도하려는 건지 검사합니다. 이 2가지 검사에 통과하지 못하면 Trap을 발생시킵니다.

 

페이지 테이블의 구조가 무엇인지 아시나요??

큰 논리적 주소 공간을 가지고 있다면 페이지 테이블 또한 크게 가지고 있을 것입니다. 그래서 페이지 테이블의 구조를 기술적으로 해야합니다.

그래서 계층적 페이지 테이블, 해쉬된 페이지 테이블, 역 페이지 테이블이 존재합니다.

 

계층적 페이지 테이블이 무엇인가요??

계층적 페이지 테이블은 N차원 배열이 존재하듯이 페이지의 하위 요소가 페이지인 경우도 있을 수 있습니다. 이렇게 하나의 테이블의 엔트리가 하위 페이중 하나를 가르키는 방식입니다.

페이지의 단계가 깊어질수록 페이지의 크기는 점점 작아지기 때문에 내부 단편화를 최소화할 수 있습니다.

페이지 레벨이 높아질 때마다 물리적 변환 비용이 더 빠르게 증가하므로 64비트 환경처럼 무수히 많은 계층으로 나눠야 하는 상황에서는 부적절하니 32비트 시스템에서 유용하게 쓰입니다.

 

해쉬된 페이지 테이블은 무엇인가요??

해시는 넓은 도메인에서 값을 찾는데 특화되어 있습니다. 이것을 페이지 테이블에 적용하면 64비트 환경에서도 빠르게 물리적 주소를 찾을 수 있습니다. 이것을 해쉬된 페이지라고합니다.

해쉬된 페이지는 해싱된 논리적 주소와 일치하는 물리적 주소를 얻게되며, 구체적으로 해싱값에 연관된 연결리스트로 이동하여 논리적 주소와 일치하는 노드를 순차적으로 탐색하여 일치한 노드의 값을 가져와 물리적 주소로 사용합니다.

 

역페이지 테이블은 무엇인가요??

역페이지 테이블은 프로세스가 자신의 정보로써 소유하지만, 새 페이지를 할당받아야하는 것처럼 프레임의 사용정보를 추적해야 하는 경우 비용이 비싸집니다. 자신이 가지고 있던 페이지 테이블에는 가용할 수 있는 프레임 정보가 포함되어 있지 않으므로, 운영체제에게 부탁해야 하기 때문입니다.

 

운영체제는 이 문제를 프로세스는 페이지 테이블을 가지지 않고, 운영체제는 프레임 테이블을 관리하는 것으로 해결합니다. 이러한 설계를 역 페이지 테이블이라고 합니다.

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

가상 메모리  (0) 2021.08.14
메모리 할당(3)  (0) 2021.08.14
메모리 할당(1)  (0) 2021.08.13
주메모리의 관리  (0) 2021.08.13
데드락  (0) 2021.08.11