-목차-
1. 가상 메모리(Virtual Memory)란?
이전 업로드한 글에서 주 기억장치의 외부 단편화 해결을 위해 페이징(Paging)이라는 메모리 관리 전략을 사용한다고 하였다. 프로세스는 페이지라는 블록으로 나뉘고, 페이지가 주기억 장치의 프레임에 적제 되어 프로세스가 실행된다. 만약 100MB인 메인 메모리에서 200MB 크기의 프로세스를 실행하려면 어떻게 해야 할까? 단순히 메인 메모리가 더 큰 컴퓨터를 사용해야 하는가? 이런 방법은 매우 비효율적일 것이다.
운영체제는 위와 같은 제약사항을 극복하기 위해 상대적으로 값싼 디스크의 일정 공간을 할당해 보조 메모리 용도로 사용한다.
주 기억장치와 보조 기억장치를 묶어 하나의 메모리처럼 동작하게 함으로써 주 기억장치의 한계를 넘는 메모리 사용을 가능하게 하는 것이 가상 메모리이다 . 정리하자면
가상 메모리란 주 기억장치의 메모리상 한계를 극복하기 위해 보조 기억장치를 주기억 장치의 연장선처럼 사용하는 방법이라고 할 수 있다.
또한 다중 프로그래밍을 실현하기 위해서는 많은 프로세스들을 동시에 메모리에 올려두어야 한다. 가상메모리는 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법 이며, 프로그램이 물리 메모리(메인 메모리)보다 커도 된다는 주요 장점이 있다.
2. Demand Paging(요구 페이징)
프로그램 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 프로그램 실행에 필요한 것들만 적재하는 전략을 요구 페이징이라 하며, 가상 메모리 시스템에서 많이 사용된다.
요구 페이징을 사용하는 가상 메모리에서는 실행 과정에서 필요해질 때 페이지들이 적재된다(lazy swapper). 한 번도 접근되지 않은 페이지는 물리 메모리에 적재되지 않는다.
프로세스 내의 개별 페이지들은 페이저(pager)에 의해 관리된다. 페이저는 프로세스 실행에 실제 필요한 페이지들만 메모리로 읽어 옴으로써,사용되지 않을 페이지를 가져오는 시간낭비와 메모리 낭비를 줄일 수 있다.
스와퍼는 전체 프로세스를 관리하는 반면 페이저(pager)는 프로세스 내의 개별 페이지들을 관리한다. 요구 페이징과 관련해서는 스와퍼 보다 페이저가 더욱 가깝다.
페이저는 어느 페이지가 디스크에만 있고 어느 페이지가 메모리에 올라와 있는지 구별할 수 있어야 한다. 이때 유효/무효(valid-invalid) 비트 기법을 사용하여 비트가 유효하면 메모리에 있는 것을 의미하고 유효하지 않으면 메모리에 없거나(디스크에 있거나) 해당 페이지가 유효하지 않다는 것이다.
프로세스가 메모리에 없는 페이지를 접근하려 할 때 운영 체제에 페이지 부재 트랩(page-fault-trap)을 발생시킨다.
[페이지 부재를 처리하는 과정]
- 프로세스에 대한 내부 테이블(internal table)을 검사해서 그 메모리 참조가 유효/무효인지를 알아낸다.
- 무효한 페이지에 대한 참조라면 프로세스는 중단된다. 유효 한참 조인 경우 메모리에 없으면 디스크로부터 가져와야 한다.
- 빈 공간, 자유 프레임(free frame)을 찾는다.
- 디스크에 새로이 할당된 프레임으로 해당 페이지를 읽어 들이도록 요청
- 디스크 읽기가 끝나면 이 페이지가 메모리에 있다는 것을 알리기 위해 페이지 테이블을 갱신하며 프로세스가 유지하고 있는 내부 테이블을 수정한다.
- 트랩에 의해 중단되었던 명령을 다시 수행하며 프로세스는 그 페이지가 항상 메모리에 있었던 것처럼 간주하여 해당 페이지를 접근할 수 있다.
3. 페이지 교체
요구 페이징에서 언급된 대로 프로그램 실행 시에 모든 항목이 물리 메모리에 올라오지 않기 때문에, 프로세스의 동작에 필요한 페이지를 요청하는 과정에서 page fault(페이지 부재)가 발생하게 되면, 원하는 페이지를 보조 저장장치에서 가져오게 된다. 하지만, 만약 물리 메모리가 모두 사용 중인 상황이라면, 페이지 교체가 이뤄져야 한다.
기본적인 방법
- 물리 메모리가 모두 사용중인 상황에서의 메모리 교체 흐름이다.
- 디스크에서 필요한 페이지의 위치를 찾는다
- 빈 페이지 프레임을 찾는다.
- 페이지 교체 알고리즘을 통해 희생될(victim) 페이지를 고른다.
- 희생될 페이지를 디스크에 기록하고, 관련 페이지 테이블을 수정한다.
- 새롭게 비워진 프레임에 새 페이지를 읽어온다.
- 사용자 프로세스 재시작
3.1 페이지 교체 알고리즘
FIFO 페이지 교체
가장 간단한 페이지 교체 알고리즘으로 FIFO(first-in first-out)의 흐름을 가진다. 즉, 먼저 물리 메모리에 들어온 페이지 순서대로 페이지 교체 시점에 먼저 나가게 된다는 것이다.
- 장점
- 이해하기도 쉽고, 프로그램하기도 쉽다.
- 단점
- 오래된 페이지가 항상 불필요하지 않은 정보를 포함하지 않을 수 있다(초기 변수 등)
- 처음부터 활발하게 사용되는 페이지를 교체해서 페이지 부재율을 높이는 부작용을 초래할 수 있다.
- Belady의 모순: 페이지를 저장할 수 있는 페이지 프레임의 개수를 늘려도 되려 페이지 부재가 더 많이 발생하는 모순이 존재한다.
최적 페이지 교체(Optimal Page Replacement)
Belady의 모순을 확인한 이후 최적 교체 알고리즘에 대한 탐구가 진행되었고, 모든 알고리즘보다 낮은 페이지 부재율을 보이며 Belady의 모순이 발생하지 않는다. 이 알고리즘의 핵심은 앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체하는 것이다. 주로 비교 연구 목적을 위해 사용한다.
- 장점
- 알고리즘 중 가장 낮은 페이지 부재율을 보장한다.
- 단점
- 구현의 어려움이 있다. 모든 프로세스의 메모리 참조의 계획을 미리 파악할 방법이 없기 때문이다.
LRU 페이지 교체(LRU Page Replacement)
LRU: Least-Recently-Used
최적 알고리즘의 근사 알고리즘으로, 가장 오랫동안 사용되지 않은 페이지를 선택하여 교체한다.
- 특징
- 대체적으로 FIFO 알고리즘보다 우수하고, OPT알고리즘보다는 그렇지 못한 모습을 보인다.
LFU 페이지 교체(LFU Page Replacement)
LFU: Least Frequently Used
참조 횟수가 가장 적은 페이지를 교체하는 방법이다. 활발하게 사용되는 페이지는 참조 횟수가 많아질 거라는 가정에서 만들어진 알고리즘이다.
- 특징
- 어떤 프로세스가 특정 페이지를 집중적으로 사용하다, 다른 기능을 사용하게 되면 더 이상 사용하지 않아도 계속 메모리에 머물게 되어 초기 가정에 어긋나는 시점이 발생할 수 있다
- 가장 최근에 불러온 페이지가 교체될 수 있다.
- 최적(OPT) 페이지 교체를 제대로 근사하지 못하기 때문에, 잘 쓰이지 않는다.
MFU 페이지 교체(MFU Page Replacement)
MFU: Most Frequently Used
참조 회수가 가장 작은 페이지가 최근에 메모리에 올라왔고, 앞으로 계속 사용될 것이라는 가정에 기반하여 가장 많이 참조된 페이지를 교체하는 알고리즘이다.
- 특징
- 최적(OPT) 페이지 교체를 제대로 근사하지 못하기 때문에, 잘 쓰이지 않는다.
참고 자료
https://blog.naver.com/jevida/140191934297
'운영체제' 카테고리의 다른 글
캐시의 지역성 (0) | 2022.02.05 |
---|---|
메모리 관리 전략 (0) | 2022.02.03 |
프로세스 동기화(Process Synchronization) [파이썬(Python)] (0) | 2022.02.03 |
Blocking, Non-blocking, Sync, Async 의 차이 (0) | 2022.02.02 |
스케줄러 (0) | 2022.01.27 |
댓글