컴퓨터에서 일어나는 거의 모든 연산은 중앙처리장치(CPU)
가 수행합니다.중앙처리장치
가 연산을 하기 위해서는 데이터가 필요한데, 그 데이터는 중앙처리장치
의 레지스터
에 저장됩니다.
하지만 레지스터
는 크기가 매우 작아서, 연산에 필요한 모두 데이터를 저장할 수는 없는데요.
그래서 메모리
에 연산에 필요한 대부분의 데이터를 저장해 놓고, 당장 연산할 데이터만 레지스터
불러와 연산합니다.
위 글에서 설명하지 않은, 그림의 나머지 부분은 아래에서 조금 더 상세히 알아봅시다.
가상 메모리
CPU는 실제 메모리의 물리 주소
대신, 프로세스 내부에서만 사용하는 논리 주소
를 사용합니다.
그리고 모든 프로세스는 실제 물리 주소
를 찾을 수 있도록 메모리를 할당 받으면서, 프로세스의 시작 물리 주소
인기본 주소(base address)
를 갖게 됩니다.
프로세스 내부에서는 0부터 시작하는 논리 주소
를 활용하게 됩니다.
이 처럼, 실제 메모리의 주소가 아닌 논리 주소
를 활용하는 것이 가상 메모리 입니다.
주소 변환
CPU가 사용하는 논리적 주소를 물리적 주소로 변환하기 위해서 메모리 관리 유닛(Memory Management Unit)
이 사용됩니다.
MMU
는 기본 레지스터
, 비교•연산 기능
, 한계 레지스터
를 갖고 있습니다.
기본 레지스터
: 기본 주소 + 논리 주소를 조합하여 물리 주소로 변환합니다.비교•연산 기능
: 비교연산, 더하기연산 등을 수행합니다한계 레지스터
: 프로세스가 가질 수 있는 물리 주소의 한계로, 조합된 주소가 유효한지 검증합니다.
검증을 통과하면, 실제 메모리에 접근하여 데이터를 가져오게 됩니다.
메모리 단편화
메모리에 순차적으로 메모리를 할당했다가, 해제하기를 반복하면 빈 공간이 생기는 메모리 단편화
가 발생합니다.
메모리 단편화
를 해결하기 위해서 여러가지 기법들을 사용하는데요.
메모리 스와핑
먼저 메모리 스와핑
기법은 메모리에 할당된 데이터를 그대로 하드디스크에 옮겨 빈 공간을 만드는 기법입니다.
그렇게 생긴 빈 공간에 메모리를 할당하여, 새로운 프로세스를 사용할 수 있다는 장점이 있습니다.
그러나 기존에 있던 프로세스중 중요도가 낮은 것을 선택해서 하드웨어로 이동시키는데요.
프로세스 중요도를 파악하는 것과, 램보다 훨씬 느린 하드디스크와 데이터를 주고받는 작업 자체가
오버헤드가 커서 시간이 많이 걸린다는 단점이 있습니다.
효율적인 메모리 사용을 위해서 미리 적당한 크기로 나눠놓거나, 현재 필요한 메모리를 파악하여 적절한 공간에 넣는 방법 등
다양한 방법이 등장했으나, 결국 메모리 단편화
를 조금 줄어들게 할 뿐이었습니다.
요구 페이징
그래서 필요한 부분만 메모리에 할당하는 방식인 요구 페이징(페이징)
이 등장하게 됩니다.
메모리를 프레임
이라는 일정한 단위로 자르고, 프로세스를 프레임
과 같은 크기인 페이지
라는 단위로 잘라서 당장 필요한페이지
만 메모리에 할당하는 방식입니다.
그리고 메모리 스와핑을 통해 추가로 필요한 페이지
를 동적으로 할당하고, 필요없으면 반납하며 메모리를 효율적으로 사용합니다.
하지만, 페이징
을 적용하자 또 다른 고민거리가 등장했습니다.
메모리 단편화
를 최소화 할 수 있었지만, 프로세스가 필요없는 페이지
를 메모리에서 제거하고 다시 필요한 것을 할당받는 것을
여러번 반복하다 보면 페이지의 순서가 섞이게 되어 MMU의 연산이 복잡해집니다.
페이지 테이블
이를 해결하기 위해 페이지 테이블
이라는 공간을 두고, CPU에서 현재 프로세스와 관련된 페이지
를 찾을 수 있도록 하여
효율적인 메모리 할당이 가능하게 되었습니다.
- page : 페이지
- frame : 메모리 프레임
- Valid : 현재 메모리에 있는지(Valid), 하드디스크에 있는지(Invalid) 여부
하지만 페이지 테이블
은 각 프로세스마다 필요했고, 모두 램에 저장되어서 저장 공간이 부족해졌습니다.
그래서, 프로세스들이 공통으로 사용하는 기능을 공유 페이지
에 저장하게 되었습니다.
공유 페이지
공유 페이지
는 모든 프로세스가 공유하는 자원이기 때문에, 읽기 전용이 되어야하고 각 프로세스에서 동일한 논리 주소를
가져야 합니다.페이지 테이블
에는 권한 여부가 추가되었지만, 중복되던 페이지들을 없앨 수 있어서 메모리를 훨씬 더 많이 아낄 수 있게 되었습니다.
그런데 여기서 물리주소를 조회하기 위해서 2번 연산을 해야한다는 문제가 나타납니다.
페이징 도입 전 | 페이징 도입 후 |
---|---|
1. 기본 주소 + 논리주소 = 물리주소 | 1. 페이지 테이블 조회 2. 물리주소 연산 |
1번 연산하던 것을, 2번 연산하게 되니 CPU가 2배로 느려지게 된 것 입니다.
변환 색인 버퍼(TBL)
TBL(Translation Lock-aside Buffers)
TBL
는 논리 주소
를 물리 주소
로 변환하는 속도를 높이기 위해 사용되는 캐시 입니다.
최근에 사용한 페이지 테이블의 일부를 저장하여, 1번의 연산으로 물리 주소
를 알아낼 수 있도록 합니다.
만약 TBL
에 매칭되는 주소가 없다면, 다시 메모리에 저장된 페이지 테이블
에서 해당하는 프레임을 찾고
프레임으로 이동하여 페이지의 기본 주소
를 이용한 연산을 통해 알아낸 물리 주소
로 접근하게 됩니다.
정리
CPU
는가상메모리
안에서 동작한다.물리적 메모리(RAM)
는 효율적인 사용을 위해가상 메모리
라는 논리적 개념의 메모리로 관리된다.메모리 단편화
방지를 위해메모리 스와핑
과요구 페이징
을 사용한다.- 페이지들을 연속적인
가상 메모리
로 사용하기 위해페이지 테이블
을 참조하여 구성한다. - 페이지 테이블 읽기 연산 횟수를 줄이기 위해
TBL
이라는 하드웨어를 사용한다. CPU
는MMU
와TBL
의 지원을 받아페이지 테이블
을 참조하여,물리 메모리
주소로 접근한다.