가상메모리(1) 페이징 기법 , 페이지 테이블

민픽minpic·2023년 5월 18일
0

[TIL] Today I Learned

목록 보기
15/25
post-thumbnail

해당 글은 컴퓨터시스템 책에 기반하여 작성 개념내용과 이해하고 공부한 내용들을 덧붙여서 정리한 글입니다!

우선 내용에 들어가기 전에 잠깐 가상메모리를 공부한 히스토리들에 대해서 이야기를 하겠다.
우선 malloc-lab 을 구현하기 위해서 가상메모리에 대한 개념공부를 해야겠다고 생각했고, 위에 책의 9장부터 읽기 시작했다.

9장을 읽기 시작하면서 책 내용에서 이해 안되는 부분들은 구글링을 통해 더 쉽게 이해해보려고 노력했다. 그런데 많은 블로그들이 축약해서 이야기하는 부분들이 많았다. 예를 들어 MMU 안에 TLB가 있고 실제로 TLB가의 역할을 그냥 MMU가 처리한다라고 이야기하는 것과 같이 뭔가 자세히 파헤쳐진 내용이 많지 않았다. 더불어 어떠한 글이 맞는 글인지 헷갈리고 그것을 판단하고 정리하는데 시간이 오래걸렸다. 그러한 조각조각을 모아서 하나의 큰 그림으로 이해하려고 노력했다.

가상메모리란?

현대에 시스템은 "가상메모리" VM(virtual memory) 라고 알려진 메인 메모리의 추상화를 제공한다.

가상메모리가 생겨나게 된 이유는
이전에 프로그램이 메모리를 사용하다가 프로그램이 죽는 경우, 메모리를 회수 시킬 방법이 없어서 OS를 재시작하곤 했다고 한다. 이외에도 동시에 여러 프로세스가 진행되기 어려운 점, 메모리 사용량이 적은 점 등의 문제로 가상메모리를 사용하는 방법이 현재 쓰이고 있다.

프로세스는 Main memory에 적재되어 실행되게 되는데, 가상메모리를 사용함으로서 CPU가 실제 Main memory 용량 보다 더 있다고 생각하게 하고, 메모리가 연속적인 블록으로 취급하도록 생각하게 한다.

페이징 기법

가상 메모리를 구현하기 위해 여러가지 방법이 존재하지만, 책에서도 페이징 기법을 중심으로 가상메모리에 대해서 설명하고, 대표적인 기법이기 때문에 페이징 기법을 기반으로 가상메모리에 대해서 설명하겠다.

우선 앞선 게시물을 확인하면 cpu가 명령어를 인출하는 과정을 보았을 것이다. PC에 있는 물리적 주소를 확인하여 실제 물리적 주소에 접근하여 명령어를 인출해온다.
그런데 가상메모리를 사용하게 되면, cpu는 가상 주소를 가지고 있다. 그리고 MMU (Memory Management Unit)가 cpu에서 받은 가상주소를 물리주소로 변경해주어 물리적 주소에 접근할 수 있다.

이 해당 프로세스를 이해하기 위해서 우선 가상 메모리의 구성에 대해서 간략히 이야기 해보겠다.

가상페이지

우선 가상메모리는 위에서 말했듯이 Main memory 보다 더 많은 용량이 있는 듯이 동작하게 한다.

이유는 실제로 가상메모리는 디스크에 저장된 N개의 바이트 크기의 셀로 구성된다.
각 바이트들은 특정한 가상주소를 가지고 있고, 규정된 사이즈 블록 단위로 분할하여 관리한다. 이 분할된 블록들을 가상페이지라 부른다.
(책 내용 775p)

위에 내용을 좀 더 풀어서 말하자면, 가상페이지라 불리는 일정한 크기의 블록들이 디스크에 저장된다. 그리고 이 가상페이지들은 특정한 가상주소를 가진다. 여기서 디스크는 보조기억장치를 뜻한다.

가상페이지는 3가지 status로 구분된다.
(status 라는 말은 올바르지 않을 수 있음)

  1. unallocated : VM 시스템에 아직 할당되지 않은 페이지들
  2. cached : 현재 물리 메모리에 캐시되어 할당된 페이지들
  3. uncached : 물리 메모리에 캐시되지 않은 할당된 페이지들

다시 이야기하자면, 가상메모리는 가상페이지의 블록으로 연속적으로 구성되어있고, 가상페이지는 물리적 메모리에 할당되어있으면 cached, 할당되어있지 않으면 uncached, 아예 가상메모리에 할당되지 않았으면 unallocated 이다.

그러면 가상페이지가 왜 물리 메모리에 적재되는지 궁금할 것이다.

애초에 프로세스들이 생성될 때, 가상 메모리에 필요한 프로세스들이 규정된 페이지크기 나뉘어 저장된다.
(A 라는 프로세스가 여러 가상페이지에 나뉘어 적재될 수도 있고, 한개의 페이지에 적재가 다 될수도 있다. 프로세스의 크기에 따라 다른 것이다. 왜냐하면 페이지는 규정된 사이즈로 일괄되어 나눠져 있기 때문이다.)

그리고 실제로 바로 cpu가 필요하거나 사용할 것 같은 프로세스들을 가상 메모리에서 물리 메모리에 복사하여 할당 시킨다.

그리고 cpu는 물리 메모리에 있는 페이지에 대한 내용으로 명령어를 실행하는 것이다. 물리 메모리에 위치 하지 않은 명령어는 실행 할 수 없다.

페이지 테이블

그러면 위에서 말했듯이 가상 메모리에 있는 가상페이지를 물리메모리에 복사하여 할당 시키는데, 가상메모리에 있는 가상페이지와 물리메모리에 있는 페이지를 매핑할 필요가 있다. (이유는 추후에 나옴)

그 매핑을 도와주는 역할이 페이지 테이블이다.
페이지 테이블은 메인 메모리에 위치한다.

페이지 테이블은 위에서 보이듯이, PTE(Page Table Entry)의 배열로 구성되어있다. 편의상 각 PTE는 한 개의 유효비트(vaild), n 비트에 주소필드로 구성된다고 가정하면, 유효비트는 해당 페이지가 물리 메모리에 cached 되어있는지 아닌지 확인 할 수 있다.
만약 vaild가 1이면 cached, 0이면 uncached 이다.
만약 vaild 라면 주소필드는 가상페이지가 캐시되어 대응되는 물리페이지 시작을 나타낸다.

profile
사진찍는 개발자 / 한 가지 개념이라도 깊이있게

0개의 댓글