9.가상 메모리 관리
메모리 관리자는 프로세스에 관한 배치 정책, 재배치 정책에 따라 메모리를 관리한다. 가상 메모리의 페이징과 세그먼테이션 기법의 가져오기 정책과 재배치에 알아보자.
1.요구 페이징
가져오기 정책은 프로세스가 요청할 때 메모리로 가져오는 방법이 일반적인데 이를 요구 페이징이라고 한다.
우리가 컴퓨터를 오래 사용하면 시스템이 느려질대가 있다. 이는 작업을 하지 않고 쉬는 프로세스나 좀비 프로세스가 메모리를 차지하여 관리가 복잡해지기 때문이므로 꼭 필요한 프로세스만 메모리에 유지하는 것이 좋다.
이처럼 사용자가 요구할 때 해당 페이지를 메모리로 가져오는 것이 요구 페이징이다.
현대 운영체제는 미리 가져오는 데이터가 쓸모 없을 경우가 발생하는 캐시보다는 요구 페이징을 기본으로 사용한다.
- 스와핑: 프로세스 입장에서 프로세스를 구성하는 모든 페이지가 한꺼번에 메모리에 올라오는 것이 좋다 이를 순수 스와핑이라고 한다.
- 게으른 스와핑: 이와 달리 사용자가 요구할 때 메모리에 올리는 것.
(물리 메모리기준 인,아웃!)
- 스왑인: 스왑영역에서 물리 메모리로 데이터를 가져오는 것.
- 스왑 아웃: 물리 메모리에서 스왑 영역으로 데이터를 내보내는 것.
- 유효 비트: 메모리 꽉 차서, 요구 페이징으로 인해서 인지 스왑영역에 있는 표시를 할때 사용하는 비트.
<페이지 테이블 엔트리PTE>
페이지 번호 | 플래그 비트 | 프레임 번호(=주소 필드) |
PTE가운데에는 접근 비트,변경비트,유효비트,읽기비트,쓰기비트,실행비트 등을 모아 둔 플래그 비트가 있다.
접근 비트 | 참조 비트라고도 하며 페이지가 메모리 올라온 후 사용한 적 있는지 알려줌(있다면 1) |
변경 비트 | 메모리 올라온 후 데이터의 변경 있는지 알려줌(.있으면 1)=더티 비트 |
유효 비트 | 현재 비트라고도 하며 페이지가 실제 메모리에 있는지 나타냄. |
읽기,쓰기,실행 비트 | 읽거나 쓰기 권한이 없는데 접근하려 할떄 차단하는데 사용함. 세 비트를 접근 권한 비트라고도 한다.(8장에서 세그먼테이션-페이징 혼용 기법에서 테이블 크기 줄이기 위해 권한 비트를 세그먼테이션 테이블로 옮긴다는 언급이 있었다.) |
- 페이지 부재
유효 비트가 0이면 페이지가 메모리에 있으므로 주소 필드에 물미 메모리의 프레임 번호가 저장됨. 유효비트가 1이면 페이지가 스왑영역에 있으므로 주소필드에 스왑영역 내 페이지의 주소가 저장됨. 이와 같이 프로세스가 페이지를 요청했는데 주소 필드 값이 1이여서 스왑영역에 있으면 메모리에 없는 상황이므로
페이지 부재라고 한다.
세그먼테이션 오류는 사용자의 프로세스가 주어진 메모리 공간을 벗어나거나 접근 권한 없는 곳 접근시 발생한다면 페이지 부재는 사용자 프로세스와 무관하게 페이지의 부재가 발생한다.
- 부재 발생시 메모리 관리자는 스왑영역의 0번에 있는 페이지를 메모리의 비어 있는 프레임으로 스왑인하고 프레임이 차게 되면 유효비트는 0으로 주소필드는 페이지 테이블의 값으로 변하게 된다. 그런데 만약 메모리에 빈 공간이 없다면?? 어떤 페이지를 스왑 영역으로 보낼지 결정하는 페이지 교체 알고리즘에 의해 대상페이지를 결정한다.
- 지역성
메모리가 꽉 차서 어떤 페이지를 스왑 영역으로 보낼 때 되도록 앞으로 사용하지 않을 페이지를 쫒아내는 것이 좋다.
지역성은 기억 장치에 접근하는 패턴이 메모리 전체에 고루 분포되는 것이 아니라 특정 영역에 집중되는 성질을 말한다.
페이지 교체 알고리즘에 쫒아낼 페이지를 찾을 때는 지역성을 바탕으로 한다.
공간의 지역성 | 현재 위치에서 가까운 데이터에 접근할 확률이 높다는 것. |
시간의 지역성 | 현재 기준으로 가장 최근 접근한 데이터가 사용될 확률이 높다는 것. |
순차적 지역성 | 여러 작업이 순서대로 진행되는 경향이 있다는 것. |
캐시 메모리와 마찬가지로 페이지 교체 알고리즘에서도 지역성을 고려하여 앞으로 적게 사용될 페이지를 대상 페이지로 선정해 페이지 부재를 줄이고 컴퓨터 성능을 높여야 한다.
2.페이지 교체 알고리즘
재배치(메모리 꽉 찼을 시 어떤 페이지를 스왑영역으로 내보낼지 결정)/성능 뿐아니라 유지 비용도 고려해야함.
종류 | 알고리즘 | 특징 |
간단 알고리즘 | 무작위 | 무작위로 대상 페이지 선정. |
FIFO👎 | 선입선출로 큐로 구현된다. 가장 오래된(먼저온) 페이지가 대상 페이지로 선정돼 성능이 떨어진다. | |
이론적 알고리즘(이상적) | 최적 | 앞으로 사용하지 않을 페이지를 스왑영역으로 옮긴다. (불가능) |
최적 근접 알고리즘 | LRU👍 | 최근 최소 사용 알고리즘(시간),카운터 사용가능(공간 낭비),참조 비트 시프트 사용가능(공간 낭비) _least recently used |
LFU👍 | 최소 빈도 사용 알고리즘(횟수),횟수 표시때문에 메모리 낭비 _least frequently used |
|
NUR👍👍 | 최근 미사용 알고리즘, 추가 2비트만으로 미래 추정가능. 참조비트/변경비트 _not used recently |
|
FIFO변형 | 2차기회 페이지 교체/시계 알고리즘으로 접근시 순서의 변화를 주어 기존 FIFO에 성능을 향상. 2차 기회 페이지 교체 알고리즘:페이지 부재 없을시 해당 페이지를 큐 맨뒤로 이동시켜 대상 페이지에서 제외함.기회를 더 준다는 것. 시계 알고리즘: 참조비트를 페이지에 하나씩 추가하여 1인 비트는 대상 페이지에서 제외하고 기회를 더 준다.(그후 0으로 바꾼다) |
3.스레싱과 프레임 할당
일반적으로 컴퓨터가 느리면 우리는 물리 메모리(램)의 용량을 늘려 해결한다.
CPU의 속도도 빨라야 하지만 물리 메모리의 크기도 커야 성능이 좋아지기 때문이다.
하드디스크의 입출력이 너무 많아져서 잦은 페이지 부재로 작업이 멈춘 것 같은 상태를 스레싱(threshing)이라고 한다.
스레싱은 메모리의 크기가 일정할 경우 멀티프로그램의 수와 밀접한 관계를 갖는다. 멀티프로그래밍 정도가 너무 높으면 스레싱이 발생한다.
스레싱은 각 프로세스에 프레임을 할당하는 문제와도 연관된다, 실행 중인 여러 프로세스에 프레임을 얼마나 나눠주냐에 따라 시스템 성능이 달라진다.(너무 적은 프레임→페이지 부재 빈번, 너무 큰 프레임 → 메모리 낭비)
할당 방식은 이와 같다.
- 정적할당:프로세스 실행 초기에 프레임을 나누어준 후 크기를 고정해 균등할당(모든 프로세스 동일) 또는 비례 할당 방식(프로세스 크기에 비례하게)을 사용한다. 단 비례할당은 프로세스 실행 중 프레임을 유동적으로 반영 못하며 작은 프로세스 실행중 큰 프레임(메모리) 필요시 적용되지 못하고 미리 공간을 확보해야 한다는 낭비 문제들이 있다.
- 동적할당:정적할당과 다르게 프로세스 실행 중 크기 변화 요청을 수용하는 방식으로 작업집합 모델(지역성 바탕으로 작업집합 윈도우를 사용해 현재와 시간적으로 가까운 페이지 부터 삽입)과 페이지 부재 빈도(페이지 부재 횟수를 기록하여 비율을 계산하여 하한,상한선을 정해 늘려간다)를 사용한다.
4.프레임 관련 이슈
- 전역교체: 전체 프레임을 대상으로 교체 알고리즘을 적용한다.
- 지역교체: 현재 실행 중인 프로세스의 프레임을 대상으로 교체 알고리즘을 적용한다.