-
[OS] 메모리 불연속할당 - (1) 페이징 기법OS 2021. 11. 30. 15:38
[OS] 메모리 불연속할당 - (1) 페이징 기법
안녕하세요? 장장스입니다.
실제 물리적 메모리는 크게 연속할당 방식과 불연속할당 방식으로 나뉩니다.
오늘은 메모리 불연속할당 방식중 하나인 페이징 기법에 대해 정리해보겠습니다.
메모리 불연속할당 기법
불연속할당 기법은 하나의 프로세스가 물리적 메모리의 여러 위치에 분산되어 올라갈 수 있는 메모리 할당 기법을 말합니다.
페이징 기법
페이징 기법은 프로세스의 주소 공간을 동일한 크기의 페이지 단위로 나누어 물리적 메모리의 서로 다른 위치에 페이지들을 저장하는 방식을 말한다. 페이징 기법에서는 각 프로세스의 주소 공간 일부는 백킹스토어에, 일부는 물리적 메모리에 혼재시키는 것이 가능하다.
페이징 기법에서는 물리적 메모리를 페이지와 동일한 크기의 프레임으로 미리 나누어 둔다.
메모리에 올리는 단위가 동일한 크기의 페이지 단위이므로, 메모리를 같은 크기로 미리 분할해 두더라도 빈 프레임이 있으면 어떤 위치이든 사용될 수 있기 때문이다.
따라서 페이징 기법은 동적 메모리 할당 문제(메모리 주소 공간 결정 문제)가 발생하지 않는다는 강점을 가진다. 빈 페이지가 보이면 메모리를 올리기만 하면 된다.
페이징 기법에서는 프로세스의 주소 공간과 물리적 메모리가 모두 같은 크기의 페이지 단위로 나누어지기 때문에 빈 공간은 어느 곳이든 활용 할 수 있다. 따라서 메모리상의 가용 공간의 크기가 작아서 빈 공간임에도 활용되지 못하는 외부조각 문제가 발생하지 않는다. 그러나 프로그램의 크기가 항상 페이지 크기의 배수가 된다는 보장이 없기 때문에 프로세스의 주소 공간 중 제일 마지막에 위치한 페이지에서는 내부조각이 발생할 가능성이 있다.
주소 변환 기법
페이징 기법에서는 주소 변환 절차가 연속할당 방식에 비해 다소 복잡하다. 이는 하나의 프로세스라 하더라도 페이지 단위로 물리적 메모리에 올리는 위치가 상이 하므로, 논리적 주소를 물리적 주소로 변환하는 작업이 페이지 단위로 이루어져야 하기 때문이다. 즉, 특정 프로세스의 몇 번째 페이지가 물리적 메모리의 몇 번째 프레임에 들어 있다는 페이지별 주소 변환 정보를 유지하고 있어야 한다. 따라서 페이징 기법에서는 모든 프로세스가 각각의 주소 변환을 위한 페이지 테이블(page table)을 가지며, 이 테이블은 프로세스가 가질 수 있는 페이지의 개수만큼 주소 변환 엔트리를 가지고 있게 된다.
페이징 기법에서는 CPU가 사용하는 논리적 주소를 페이지 번호(p)와 페이지 오프셋(d)로 나누어 주소변환을 사용한다.
1. 페이지 테이블에서 페이지 번호(p)를 확인하여 물리적 메모리 상의 기준 주소(base address)를 확인한다.
2. 물리적 주소에서 오프셋(d)만큼 떨어진 곳이 실제 물리적 메모리 주소이다.
페이지 테이블
페이지 테이블에 접근하기 위해 운영체제는 2개의 레지스터를 사용한다. 이들은 각각
- 페이지 테이블 기준 레지스터(page table base register) : 페이지 테이블의 시작 위치
- 페이지 테이블 길이 레지스터(page table length register) : 페이지 테이블의 크기
기능을 갖고 있다.
그렇다면 페이지 테이블은 어디에 있을까❓
페이지 테이블은 메모리에 존재한다. 즉, 실제 물리적 메모리의 주소를 알기 위해서
1. 페이지 테이블 정보를 확인하기 위해 메모리 접근
2. 물리적 메모리를 얻기 위해 메모리 접근
총 2번의 메모리 접근을 하게되는 오버헤드가 발생한다. 이와 같은 문제를 해결하기 위해 TLB(Translation Look-aside Buffer)라고 불리는 고속의 주소 변환용 하드웨어 캐시를 사용한다.
TLB 하드웨어는 가격이 비싸서 용량이 적다. 따라서 TLB에서 모든 페이지 테이블 정보를 확인 할 수는 없다. 또 원하는 페이지를 찾기 위해 모든 페이지를 뒤져야하게 되는데 페이지 테이블 개수가 n개 라면 O(n)의 시간 복잡도가 걸리게 된다. 이를 극복하기 위해 병렬탐색이 가능한 연관 레지스터를 사용하여 모든 페이지 테이블 정보를 한꺼번에 찾는다.
TLB를 확인해도 원하는 페이지 정보를 확인 할 수 없다면 페이지 테이블을 방문하여 물리적 메모리 주소를 확인한다.
계층적 페이징
현대의 컴퓨터는 32bit 혹은 64bit 주소 체계를 사용한다. 32bit 컴퓨터에서는 2^32byte(4GB)의 주소 공간을 갖는 프로그램을 지원할 수 있다. 이러한 컴퓨팅 환경에서 페이지 크기가 4KB라면 4GB/4KB = 1M(2^20)개의 페이지 테이블이 필요하게 된다. 각 페이지 테이블 항목이 4byte씩 필요로 한다면 한 프로세스당 필요한 페이지 수는 4MB의 공간을 필요로 하게 된다.
32bit 운영체제는 2^32byte의 주소공간 즉, 4GB의 주소공간을 갖는 프로그램을 지원한다.
프로세스 주소공간 4GB
페이지 크기 4KB
페이지 테이블 항목당 필요한 용량 4byte
4GB/4KBx4byte = 4MB사용하는 프로세스가 증가할수록 페이지 테이블을 위한 많은 메모리 공간이 사용된다. 이러한 메모리 낭비를 줄이기 위해 2단계 페이징 기법을 사용한다. 2단계 페이징 기법은 외부 페이지 테이블과 내부 페이지 테이블을 사용한다. 사용되지 않는 주소 공간에 대해서는 외부 페이지 테이블의 항목을 NULL로 설정하여 대응되는 내부 페이지 테이블을 생성하지 않는 방법이다.
계층적 페이징 기법은 메모리 공간을 줄여 공간적인 이득을 볼 수 있지만 주소 변환을 위해 페이지 단계수가 3단계, 4단계로 증가할 수록 메모리에 접근하는 횟수도 증가하여 오버헤드가 증가하는 손해가 뒤따르게 된다.
그러므로 TLB와 계층적 페이징 기법을 적절히 사용하여 메모리 공간 효율과 시간 효율을 높여야 한다.
역페이지 테이블
역페이지 테이블 기법은 물리적 메모리의 페이지 프레임 하나당 페이지 테이블에 하나씩 항목을 두는 방식이다. 다시 말하면 논리적 주소에 대해 페이지 테이블을 만드는 것이 아니라, 물리적 주소에 대해 페이지 테이블을 만드는 것이다.
역페이지 테이블❓
논리적 주소에 대한 페이지 테이블 ❌
물리적 주소에 대한 페이지 테이블 ✔️즉, 프로세스마다 페이지 테이블을 두지 않고, 시스템 전체에 페이지 테이블을 하나만 두는 방법이다.
페이지 테이블의 각 항목은 프로세스 번호(pid)와 프로세스 내의 논리적 페이지 번호(P)를 담고 있게 된다.
역페이지 테이블을 사용하기 위해 모든 페이지를 탐색해야 하므로 시간적으로 손해를 보게 된다. 이를 해결하기위해 역페이지 테이블은 병렬 탐색을 가능하게 하는 연관 레지스터를 사용하여 시간적 효율성을 높이게 된다.
공유 페이지
공유 페이지란 공유 코드를 담고 있는 페이지를 말한다. 공유 페이지는 여러 프로세스에 의해 공유되는 페이지이므로 물리적 메모리에 하나만 적재되어 메모리를 좀 더 효율적으로 사용할 수 있게 한다.
메모리 보호
페이지 테이블에는 주소 변환을 위한 정보 뿐만 아니라 메모리 보호를 위한 보호비트(protection bit)와 유효 무효 비트(valid-invalid bit)를 두고 있다.
보호비트(protection bit)는 각 페이지에 대한 접근 권한의 내용을 담고 있다. 각 페이지에 대한 접근을 허용하는지의 정보가 보호비트에 저장된다. 다시 말해 각 페이지에 대한 읽기/쓰기 등의 접근 권한을 설정하는 데에 사용된다.
유효 무효 비트(valid-invalid bit)는 해당 페이지의 내용이 유효한지에 대한 내용을 담고 있다. '유효'로 설정되어 있으면 메모리에 해당 페이지가 존재함을 뜻하며, '무효'일 경우 프로세스가 주소 부분을 사용하지 않거나, 해당 페이지가 백킹스토어에 존재하여 접근 권한이 없다는 의미로 사용된다.
Post
References
- KOCW 운영체제 강의 - 반효경 교수
잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)
'OS' 카테고리의 다른 글
[OS] 메모리 불연속할당 - (3) 페이지드 세그먼테이션 (0) 2021.12.02 [OS] 메모리 불연속할당 - (2) 세그먼테이션 (0) 2021.12.01 [OS] 메모리 연속할당 - 고정분할 방식과 가변분할 방식 (0) 2021.11.28 [OS] 메모리 스왑(스와핑) #swap (0) 2021.11.26 [OS] 주소 바인딩 (0) 2021.11.24