실행하고자 하는 프로그램의 일부만 메모리에 적재하여
실제 물리메모리보다 더 큰 프로세스를 실행할 수 있게 하는 기술
가상메모리를 관리하는 기법으로
페이징(고정 분할 방식)
과세그멘테이션(동적 분할 방식)
이 있다.
프로세스의 논리 주소 공간을
페이지
라는 일정한 단위로 나누고
메모리 물리 주소 공간 또한프레임
이라는 같은 일정한 단위로 나눠서
페이지를 프레임이 할당하는 가상메모리 기법이다.
페이징 기법을 사용하면
외부단편화
가 발생하지 않는다.
메모리에 적재될 필요가 없는 페이지들은
보조 기억장치
로 쫓겨나고
보조 기억장치
에서 실행에 필요한 페이지들을 메모리에 적재된다.이를
페이지 아웃
,페이지 인
이라고 한다.
즉, 한 프로세스 실행을 위해
프로세스 전체가 메모리에 적재될 필요가 없다
는 말이다.
실행에 필요한 일부 페이지만 적재
하고, 당장 실행에 필요하지 않은 페이지들은
보조 기억장치
에 남겨둔다.이 방식으로 인해서 물리메모리보다 큰 프로세스를 실행할 수 있는 것이다.
프로세스의 부분들이 메모리에
불연속적
으로 있기때문에
CPU 는 다음에 실행할 명령어를 찾기 어렵다.따라서 CPU 는 프로세스가 물리주소에 불연속적으로 배치되더라도
논리 주소에는 연속적으로 배치되도록페이지 테이블
을 이용한다.
즉 프로세스마다 페이지 테이블이 존재한다.
각 프로세스는
테이지 테이블
을 가지고 있다.
CPU의페이지 테이블 베이스 레지스터(PTBR)
는 각 프로세스의 페이지 테이블이 적재된 주소를 가리킨다.이러한 각 프로세스들의 페이지 테이블 정보들은 각 프로세스의 PCB에 기록된다.
그리고 프로세스의context switching
이 일어날 때 함께 변경된다.
페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 크기 단위로 자른다.
이때 프로세스의 크기가 페이지 크기의 배수는 아니다.즉 프레임에서 남는 공간이 존재하게 된다는 뜻이다.
이런 남는 공간 때문에 메모리 효율성이 떨어지게 되는데
이를 내부 단편화라고한다.
따라서 적절한 페이지 크기를 설정하는 것이 중요하다.
메모리에 있는 페이지 테이블을 보기 위해 한번,
페이지 테이블을 통해 알게된 프레임에 접근하기 위해 한번총
두 번의 메모리 접근
이 필요하다.
TLB
그래서 CPU의 MMU 내부에 TLB라는 페이지 테이블의 캐시 메모리를 뒀다.
이를 TLB 라고한다.
참조 지역성
에 근거해 주로 최근에 사용된 페이지 위주로 가져와 저장한다.CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우
이를TLB 히트
라고하고 없을 경우TLB 미스
라고한다.이 경우 적재된 프레임을 알기 위해 메모리 내부의 페이지 테이블에 접근해야만 한다.
시간 지역성(Temporal Locality)
만약 특정 데이터나 자원을 한 번 참조했다면, 가까운 장래에 그것을 다시 참조할 확률이 높다.
즉,시간적으로 가까운 참조 사이에서 참조 지역성이 발생
합니다.
CPU 캐시나 페이지 교체 알고리즘(LRU 등)에서 자주 활용됩니다.
공간 지역성(Spatial Locality)
만약 특정 데이터나 자원을 참조했다면, 그것의 인접한 데이터나 자원을 참조할 가능성이 높다.
즉, 메모리의 경우 물리적 또는 가상 주소 공간에서인접한 위치의 데이터를 참조하는 경향
을 의미합니다.
이는 메모리 캐시 설계, 페이징, 프리페치 등에서 활용됩니다.
특정 주소에 접근하려면 두 가지 정보가 필요하다.
- 어떤 페이지 혹은 프레임에 접근하고 싶은지
- 접근한 프레임의 offset(시작위치) 부터 얼마만큼 떨어져 있는지
따라서 페이징 시스템에서는 모든 논리 주소가 기본적으로 페이지 번호와 변위로 이뤄져있다.
즉, 논리 주소<페이지 번호, 변위>
는<프레임 번호, 변위>
로 변환된다.
예를 들어 논리주소<페이지 번호, 변위>
가<5,2>
라면<1,2>
로 변환되고
실제로 접근하는 메모리 주소는 1번 프레임의 offset에서 2만큼 떨어진 주소 이므로
10번지
가 뒨다.
페이지 테이블의 각 행을 말한다.
위에서 설명할때 페이지 테이블 엔트리에 포함되는 정보로
페이지 번호
프레임 번호
만 설명했지만
유효 비트
,보호 비트
,참조 비트
,수정 비트
등이 추가적으로 더 있다.
현재 비트가
메모리에 적재되어있는지 아니면 보조기억장치에 있는지
알려주는 비트
메모리에 적재되어 있다면 1, 보조기억장치에 있다면 0 이다.만약 유효 비트가 0인 페이지(보조기억장치에 있는 페이지)에 접근하려하면
페이지 폴트
가 발생한다.
페이지 폴트
처리 과정
- CPU는 기존 작업 내역을 백업한다.
- 페이지 폴트 처리 루틴을 실행한다.
- 페이지 처리 루틴은 원하는 페이지를 메모리로 가져오고 유효 비트를 1로 변경한다.
- 페이지 폴트를 처리하면 CPU는 해당페이지에 접근할 수 있다.
해당 페이지가
읽고, 쓰기가 모두 가능한 페이지인지
읽기만 가능한 페이지 인지` 알려주는 비트이다.
1인 경우 읽기 쓰기가 모두 가능하고, 0인 경우 읽기만 가능한 페이지이다.프로세스가 할당 받은 메모리 영역
Code
,Data
Stack
,Heap
중
Code
영역은 읽기 전용 영역이다.따라서 CPU가 이런 읽기 전용 페이지에 쓰기를 시도하면 운영체제가 이를 막는다.
보호비트는 3개의 비트로 더 복잡하게 구현할 수도 있다.
왼쪽 비트 부터 읽기(r), 쓰기(w), 실행(x) 의 조합이다.만약 3비트 보호비트 구조에서 101 이라면 읽기,실행만 가능한 페이지가 되는 것이다.
적재 이후 CPU가 해당 페이지에 읽거나 쓴 적있는 페이지
라면 참조 비트가 1로 세팅되고
적재 이후 한번도 읽거나 쓴적이 없는 페이지
는 참조 비트가 0으로 유지된다.
해당 페이지에 데이터를 쓴 적이 있는지 없는지
수정 여부에 대한 비트이다.수정 비트가 존재하는 이유는
페이지 아웃될때 보조기억장치가 추가 작업할 필요성이 있는지 알려주기 위함
이다.만약 수정이 되지 않았다면 보조기억장치에서 수정하는 등의 작업을 하지 않고
덮어쓰기만 하면 되기 때문이다.
멀티프로세스에서 프로세스를 fork 하면 동일한 프로세스가 생기고
코드 및 데이터 영역을 비롯한 모든 자원이 복제되어 메모리에 적재된다.즉 부모 프로세스와 복제된 자식 프로세스가 각각 별도의 메모리 영역을 가지게 되고
각각 다른 페이지 테이블을 가지게 된다.
이는 프로세스 생성시간을 늦추고 불필요한 메모리 낭비를 야기한다.
페이징 시스템을 사용하면 복사 시
자식 프로세스는 부모 프로세스와 동일한 프레임을 가리키게된다.
즉, 동일한 코드 및 데이터 영역을 가리킬 수 있다.
만약 읽기 작업만 수행한다면 이 상태가 지속된다.
단 쓰기 작업이 발생할 경우 이때 페이지가 별도의 공간으로 복제된다.
프로세스를 일정한 단위 크기의 페이지로 나눴기 때문에
메모리 또한 같은 크기의 프레임으로 나눴기 때문에
외부 단편화를 해소할 수 있다.
페이지 테이블의 크기는 생각보다 작지않다.
모든페이지 테이블 엔트리
를 항상 메모리에 유지하지 않기 위해 나온 방법이다.
계층적 페이징
이란 페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식이다.
다단계 페이지 테이블(Mutilevel page table)
기법이라고도 한다.페이지 테이블을 페이징하면
모든 페이지 테이블을 항상 메모리에 유지할 필요가 없어진다.
일부는 메모리에 있고 일부는 보조기억장치에 있게된다.
필요 시에만 메모리에 적재해서 사용하면 된다.
다단계 페이지 테이블 사용하면 C
PU의 논리 주소 구조가 변경
된다.
바깥 페이지 번호
는 CPU와 근접한 페이지 테이블의 엔트리를 가리키고
안쪽 페이지 번호
는페이지 테이블의 페이지 번호
를 가리킨다.
위 예시는 2단계 페이징 이나 그 이상의 단계로도 구성이 가능하다.
단계를 늘릴 수록 메모리에서 페이지 테이블이 차지하는 공간을 줄일 수 있다하지만 페이지 폴트가 발생한 경우
메모리 참조 횟수는 단계가 많아지므로 반드시 좋다고 할 수는 없다.