운영체제를 공부하기 위해 운영체제 아주 쉬운 세 가지 이야기 라는 책을 읽고 공부한 내용을 정리합니다.
잘못되거나 부족한 부분이 있으면 언제든 댓글로 가르침 부탁드립니다.
세그멘테이션은 가변 크기 의 조각으로 분할하기 때문에 메모리에 빈 공간이 많이 생기는 외부 단편화 문제가 발생한다. 이를 동일 크기 의 조각으로 분할하는 페이징 기법을 통해 해결할 수 있다. 프로세스의 주소 공간을 논리 세그먼트가 아닌 고정 크기의 단위(보통 4KB)로 나누고 이를 페이지 라고 부른다. 또한 상응하는 물리 메모리를 페이지 프레임 이라고 부른다. 그리고 각 페이지와 페이지 프레임의 매칭 정보 및 페이지 관련 정보를 저장하는 자료구조를 페이지 테이블 이라고 한다.
프로세스마다 페이지 테이블을 가지고 있다. 프로세스가 생성한 가상 주소를 물리 주소로 변환하기 위해서는, 가상주소를 가상 페이지 번호(Virtual Page Number, VPN) 와 페이내 데이터의 위치를 나타내는 오프셋으로 분할한다. 이중 오프셋은 물리 주소에서 그대로 사용되고, VPN만 물리 프레임 번호(Physical Frame Number)로 변환되어 물리 주소가 된다.
페이지 테이블은 프로세스가 많아 지는 만큼 커질 수 있다. 따라서 MMU안에 저장하지 않고 메모리나 디스크(스왑)에 저장된다.
메모리 참조는 비용이 비싸고 느리다. 그런데 2회나 발생한다. 또한 데이터를 저장하기도 부족한 마당에 페이지 테이블 자체가 많은 메모리를 차지한다. 즉 비효율적이다.
위에서 살펴본 바에 따르면, 단순히 페이지 테이블을 이용하여 주소를 변환하는 방식은 매우 비효율적이다. 이를 개선하기 위해 필요한 것이 TLB이다. TLB(Translation-Lookaside Buffer)는 MMU에 소속된 칩으로, 자주 참조되는 가상주소-물리주소 변환 정보를 저장해놓은 캐시이다. 가상 주소로 데이터 접근시, TLB에 먼저 접근하여 변환 정보가 있는지 확인하고 있으면 바로 변환하고 없으면 페이지 테이블에 찾으러 간다. 단, TLB에 변환 정보가 없는 경우(TLB 미스), 페이지 테이블에서 해당 물리 주소를 찾아 TLB에 갱신 후, TLB 미스가 발생한 명령어를 재실행한다.
TLB 정보는 그것을 탑재시킨 프로세스에서만 유효하다. 따라서 다른 프로세스가 동작할 때는 필요없는 정보가 TLB에 남게 된다. 이를 해결하기 위해서는,