가상메모리(Virtual Memory)
주기억장치의 부족한 물리적 저장공간을 보조기억장치를 이용해서 가상으로 늘려 주는 기술이다.
- 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법이다.
- 실행에 필요한 부분만 메모리에 올려 실행한다.
- CPU는 TLB, MMU 를 사용하여 가상 메모리 주소에 접근한다.
- Paging 또는 Segmentation 을 사용한다.
장점
- 실제 메모리보다 큰 프로그램을 실행할 수 있다.
- 한정된 메모리 내에서 더 많은 프로그램을 동시에 실행할 수 있다.
단점
- 가상 메모리로 실행하는 것은 물리 메모리로 실행하는 것보다 느리다.
Paging(페이징)
물리 메모리를 일정한 크기인 Frame으로 나누고, 논리 메모리를 Frame과 동일한 크기의 Page로 나눈다.
이후 필요한 Page를 Frame에 적재하고 실행한다.
- 각 Page는 연속적이지 않은 공간에 존재할 수 있다.
- 각 프로세스는 각자의 Page Table 을 가진다.
장점
- 가상메모리 사용의 장점을 가진다.
- 외부단편화가 발생하지 않는다.
- Frame의 크기와 Page의 크기가 동일하기 때문이다.
단점
- 내부단편화가 발생한다.
- 마지막 Frame에서 physical memory가 frame 크기로 나누어 떨어지지 않을 경우
Page Size를 작게 구성한다면?
- Process당 Page 수가 증가한다 -> Page 수가 증가한다 → Page Table의 크기가 커진다
→ 더 많은 메모리를 차지하게 된다.
Page Size를 크게 구성한다면?
- 내부 단편화의 발생 확률이 증가한다
- 사용하지 않는 부분도 Memory에 같이 올라가게 된다 → page fault가 증가한다.
따라서, 적절한 Page Size를 정하는 것이 중요하고, 운영체제에 따라 방식이 모두 다르다.
요구페이징(Demand Paging) 기법
실행 중 필요한 시점에 필요한 데이터만 물리 메모리에 적재하는 방법
←→ 선행 페이징 : 프로세스 관련 모든 데이터를 물리 메모리에 미리 적재 후 실행하는 방법
- 페이지 교체 알고리즘이 필요하다.
- 한정된 메모리 활용에 효율적이다.
- Locality of Reference로 인해 Page Fault 확률이 줄어든다.
💡Locality of Reference 참조 지역성
동일한 값 또는 해당 값에 관계된 스토리지 위치가 자주 액세스 되는 특성을 말한다.
참조지역성의 3가지 기본형 : 시간, 공간, 순차 지역성
1) 공간(spatial) 지역성 : 특성 클러스터들의 기억 장소들에 대해 참조가 집중적으로 이루어지는 경향 으로, 참조된 메모리의 근처의 메모리를 참조.
2) 시간(temporal) 지역성 : 최근 사용되었던 기억 장소들이 집중적으로 액세스 되는 경향으로, 참조했던 메모리는 빠른 시간에 다시 참조될 확률이 높다.
3) 순차(sequential) 지역성 : 데이터가 순차적으로 액세스 되는 경향. 프로그램 내의 명령어가 순차적으로 구성되어있다는 것이 대표적인 경우.
Page Table
Page의 실제 메모리 주소를 찾기 위한 정보가 담겨 있다.
- 2번의 메모리 접근이 필요하다.
- 페이지 테이블에 대한 접근 + physical 메모리에 대한 접근
- Page Table의 크기가 매우 크다면 Page Table을 위한 또 다른 Page Table을 만들어 사용하기도 한다.
- Two-Level Hierarchical Page Table
Virtual Address & Page Table Entry
Virtual Address
- Page Number : 페이지 번호
- Offset : Page 내에서 몇번째 줄에 해당하는 지를 나타낸다.
Page Table Entry
- P(Present bit) : 해당 페이지가 메인 메모리에 존재하는 지를 나타내는 비트다.
- V(Valid bit)라고도 부른다.
- 1bit의 크기로, 0 또는 1의 값을 가진다.
- 1이면 메인 메모리에 존재, 0이면 메인 메모리에 존재하지 않음을 나타낸다.
- M(Modify bit) : 메인 메모리에 할당된 후 코드가 수정되었는지 여부를 나타낸다.
- D(Dirty bit)라고도 부른다.
- 1bit의 크기로, 0 또는 1의 값을 가진다.
- 1이면 수정이 되었다는 뜻, 0이면 수정되지 않았다는 뜻이다.
- Frame Number : 해당하는 Frame 번호를 나타낸다.
- PFN(Page Frame Number)라고도 부른다.
Paging 작동 방식
- Virtual Address와 Page Table Ptr 값을 더해 Page Table에 접근한다.
- PTBR(Page Table Base Register)에는 Page Table의 주소가 담겨 있다.
- Present bit를 확인한다.
- Present bit 가 1이면(물리 메모리에 필요한 데이터가 적재되어 있음)
- 계속해서 진행한다.
- Present bit가 0이면(물리 메모리에 필요한 데이터가 적재되어 있지 않음)
- Page Fault 발생, 해결 후 진행한다.
- Present bit 가 1이면(물리 메모리에 필요한 데이터가 적재되어 있음)
- 해당하는 Frame Number를 찾고 가상 주소를 실제 주소로 변환한다.
- Page의 크기와 Frame의 크기가 동일하기 때문에 Offset을 그대로 이용할 수 있다.
- Main Memory의 Frame에 접근하여 작업을 진행한다.
Page Fault
필요한 페이지가 물리 메모리에 없을 때 발생하는 인터럽트를 말한다.
- CPU는 물리 메모리을 확인하여 페이지가 없으면 trap을 발생하여 운영체제에 알린다.
- 운영체제는 CPU의 동작을 잠시 멈춘다.
- 운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인하고, 없으면 프로세스를 중단한다.
- Page Fault면, 현재 물리 메모리에 비어있는 프레임(Free Frame)이 있는지 찾는다.
- Page Fault가 발생하면 OS가 해당 페이지를 저장공간에서 가져온다.
- 비어있는 프레임에 해당 페이지를 로드하고, 페이지 테이블을 최신화 한다.
- 비어있는 프레임이 없다면 희생 프레임을 골라야 하는데, 이 과정에서 페이지 교체 알고리즘이 사용된다.
- 중단되었던 CPU를 다시 시작한다.
++ Paging 기법에서는 Page Table이 차지하는 공간의 낭비가 발생할 수 있다.
따라서, 이를 해결하기 위해 Inverted Page Table을 사용하기도 한다.
Inverted Page Table(역 페이지 테이블)
기존 Page Table은 프로그램마다 하나씩 존재하기 때문에 Page Table을 위한 추가적인 메모리 용량이 필요하다.
프로그램이 늘어나면 Page Table이 많아지고, 추가적인 메모리 낭비가 심해진다.
Inverted Page Table에서는 페이지 테이블을 하나만 사용한다.
가상 메모리의 페이지에 대한 페이지 테이블이 아닌, 물리 메모리의 프레임에 해당하는 페이지 테이블을 작성한다.
즉, Page가 아닌 Frame을 기준으로 테이블을 작성한다.
- 메인 메모리(Frame)에 존재하는 Page의 정보만 Inverted Page Table에 올라간다.
- 페이지 테이블의 크기가 매우 작아진다.
- hash function을 이용해 Mapping하여 페이지를 저장하고, 찾는다.
- 동일한 값이 있다면 Chain Pointer를 사용해 연결 리스트의 형태로 저장한다.
- Page Number : 가상주소의 페이지 번호를 나타낸다.
- Process ID : 해당 페이지를 소유한 프로세스의 식별자로, 페이지 번호와 결합하여 가상주소공간에 포함된 특정 페이지를 유일하게 식별한다.
- Control bits : 유효, 참조, 변경, 보호, 잠금 등 정보를 나타내는 플래그 필드
- Chain Pointer : 다음 항목을 가리키는 인덱스 값이 저장된다. (다음 항목이 없다면 Null)
- Chain Pointer 사용 예시
![](https://blog.kakaocdn.net/dn/batBGK/btr7iMgOd69/KXGvrsyMqxI4mQkbLIBlQ0/img.png)
10으로 나눈 나머지를 이용하는 Hash Function을 사용하는 예시이다.
Page Number = 53, Process ID = 2350인 페이지를 찾는 과정이다.
각 column은 Page Number, Process ID, Control bits, Chain Pointer에 해당한다.
- Hash Function에 의해 나머지가 3인 항목을 찾는다.
- Page# = 13, Process ID = 1230 이므로 다음 항목을 찾아야 한다.
- Chain Pointer에 Hash Function의 값이 3인 인덱스 3이 저장되어 있다.
- 따라서, 0 -> 1 -> 2 -> 3 의 순서가 아닌 0 -> 3 의 순서로 탐색을 줄일 수 있다.
- 3번 인덱스 역시 해당 값이 아니므로, Chain Pointer를 따라 5번 인덱스로 향한다.
- 5번 인덱스 또한 찾는 값이 아니기 때문에, 9번 인덱스로 향한다.
- 9번 인덱스는 해당하는 값이기에 페이지를 찾게 된다.
- 인덱스는 물리 메모리의 Frame 번호와 같다.
질문
Q. 페이지 크기가 커지면, 페이지 폴트가 더 많이 발생한다고 할 수 있나요?
![](https://blog.kakaocdn.net/dn/cB0J2Y/btr7xVqqT5q/hpNIYpyDPEb6ywfKJfXULk/img.png)
위 그래프와 비슷한 양상을 보인다고 한다.
페이지 크기가 커질수록, 물리 메모리에 들어갈 수 있는 페이지의 개수가 작아진다.
따라서, 페이지 교체가 더 많이 발생한다.
그러나, 특정 구간 이후로는 Page Fault가 줄어든다.
- 페이지의 크기가 매우 커서 대부분의 경우에 하나의 페이지 안에 필요한 다음 페이지가 들어있기 때문이다.
참고
가상메모리(virtual memory)와 요구페이징(demand paging)
[OS] 요구 페이징(Demand Paging)과 관련해 페이지 폴트 인터럽트(Page Fault Interrupt) 발생하는 과정 설명
[IT 기술면접 준비자료] 가상메모리의 동작과 페이지폴트(Page Fault)
'Computer Science > Operating System' 카테고리의 다른 글
메모리 계층구조 (0) | 2023.04.05 |
---|---|
Segmentation(세그멘테이션) (0) | 2023.04.03 |
내부 단편화, 외부 단편화 (0) | 2023.04.02 |
Thread Pool(스레드 풀) / Monitor(모니터) / Fork-Join(포크-조인) (1) | 2023.03.08 |
Thread Safe(스레드 안전) (0) | 2023.03.08 |