[OS] 12. 가상메모리
메모리(memory)
- 메모리란 프로그램과 프로그램 수행에 필요한 데이터 및 코드를 저장하는 장치
- 메모리는 크게 내부 기억장치인 주기억장치와 외부 기억장치인 보조 기억장치로 분류됨.
- DRAM, CPU 안에 있는 레지스터(register)와 캐쉬(cache memory) 등이 주기억장치에 해당된다.
- SSD, HDD 등이 보조 기억장치에 해당된다.
가상메모리 등장 배경
- 초창기 컴퓨터에서는 사용 가능한 RAM 의 용량이 가장 큰 실행 애플리케이션의 주소 공간보다 커야 했다.
- 그렇지 않을 경우 “메모리 부족” 오류에 의해 해당 애플리케이션을 실행할 수 없었다.
- 이후 컴퓨터에서는 프로그래머가 애플리케이션의 일부분만 기억장치(메모리)에 올려 실행하도록 지정할 수 있게 하는 오버레이 기법을 사용하여 메모리 부족 문제를 해결하고자 했다.
- 하지만 이 역시 전반적인 메모리 부족 문제를 해결할 수 없었다. 오버레이를 사용하는 프로그램은 그렇지 않은 프로그램보다는 메모리를 덜 사용했지만, 애초에 시스템이 프로그램을 위한 충분한 메모리를 갖추고 있지 않은 경우에는 결국 똑같은 메모리 부족 오류가 발생했다.
- 여기에서 더 발전한 가상 메모리 기법은 애플리케이션을 실행하는 데 얼마나 많은 메모리가 필요한 지에 집중하지 않고, 대신 애플리케이션을 실행하는 데 최소한 얼마만큼의 메모리가 필요한가에 집중하여 문제를 해결하고자 한다.
- 이렇게 접근하는 방식이 가능한 이유는 메모리 접근은 순차적이고 지역화되어 있기 때문이다.
- 그렇다면 이렇게 애플리케이션의 일부분만 메모리(기억장치)에 올려진다면, 메모리에 올라가지 않는 나머지는 어디에 위치해야 할까?
- 바로, 보조 기억장치, 즉 디스크 에 위치해야 한다. 가상 메모리의 핵심은 바로 보조 기억장치다.
가상메모리
- 가상 메모리는 메모리가 실제 메모리보다 많아 보이게 하는 기술이다.
- 어떤 프로세스가 실행될 때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하다는 점에 착안하여 고안되었다.
- 어플리케이션이 실행될 때, 실행에 필요한 일부분만 메모리에 올라가며 어플리케이션의 나머지는 디스크에 남게 된다.
- 즉, 디스크가 RAM 의 보조 기억장치(backing store)처럼 작동하는 것이다.
- 결국 작은 기억장치(RAM)를 크고 느린 기억장치(디스크)와 병합하여, 하나의 크고 빠른 기억장치(가상메모리)처럼 동작하게 하는 것이다.
- 가상메모리를 사용하기 위해서는 MMU(Memory Management Unit) 라는 하드웨어가 필요하다.
- MMU
- 일반적으로 메모리 관리자라고 일컫는다.
- MMU 는 가상주소를 물리주소로 변환하고, 메모리를 보호하는 기능을 수행한다.
- MMU 를 사용하게 되면, CPU 가 각 메모리에 접근하기 이전에 메모리 주소 번역 작업이 수행된다.
- 그러나 메모리를 일일이 가상 주소에서 물리적 주소로 번역하게 되면 작업 부하가 너무 높아지므로, MMU 는 RAM 을 여러 부분(페이지, pages)로 나누어 각 페이지를 하나의 독립된 항목으로 처리한다.
- 가상메모리의 크기
- 가상메모리는 이론적으로 무한대의 크기를 가진다.
- 현실적인 최대 크기는 물리 메모리의 최대 크기로 한정 된다.(32bit CPU에서 4GB)
페이징 기법
- 구현
- 고정 분할 방식을 활용한 가상 메모리 관리 기법으로 물리 주소 공간을 같은 크기로 나누어 사용한다.
- 즉 메모리를 같은 크기로 자르는 것이다.
- 가상 주소는 프로세스 입장에서 바라본 메모리 공간이기 때문에 항상 0번지 부터 시작한다.
- 가상 주소의 분할된 각 영역을 페이지, 물리 메모리의 영역은 프레임이라 부른다
- 페이지와 프레임이 연결된 형태는 페이지 테이블에 숫자의 형태로 담아 놓는다.
- 페이지에 있는 메모리 구간이 물리 메모리와 연결 되지 않았을 때는 페이지 테이블에 invalid 기입한다. 이는 스왑 영역에 있음을 의미한다.
- 페이지 테이블 매핑 방식
- 메모리가 부족할 때나 페이지 테이블의 일부도 스왑 영역으로 넘어가는 경우에 페이지 테이블이 참조하는 공식이 변형 된다.
- 직접 매핑
- 페이지 테이블 전체가 물리 메모리의 운영체제 영역에 존재하는 방식으로 별다른 부가 작업 없이 주소 변환이 가능하다.
- 페이지 테이블 전체가 메모리에 올라와 있기 때문에 프레임 번호만 적어 줘도 변환이 가능하고, 페이지 번호만 알면 바로 조회가 가능하다.
- 페이지 테이블 기준 레지스터가 페이지 테이블의 시작 주소를 알고 있으므로 이를 기반으로 페이지의 실제 주소를 아는 것이 쉽다.
- 연관 매핑
- 페이지 테이블 전체를 스왑 영역에서 관리하는 방식으로 물리 메모리의 여유 공간이 적을 때 사용한다.
- 페이지 테이블의 일부만 물리 메모리에 가지고 있으며, 프레임 번호와 페이지 번호를 둘 다 페이지 테이블에 기입해야 한다.
- 페이지 번호를 알아도 테이블에서 모든 번호를 조회해야 한다는 단점이 있다.
- 일부 페이지 테이블이 물리 메모리에 올라와 있는 것을 변환 색인 버퍼라 부른다.
- 캐시 시스템과 유사하다 (TLBhit/TLBMiss)
- TLB 란 Translation Lookaside Buffer. 페이지 정보 캐시
- TLBMiss 가 자주 발생하면 시스템의 성능이 저하된다.
- 집합 연관 매핑
- 연관 매핑의 문제점을 개선한 방식으로 모든 페이지 테이블을 스왑영역에서 관리하는 점은 동일하나 스왑 영역에 있거나, 물리 영역에 있는 것을 연관 매핑처럼 일일이 검색하지 않아도 된다.
- 페이지 테이블이 일정 크기의 묶음으로 나뉘기 때문에 가상주소를 VA =
<P,D>
가 아닌 VA =<P1,P2,D>
로 표기한다. P1, P2
를 통해 테이블 덩어리가 메모리 영역에 있는지 스왑영역에 있는지 확인이 가능하다.
- 역매핑
- 페이지 번호를 기준으로 테이블을 구성하는 위 세가지 방식과 달리, 물리 메모리의 프레임 번호를 기준으로 테이블을 구성한다.
- PID 를 기준으로 구성하며, PID 가 어떤 페이지에 올라와 있는지를 표기한 테이블이다.
- 프로세스 수와 상관없이 하나의 테이블만 존재하기 때문에 크기가 매우 작다.
- 단점으로는 가상메모리에 접근 할 때 PID/페이지 번호를 모두 찾아야 한다.
세그멘테이션 기법
- 구현
- 물리 메모리를 프로세스의 크기에 따라 가변적으로 나누어 사용한다.
- 페이징 기법과 마찬가지로 세그먼테이션 테이블을 사용하며, segment 의 크기를 나타내는 limit 과 메모리상의 시작 주소를 나타내는 address 가 테이블에 기입 되어있다.
- 물리 메모리 부족 시 swap 영역을 사용하는데, address 에 invalid 값을 대입하여 사용한다.
- 가변 분할 방식과 동일하다.
- 세그먼테이션 기법의 주소 변환 방식
- VA =
<S,D>
로 표현한다. S
는 Segment number 를 의미하고D
는 세그먼트 시작 지점에서 해당 주소까지의 거리를 의미한다.- a 프로세스의 b 번째 주소에 접근하는 경우를 가정하면 a 프로세스가 segment 몇으로 분할되었는지 확인하고
VA
를 표기한다. - 세그먼트 번호에 맞는 limit 값에 거리 값
D
를 더하면, 주소 값이 나온다.
- VA =
캐시 매핑 기법
- 직접 매핑
- 메모리 주소와 캐시의 순서를 일치시킨다.
- 만약 메모리가 1~100 까지 있고, 캐시가 1~10 까지 있다면 1~10 까지의 메모리는 캐시 1에 위치하는 방식으로 매핑한다.
- 구현이 간단하다는 장점이 있지만, 캐시가 효율적이지 않게 자꾸 교체되어야 하는 일이 발생한다.
- 위의 문제를 해결하기 위해 LRU 기법을 사용한다.
- 연관 매핑
- 순서를 일치시키지 않는다.
- 필요한 메모리 값을 캐시의 어디든 편하게 저장 될 수 있다.
- 장점은 필요한 캐시들 위주로 저장할 수 있기 때문에 적중률이 높고 성능이 좋다.
- 단점은 찾는 과정에서 태그마다 비교해야 하기 때문에 복잡하고 느리다.
- 직접 연관 매핑
- 연관매핑과 직접매핑의 집합체이다.
- 순서를 일치시키고 편하게 저장하되, 일정 그룹을 두어 그 그룹 내에서 편하게 저장시키는 것이다.
- 예를 들어 메모리가 1~100 까지 있고, 캐시가 1~10 까지 있다면 캐시 1~5 에는 1~50 의 데이터를 무작위로 저장시키는 것이다.
- 블록화가 되어 있기 때문에 검색은 좀 더 효율적이고, 적중률도 많이 떨어지지 않는다.
가상 메모리 관리
- 가상메모리란 메모리 내에 완전히 존재하지 않는 프로세스를 실행하는 기술을 의미한다.
- 즉 프로그램이 CPU 에 의해 실제로 사용되는 부분만 메모리로 로드하고, 사용되지 않는 부분은 디스크로 옮겨서 실제 메모리를 대체하도록 하는 것이다.
- 장점
- 물리 메모리의 크기에 제한 받지 않는다.
- 더 많은 프로그램이 동시에 실행될 수 있다.
- 페이지 테이블 전체를 읽을 필요가 없기 때문에 프로그램을 Load/Swap 하기 위한 연산이 줄어든다.
- 요구 페이징
- 요구 페이징이란 프로세스를 구성하는 페이지 전체를 메모리로 적재하는 것이 아니라, 당장 필요한 페이지만 메모리에 적재하는 기술이다.
-
프로세스 내에서 한 번도 접근되지 않은 페이지는 절대로 메모리에 로드되지 않는다.
- 요구 페이징의 기본적인 개념으로 디스크의 페이지를 메모리로 적재할 때, pager 는 어떤 페이지가 사용될지 예측하고 메모리로 적재시킨다.
- 이 때 메모리에 적재되어 있는 페이지와 디스크에 있는 페이지를 구분해야 한다. 이를 위해 valid-invalid bit 를 사용한다.
- Page Fault(페이지 부재)
- 페이지 부재는 프로세스가 메모리에 존재하지 않는 페이지에 접근하려고 할 때 발생한다.
- 즉 어떤 페이지에 접근하려고 했을 때 해당 페이지가 실제 물리 메모리에 부재할 때 발생하는 인터럽트이다.
-
페이지 부재가 발생하면 운영체제가 이를 해결한 뒤 다시 동일한 명령을 수행하는 식으로 동작한다.
- 페이지 폴트란, 어떤 프로그램이 자신의 주소 공간(가상 메모리 공간)에는 존재하지만 시스템의 RAM 에는 현재 존재하지 않는 데이터/코드에 접근을 시도할 경우 발생하는 현상을 의미한다.
- 페이지 폴트가 발생하면 운영체제는 그 데이터를 메모리로 가져와서, 마치 페이지 폴트가 전혀 발생하지 않은 것처럼 프로그램이 계속적으로 작동하게 해준다.
- 이러한 페이지 폴트가 자주 일어날수록 운영체제의 성능이 많이 저하되기 때문에 페이지 폴트가 일어나지 않도록 하는 것이 중요하다.
- 페이지 폴트를 최소화하기 위한 방법으로는 페이지 교체 정책이 있다.
- 메모리가 꽉 차있을 때 기존 페이지 중 하나를 물리 메모리에서 저장 매체로 내리고, 새로운 페이지를 방금 비워진 해당 물리 메모리 공간에 올린다.
- 이 때 기존 페이지 중 어떤 것을 내리면 좋을지에 대한 알고리즘을 짠 것이 바로 페이지 교체 알고리즘이다.
- Victim page 는 page-out 이 되는 페이지를 뜻한다.
- 페이지 교체 알고리즘
- FIFO 알고리즘
- 메모리에 먼저 올라온 페이지를 먼저 내보낸다는 알고리즘
- 페이지 결함이 많이 일어난다는 단점이 있다.
- OPT 알고리즘
- 앞으로 가장 사용하지 않을 페이지를 가장 우선적으로 내려 보내는 알고리즘이다.
- FIFO 에 비해서는 페이지 결함이 일어날 횟수가 많이 감소한다.
- 단점으로는 미래를 알 수 없는 조건에 의해 실질적으로 수행하는데는 큰 어려움이 있다
- LRU 알고리즘
- 최근에 사용하지 않은 페이지를 가장 먼저 내려 보내는 알고리즘이다.
- OPT 의 경우에는 미래에 대한 예측이지만, LRU 는 과거를 보고 판단하므로 실질적으로 이용이 가능하다.
- OPT 보단 페이지 결함이 더 일어날 수는 있지만, 실제로 사용할 수 있는 알고리즘 중에서는 좋은 방법 중 하나라고 할 수 있다.
- LFU
- 페이지를 사용할 때마다 횟수를 기록하고 카운트가 가장 작은 페이지를 victim 으로 지정하고 교체하는 방법이다.
- 앞으로 많이 사용할 페이지가 들어오더라도, 적은 횟수를 가지고 있기 때문에 victim 이 될 수있다.
- 초기에 많이 사용되고 더이상 사용하지 않을 페이지가 메모리에 남아있을 수 있다.
- 무작위
- 스왑 영역으로 쫓아낼 대상 페이지를 특별한 로직 없이 무작위로 선정한다.
- 지역성을 고려하지 않아 성능이 좋지 않다는 단점이 있다.
- FIFO 알고리즘
스레싱과 프레임 할당
- 스레싱은 각 프로세스에 프레임을 할당하는 문제와도 연관된다.
- 남아있는 프레임을 실행 중인 프로세스에 적절히 나누어주는 할당 방법이다.
- 정적 할당과 동적 할당으로 구분된다.
- 정적 할당
- 정적 할당 방식은 프로세스 실행 초기에 프레임을 나누어준 후 그 크기를 고정하는 방식이다.
- 균등 할당과 비례 할당으로 나뉜다.
- 균등 할당
- 프로세스의 크기에 상관 없이 사용 가능한 프레임을 모든 프로세스에 동일하게 할당하는 방식
- 비례 할당
- 프로세스의 크기에 비례하여 프레임을 할당하는 방식
- 동적 할당
- 정적 할당과 다르게 시시각각 변하는 메모리 요청들을 수용하여 프레임을 조절하는 방식이다.
- 동적 할당 방식에는 작업 집합 모델을 사용하는 방식과 페이지 부재 빈도를 사용하는 방식이 있다.
- 작업 집합 모델
- 지역성 이론을 바탕으로 하며, 가장 최근에 접근한 프레임이 이후에도 참조될 가능성이 높다는 가정에서 출발한다.
- 최근 일정 시간 동안 참조된 페이지들을 집합으로 만들고, 이 집합에 있는 페이지들을 물리 메모리에 유지하여 프로세스 실행을 돕는다.
- 페이지 부재 빈도
- 페이지 부재 횟수를 기록하여 페이지 부재 비율을 계산하는 방식이다.
- 페이지 부재 방식에서는 페이지 부재 배율의 상한선과 하한선을 설정한다.
- 하한선에 도달하면 프레임을 회수하고, 상한선에 도달하면 프레임을 추가한다.
댓글 남기기