컴퓨터 구조(14), Virtual Memory

2022. 6. 15. 23:33강의 내용 정리/컴퓨터구조

728x90
반응형

Virtual Memory


1. Virtual Memory

1) Motivation

- 하드웨어의 캐시

- 실제 여러 프로그램을 돌리기 위해 필요한 데이터는 메인메모리의 사이즈보다 훨씬 큰데 이를 해결해준다.

- 지금 당장 필요로 하는 액티브 포션만 들고, 나머지는 디스크에 둬서 동시에 사용할 수 있도록 돕는다.

- 로컬리티 법칙이 필요하다.

- 동시에 여러 프로그램을 돌리기 위해선 문제가 발생할 여지가 많다. 동일한 메모리 공간에 액세스할 때 충돌이 발생하는 것도 해결해준다.

- 메모리 공간을 충돌없이 사용할 수 있도록 돕는다.

- 각각의 프로그램을 프로텍트해준다.

- 비어있는 메모리 공간을 사용하도록 돕는다. 내가 사용한 저장공간을 동일한 프로그램을 실행한다고 해서 쓸 수 있는 것은 아니다.

 

- 어드레스 스페이스를 실제 피지컬 주소로 바꿔준다. 

- 여러 프로그램이 제한된 공간에서 충돌 없이 사용할 수 있도록 돕는다.

- 메인메모리보다 큰 사이즈의 프로그램을 사용할 수 있는 것도 돕는다.

- 메인메모리 1G, 프로그램 2G여도 사용 가능

 

 

- 데이터 저장하는 유닛을 페이지라 한다.

- 페이지의 크기는 1KB ~ 64KB로 둘 수 있다.

- 메모리가 크고 스파셜 로컬리티를 사용하려면 이를 늘릴수도있다.

- 메인메모리로 매핑하는 것이 없다면 page fault라고 한다. 이러면 하드 디스크에서 메인 메모리로 페이지를 로드하는 과정이 필요하다.

- 각각의 프로그램마다 버추얼 주소를 피지컬 주소로 매핑한다.

 

 

 

- 가상의 메모리 공간은 실제 메모리 공간보다 커도 된다.

- 피지컬 주소로 매핑한다.

- 피지컬 주소로 가지 않는 것은 디스크에 두어 사용한다.

 

 

 

- Page offset 내 데이터가 어디있는지 찾는 곳

- 블럭이 4kb이면 2의 12승인 12비트가 필요하다. 20비트는 버추얼 페이지 넘버이다.

- 버추어 메모리가 더 크다.

 

Design Choices

- 페이지 폴트가 나면 안된다. 폴트 시 100만 사이클이 더 필요할 수도 있다. 따라서 패널티가 매우 크다.

- 페이지가 충분히 커야한다. 스파셜 로컬리티도 사용한다.

- 정확도를 높이는 것이 매우 중요하기에 fully associative placement를 사용해야한다. 이는 소프트웨어가 사용한다. 

- write through는 할 수 없어서 write back을 한다.

 

- 변환 정보를 페이지 테이블이라고 한다. 이는 메인 메모리에 둔다.

- 페이지 테이블의 엔트리는 버추얼 테이블이 어디에 있는지이다.

- 페이지 테이블 레지스터에는 페이지 테이블이 시작하는 주소가 있다. 이것만 있으면 다시 프로그램을 실행할 수 있다.

- 프로세서 위에 올라가 있으면 액티브하다고 한다.

- OS에서 엑세스한다.

 

 

 

- 페이지 테이블이 어디 시작하는지는 페이지 테이블 레지스터에서 담고 있다.

- 2의 20승이 피지컬 페이지 숫자를 나타낸다.

- valid 0이면 폴트

- 두번에 걸쳐서 주소를 엑세스 한다.

 

- 페이지 테이블 계산 방법

 

 

TLB

- 두번 엑세스하는 것을 방지하기 위해서 또 쓸 것 같은 것을 캐시에 올린다.

- 메모리에 갈 필요가 없이 캐시에서 데이터를 찾을 수 있도록 도와준다.

 

 

Momory (Programmer's View)

- 원하는 데이터를 저장하고 이를 로드하는 것이 메모리이다.

 

Ideal Momory

- 이상적인 메모리는 필요한 데이터에 대해 바로 내주고, 무한한 데이터를 저장할 수 있는 것이다. 

- 여러 데이터를 한번에 전달받을 수도 있어야한다.

- 레이턴시랑 저장공간은 반대다.

 

 

프로그래머 관점에선 메모리에 대해 많은 고민을 하지 않아도 됐다.

- 이는 버추어 메모리 덕분이다.

- 실제로는 메모리가 훨씬 작다. 

- 시스템은 버추어 메모리 주소를 피지컬 메모리로 매핑한다. 프로그래머는 이를 고려하지 않는다.

- 프로그래머는 피지컬 메모리 주소를 몰라도 된다.

- 소프트웨어와 아키텍처가 복잡하게 이를 커버한다.

 

장점

- 프로세스는 버추어에서 피지컬로 매핑하는 것을 가진다. 이를 자동적으로 가져서 어디서든 존재할 수 있다.

- 우리가 사용하는 프로세스의 데이터가 물리적으로 모여있을 필요가 없다.

- 한정된 공간의 물리적 메모리를 필요에 따라 사용할 수 있게된다. 이에 따라 크게 메모리를 고려하지 않고 사용할 수 있다.

- 코드와 데이터가 쉐어링할 필요가 있다면 이를 쉐어링도 할 수 있게 해준다.

 

피지컬 메모리만 있다면?

- CPU가 메모리 공간으로 피지컬 주소로 바로 액세스한다.

- 버추어 메모리를 통하면 다이렉트하게 하지 않는다.

- 이에 따라 다음의 문제가 발생할 수 있다.

- 사이즈가 제한된다.

- 데이터 무브먼트에 대해 구현도 해줄 필요가 있다.

- 이에 따라 버추어 메모리를 사용한다.

- 직접 사용하면 프로그래머가 직접 매니징해야하고, 재할당도 어렵고, 서로 다른 프로세스를 사용하는 것과 데이터를 공유하는 것도 어렵다.

 

버추어 메모리

- 굉장히 큰 메모리를 가지고 있는 것처럼 해준다.

- 프로그래밍할 때 피지컬 메모리의 크기를 고려하지 않아도 된다.

 

베이직 메카니즘

- 인디렉션(addressing)을 통해 다른 공간으로 매핑한다. (트렌슬레이션도 필요하다.)

 

 

- 각 프로그램은 공간을 고려하지 않아도 된다.

- 매핑하는 과정에서 피지컬 어드레스 상에서 다른 곳으로 매핑해준다.

- 큰 메모리 공간이 있는 것처럼 도와준다.

 

- CPU가 페이지 테이블을 통해 엑세스한다.

- OS가 관리하는 룩업 테이블이다.

- 어디에 해당되는지 매핑해서 관리해준다.

- 피지컬한 데이터는 메모리에 있을수도 있고, 하드웨어에 있을수도 있다.

 

- 프로세스 1, 프로세스 2가 사용하는 공간이 다르다.

- 매핑되는 단위는 버추얼 페이지이다.

- 여러개의 프로세서에서도 공유해서 사용도 가능하다.

 

 

이슈

- 언제 매핑할지, 단위를 어떻게 할 것인지(커지면 스파셜 로컬리티 사용, 대신 엔트리 개수 감소), 어디에 저장할 것인지, 피지컬 어드레스가 꽉차면 어떻게 동작할지

 

 

버추어 페이지와 피지컬 프레임

- 페이지 단위로 데이터를 사용한다.

- 피지컬은 프레임이라한다.  여기가 꽉차면 디스크에 매핑한다.

- 만약 버추어 페이지가 메모리에 없다면 디스크에 있다. 이러한 경우에 디맨드 페이징이라 한다.

 

피지컬 메모리의 캐쉬

- 한번 미스나면 오래 걸릴 수 있어서 미스가 나면 안된다. 따라서 Fully-associative cache를 사용한다.

- 플레이스 먼트(데이터 어떻게 배치할지), 어떻게 배치할지, 페이지 크기, 쓰기 정책에 대해 정해야한다.

 

 

 

 

- 캐시랑 비교할 수 있다.

 

 

버추어 메모리 정의

- 페이지 사이즈: 물리적 주소로 변환하는 단위

- 페이지 테이블: 룩업 테이블

- 어드레스 번역: 피지컬 어드레스를 가상 메모리부터 얻는 과정

 

 

- 작은 사이즈로 갈수록 빠르고 커질수록 느리다.

 

- 캐시처럼 동작하기에 필요한 데이터를 올려준다.

 

 

주소 번역

- page offset: 4kb 단위로 할당하면 어디에 할당할지 정한다. 이는 똑같다.

- 피지컬 페이지 넘버는 버추어 페이지 넘버보다 작다.

 

예시

 

- 매핑을 위와 같이 한다.

 

 

예시2)

 

 

 

- 페이지 테이블 엔트리는 밸리드 비트가 있다.

- 버추얼 테이블에서 가지고 있는 데이터가 메모리에서 어떤 공간을 나타내는지 아닌지. 아니라면 하드디스크에 있다. 이는 피지컬 페이지 넘버이다. 최근에 썼는지 안썼는지, 더티 비트인지 등등을 의미한다.

 

PT

- PTBR: 프로세서마다 프로그램의 페이지 테이블의 시작점을 나타낸다.

- 버추어 주소를 주면 VPN과 PO가 존재한다. PO는 어떤 데이터를 찾는지 의미한다. VPN은 페이지 테이블에 엑세스해서 있으면 hit되고 이는 피지컬 어드레스로 바뀐다.

 

 

- 페이지 테이블 엔트리가 어디에 있는지 확인한다.

VPN은 5여서 시작점으로부터 5만큼 떨어진 장소에서 PPN을 찾는다.

- 밸리드 0이고 초기 상태이기에 아직 데이터를 올리지 않은 것이다. 따라서 이를 올려야한다.

 

 

 

- 페이지 테이블 넘버

- 64 bit VA, 40 bit PA인 경우

- VPN은 52비트이기에 2의 52개의 엔트리가 있고, 각 엔트리의 크기는 4바이트이다. 

- 이는 프로세스 하나에서 가지고 있는 페이지 테이블이고 프로세스마다 page table을 가지고 있다.

 

이슈

1. 페이지 테이블이 크다. 이에 따라 멀티 레벨로 만든다.

 

- 여러번 엑세스하도록 하여 시간은 오래걸리지만 공간은 아낄 수 있다.

- 공간을 나눈다. 

 

 

 

 

2. 두번의 메모리 엑세스가 필요하다. 이를 해결하기 위해 한번에 데이터를 엑세스할 수 있도록 캐시를 사용한다.

 

 

- 페이지 테이블 엔트리를 캐시한다.

- 작은 사이즈의 캐시여서 가장 최근에 정보를 담고 있는 캐시이다.

- 한번만 메모리에 엑세스하면 된다.

 

- 페이지 테이블은 로컬리티를 사용한다. 따라서 페이지 사이즈를 큰 것을 사용한다. 이는 스파셜 로컬리티로 효율을 올리기 위함이다.

- TLB는 페이지 테이블 엔트리의 캐시이다. 빠르면 1사이클이 걸린다.

- 캐시를 L1, L2로 모두 둔다.

- 높은 어소시에이티브를 둔다.

- 메모리 엑세스는 최근에 쓴 것을 기준으로 한다.

 

- 있다면 hit하고 Physical  page number를 받아온다.

- TLB는 트렌슬레이션과 관련된 캐시이다.

- TLB에도 다 적용이 된다.

- 여러 이슈가 있다.

- 어떤 의미가 있는지 이해하면 된다.

 

- VPN이 있으면 TLB에 먼저 보고, 없으면 PT에 가서 확인한다. valid가 0이면 디스크에서 가져온다.

 

 

 

- VM이 성공적으로 돌아가기 위해선 하드웨어와 소프트웨어가 지원해야한다.

- MMU: 하드웨어에서 메모리를 관리하기 위한 유닛 TLB, PTBR이런게 포함된다.

- 하드웨어로 하기 어려우니 소프트웨어로 다이나믹하게 처리한다. 미스나면 패널티가 너무 크기에 느려도 그냥 사용한다. 

 

- 페이지 사이즈가 커지면 스파셜 로컬리티는 높지만 엔트리가 적어진다. 

 

- 태그 스토어이다.

- 더티비트, 밸리드 비트 등이 있다.

 

Address translation

- 프로세스마다 페이지 테이블을 구분해서 가진다.

- 버추어 페이지 넘버가 가지고 있는 것은 어디에 엑세스할지를 정한다.

 

 

- 프로세서가 VA를 MMU에 준다. MMU에서는 페이지 테이블 엔트리를 패치해서 피지컬 어드레스를 받아온다. hit이면 CPU에게 준다.

 

- 페이지 폴트면 익셉션이 돌아가서 디스크에서 이를 가져온다.

- 폴트 이후 핸들링을 하면 디스크에 있는 정보를 가져온다.

728x90
반응형