🎯 가상메모리
- 가상 메모리는 메모리가 실제 메모리보다 많아 보이게 하는 기술로, 어떤 프로세스가 실행될 때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하다는 점에 착안하여 고안되었다.
- 어플리케이션이 실행될 때, 실행에 필요한 일부분만 메모리에 올라가며 어플리케이션의 나머지는 디스크에 남게 된다.
- 결론으로 작은 기억장치를 크고 느린 기억장치와 병합하여, 하나의 크고 빠른 기억장치(가상메모리) 처럼 동작하게 하는 것이다.
- 가상메모리를 사용하기 위해서는 MMU라는 하드웨어가 필요하다.
MMU
- MMU는 는 가상주소를 물리주소로 변환하고, 메모리를 보호하는 기능을 수행한다.
- MMU를 사용하게 되면, CPU가 각 메모리에 접근하기 이전에 메모리 주소 번역 작업이 수행된다.
- 그러나 메모리를 일일이 가상 주소에서 물리적 주소로 번역하게 되면 작업 부하가 너무 높아지므로, MMU는 RAM을 여러 부분(페이지, pages)로 나누어 각 페이지를 하나의 독립된 항목으로 처리한다.
가상메모리의 크기
- 가상메모리는 이론적으로 무한대의 크기를 가진다.
- 현실적인 최대 크기는 물리 메모리의 최대 크기로 한정 된다.
(32bit cpu에서 4gb)
페이징 기법
- 구현
- 고정 분할 방식을 활용한 가상 메모리 관리 기법으로 물리 주소 공간을 같은 크기로 나누어 사용한다.
- 가상 주소는 프로세스 입장에서 바라본 메모리 공간이기 때문에 항상 0번지 부터 시작한다.
- 가상 주소의 분할된 각 영역을 페이지, 물리 메모리의 영역은 프레임이라 부른다
- 페이지와 프레임이 연결된 형태는 페이지 테이블에 숫자의 형태로 담아 놓는다.
- 페이지에 있는 메모리 구간이, 물리 메모리와 연결 되지 않았을 때는 페이지 테이블에 invalid 기입해 놓는데, 이는 swap영역에 있음을 의미한다.
- 페이지 테이블 매핑 방식
- 메모리가 부족할 때나 페이지 테이블의 일부도 스왑 영역으로 넘어가는 경우에 페이지 테이블이 참조하는 공식이 변형 된다.
- 직접 매핑
- 페이지 테이블 전체가 물리 메모리의 운영체제 영역에 존재하는 방식으로 별다른 부가 작업 없이 주소 변환이 가능하다.
- 페이지 테이블 전체가 메모리에 올라와 있기 때문에, 프레임 번호만 적어 줘도 변환이 가능하고, 페이지 번호만 알면 바로 조회가 가능하다.
- 페이지 테이블 기준 레지스터가 페이지 테이블의 시작 주소를 알고 있으므로, 이를 기반으로 페이지의 실제 주소를 아는 것이 쉽다.
- 연관 매핑
- 페이지 테이블 전체를 스왑 영역에서 관리하는 방식으로 물리 메모리의 여유 공간이 적을 때 사용한다.
- 페이지 테이블의 일부만 물리메모리에 가지고 있으며, 프레임 번호와 페이지 번호를 둘 다 페이지 테이블에 기입해야 한다.
- 페이지 번호를 알아도 테이블에서 모든 번호를 조회해야 한다는 단점이 있다.
- 일부 페이지 테이블이 물리 메모리에 올라와 있는 것을 변환 색인 버퍼라 부른다.
- 캐시 시스템과 유사하다 (TLBhit/TLBMiss)
- 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를 더하면, 주소 값이 나온다.
캐시 매핑 기법
- 직접 매핑
- 메모리 주소와 캐시의 순서를 일치시킨다.
- 만약 메모리가 1~100까지 있고, 캐시가 1~10까지 있다면 1~10까지의 메모리는 캐시 1에 위치하는 방식으로 매핑한다.
- 구현이 간단하다는 장점이 있지만, 캐시가 효율적이지 않게 자꾸 교체되어야 하는 일이 발생한다.
- 위의 문제를 해결하기 위해 LRU기법을 사용한다.
- 연관 매핑
- 순서를 일치시키지 않는다.
- 필요한 메모리 값을 캐시의 어디든 편하게 저장 될 수 있다.
- 장점은 필요한 캐시들 위주로 저장할 수 있기 때문에 적중률이 높고 성능이 좋다.
- 단점은 찾는 과정에서 태그마다 비교해야 하기 때문에 복잡하고 느리다.
- 직접 연관 매핑
- 연관매핑과 직접매핑의 집합체이다.
- 순서를 일치시키고 편하게 저장하되, 일정 그룹을 두어 그 그룹 내에서 편하게 저장시키느 것이다.
- 예를 들어 메모리가 1~100까지 있고, 캐시가 1~10까지 있다면 캐시 1~5에는 1~50의 데이터를 무작위로 저장시키는 것이다.
- 블록화가 되어 있기 때문에 검색은 좀 더 효율적이고, 적중률도 많이 떨어지지 않는다