posted by 초식사자 2010.12.28 08:14
공간구역성
-프로세스가 특정메모리 위치에 접근을 하면 그 주변 메모리에 접근할 확률이 높음

시간구역성
-최근 액세스한 메모리는 다시 액세스 될 확률이 높음

문맥 교환이 일어날 때 프로세스 전체를 스와핑 하지 않고 액세스가 발생한 일정한 작은 영역에 한해서 스와핑한다.
이렇게 페이징을 사용하면 잦은 스와핑으로 인한 처리 지연 문제도 해결되고 한 영역의 크기를 일정하게 (일반적으로 4kb) 나누어 사용하면 외부 단편화가 발생하지 않는 대신 내부단편화가 발생할 수 있는데 마지막 한 페이지 등에 매우 한정적으로 발생하기때문에 크게 문제되지 않는다.

나누어진 실제 메모리 구획 : 프레임
나누어진 프로세스 구획 : 페이지

하지만 페이지가 메모리에 로드된 순서대로 프레임에 배치되면 코드가 뒤죽박죽이 되고 프로세스의 정상 실행이 불가능해진다.
그렇다고 1,3,4 페이지를 액세스하여 로드할 때 2페이지를 위한 프레임 공간 한칸을 비워두는 등의 방식으로 페이지를 메모리에 로드할때 페이지 번호와 프레임 번호를 순서대로 맞추어 채워나가게되면 외부단편화가 다시 발생하고 프로세스를 위한 공간을 모두 미리 확보하고 있어야하는 등의 문제가 다시 발생하기 때문에 페이징을 사용할 이유가 없어진다.
따라서 페이지 테이블을 이용한 가상메모리를 사용하여 논리주소와 실제 물리주소를 변환하여 사용한다.

페이지 테이블을 이용하여 실제 메모리에 접근 하기 위해서는 페이지가 몇 프레임에 위치하고 해당 프레임의 몇번째 오프셋에 데이터가 위치하는지(오프셋) 알아야한다.

페이지에서의 오프셋 값은 페이지 크기가 4kb이므로 12비트가 필요하다.(212)
그리고 32비트에서 오프셋을 나타내기 위한 12비트를 제외한 20비트를 가지고 페이지 번호를 나타내는데 페이지의 크기가 총 4kb이므로 4096 x 220 = 4GB 의 메모리 주소 접근이 가능하다.

페이지 테이블
인덱스 프레임 번호
0 100
1 543
2 254
3 722

페이지 번호 오프셋
2 4
위의 경우에는 254프레임의 4번째 byte 의 주소를 가리키게 된다.

페이징을 사용하게 되면 각 프로세스마다 페이지 테이블을 가지게 되는데 그렇게되면 상당한 메모리용량이 필요하게 된다.
따라서 페이지 테이블을 위한 페이지 테이블을 생성하여(외부 페이지 테이블) 액세스된 페이지 테이블 구획만 외부 페이지 테이블에 로드하여 유지하는 방식을 이용한다.
이 방식에서는 기존의 페이지 번호 영역(20bit)을 외부 페이지 테이블 인덱스(10bit)와 외부 페이지 테이블 오프셋(10bit)으로 나누어서 사용한다.
우선 외부 페이지 테이블 인덱스를 이용하여 해당 프로세스의 페이지 테이블 구획으로 이동하고 외부 페이지 테이블 오프셋을 이용해 해당 구획의 오프셋으로 이동한다.
그 다음 페이지 테이블의 페이지에 해당하는 프레임으로 이동하고 오프셋 값과 합쳐져 실제 물리 주소에 접근하게된다.
페이지 번호 오프셋
외부 페이지
테이블 인덱스
외부 페이지
테이블 오프셋
오프셋


가상 메모리 방식을 사용해 페이지 테이블을 이용하는경우 메모리 액세스가 2배 가까이 늘어나기때문에 TLBs(Translation Look-aside Buffers)라고 부르는 캐시 메모리를 이용한다.
TLBs는 논리 주소의 페이지 번호,물리주소의 프레임 번호로 이루어져 있는데 메모리를 액세스할 때 TLBs의 첫번째항(페이지번호)을 동시에 검사하고 일치하면 바로 물리주소값을 구하여 액세스를 하고 존재하지 않는 경우에는 페이지 테이블에서 찾아서 물리주소를 액세스하고 TLBs에 해당 페이지를 기록한다.

'컴퓨터 일반 > 기초' 카테고리의 다른 글

apt-get을 이용한 APM 설치  (0) 2012.07.18
세그먼테이션 (Segmentation)  (0) 2010.12.28
페이징 (Paging)  (0) 2010.12.28
Tomcat & JDK 설치 후 설정  (0) 2010.11.27
IA-32 프로세스 구조  (0) 2010.11.27
메모리 (Memory)  (0) 2010.11.27

댓글을 달아 주세요