Kim Seon Deok

[컴퓨터 구조] 5-3. Virtual memory 본문

컴퓨터 구조

[컴퓨터 구조] 5-3. Virtual memory

seondeok 2022. 11. 17. 18:45




Virtual machine이란 Java VM같이 표준 소프트웨어 인터페이스를 제공하는 모든 에뮬레이션 방법들을 포함한다.
operating system virtual machine(운영체제 가상머신) : 실제 하드웨어와 같은 ISA를 실행하는 가상머신
컴퓨터시스템은 한번에 여러 프로그램을 동시에 수행하므로 메모리는 복잡해 질 수 있다. 따라서 기계에 필요로 하는 메모리의 총 용량은 각각의 프로그램이 요구하는 메모리의 총합보다 커야한다.
가상머신을 이용하면 여러 개의 운영체제가 하드웨어 자원을 공유할 수 있다.

Virtual Memory
메인메모리를 2차 저장장치의 캐시로 사용하는 기술
메인 메모리보다 큰 프로그램을 저장하는 장소를 하드디스크라 한다.

메인 메모리를 하드디스크에 대한 캐시처럼 사용
메인메모리의 자주 사용하는 부분을 캐시에다 매핑시켰던 것처럼,
가상으로 큰 메모리를 하드디스크에 잡아두고, 자주 사용하는 부분을 실제 메모리(=메인메모리)로 가져다놓은 모습이다.
문제점 : 어떤 메모리주소번지를 fetch해서 가져와 실행하려 하는 부분이 메인메모리에 없을 수 있다.

프로그램이 fetch 사이클을 돌려면 가상메모리의 번지를 사용할 수 없다.
가상메모리의 번지를 실제 메인메모리에 맞게 translation 해주어야 한다. 100 → 1000
하지만 translation해주고 난 다음 사이클에서 문제가 발생한다. 그 다음 가상메모리 번지 101을 읽어와야 하는데, 가상메모리 중 사용할 부분만 메인메모리로 옮겨왔기 때문에, 101번지가 담겨있는 실제 메인메모리 위치가 없다.

캐시메모리는 메인메모리 중 사용하는 부분만 가져온 것인데, cpu에서 액세스 하고자 할 때 특정 인텍스에 해당하는 data가 캐시에 만약에 없다면 miss가 발생하므로 stall한 후 메인메모리로 가서 해당 data를 가져왔었다.

이 상황과 유사한 상황이다. 따라서 stall한 후 필요한 내용을 하드디스크로부터 메인메모리로 가져와야 한다.
cpu는 메인메모리로 무언가를 read해오고(Load), write back해서 무언가를 메인메모리로 가져다 놓는 것(Store)을 컨트롤하는 역할을 한다. 따라서 캐시를 컨트롤 하는 것은 cpu였다.

하지만 cpu는 하드디스크에 있는 내용을 메인 메모리로 가져오도록 컨트롤 할 수 없다.
하드디스크는 하드디스크용 입출력 드라이버가 있고 하드디스크 입출력에 해당되는 프로그램을 돌아야 동작이 가능하다.
따라서 운영체제의 역할이 필요하다. → cpu와 운영체제가 상호적으로 작용해 하드디스크에 있는 메모리 주소로부터 실제 메모리 사이로 interface하는 것을 해결해주어야 한다.

cpu : 가상메모리에서 프로그램이 돌아가도록 책임짐 & 가상메모리 주소번지를 실제메모리주소번지로 translate
os : 해당주소번지가 실제 메모리에 없을 때 page교환

프로그램 A,B 에 각각 0 ~ 10000번지를 똑같이 부여된 상황이다.
각각의 프로그램은 메인메모리 안에서 동시에 수행되는데, 각각의 프로그램은 개별적인 virtual address space를 가지고 돌아간다.
OS의 superuser만 이 주소를 00, 01로 구분해서 액세스 할 수 있다.
superuser가 아닌 형태의 개별 프로그램은 각자의 주소영역을 침해하지 못하도록 관리해 각 프로그램 내부에서는 해당프로그램의 주소만 볼 수 있다.
따라서 각 소프트웨어는 자기에게 주어진 가상주소번지 내에서 프로그램을 실행하고. cpu는 가상메모리 주소를 실제 메모리 주소로 변환해야 한다.


하드디스크는 액세스 타임이 느리기 때문에 하드디스크에서 메인메모리로 가져오는 메모리의 양을 바이트 단워가 아닌 page단위로 늘린다.
한번에 가져오는 단위를 4바이트 단위가 아니라 4k바이트 단위로 증가시킨 형태를 1 page라 한다.
캐시라인은 실제 메모리의 word size 몇 개를 합친 블럭형태로 관리한다.


램의 용량과 컴퓨터 속도는 관계가 없다. 하지만 램의 용량이 늘어나면 램에 갖다놓을 수 있는 데이터 양이 증가하므로 하드디스크에서 읽어야 될 양이 줄어든다. 동시에 가져올 수 있는 page 수 증가. 수행 성능 증가

virtual memory의 일부만큼을 실제 physical memory에 올려서 수행하면 실제 메모리보다 훨씬 더 큰 메모리용량을 사용하는 효과를 얻을 수 있다.
프로세서는 가상메모리 주소를 만들어내는 반면, 메모리는 실제주소를 사용하여 접근된다. 가상메모리와 메인 메모리 모두 page단위로 나누어져 있어서 가상페이지가 실제 페이지로 매핑된다.
가상메모리의 페이지가 메인 메모리에 없어 실제주소로 매핑될 수 없을 경우, 이 페이지는 디스크에 있다. 2개의 가상주소가 같은 실제 주소를 가리키도록함으로써 실제 페이지를 공유할 수 있다.

하드디스크에 있는 4G바이트의(=32비트) virtual address를 메인메모리에 있는 1G바이트의(=30비트) physical address translation하는 상황
1. page offset : virtual address를 physical address로 바꿀 때 하위 12비트는 바꾸어 줄 필요가 없기 때문에 그대로 copy
2. 은 virtual address 20비트(=virtual page number)를 남은 physical address 18비트(=physical page number)로 translation
os를 이용해 virtual address의 상위 20비트를 physical address의 상위 18비트로 translation한다.




Byte offset & Page offset
이전 direct mapped cache에서 프로세서가 메모리를 액세스하려 하는 과정(프로세서 ↔ 캐시 ↔ 메인메모리)에서,
메모리주소가 바이트단위주소형태일 때, 4바이트 명령어 기준으로

Tag(20비트) Index(10비트) Byte offset(2비트)

로 나누어, byte offset해주고 해당 index로 찾아가 tag를 비교하여 hit/miss를 판별했었다.


4바이트 명령어(=32비트 명령어)는 한 블록이 4바이트이므로 각 자릿수마다 메모리번지수를 이진화하면 하위 2비트
(4 = 2^2)가 00,01,10,11으로 반복된다. 따라서 굳이 반복되는 하위 2비트를 사용할 필요가 없다.

word address = byte address - byte offset
바이트 수 = 캐시 한 블록 크기 = 메모리 한 블록 크기
offset비트 = log2(바이트수)

4k바이트 명령어(=4096비트 명령어)는 한 블록이 4k바이트이므로 각 자릿수마다 메모리번지수를 이진화하면 하위 12비트가 (4096 = 2^12) 000000000000 ~ 111111111111까지 반복된다. 따라서 굳이 반복되는 하위 12비트를 사용할 필요가 없다.

8바이트 명령어(= 64비트 명령어)는 한 블록이 8바이트이므로 각 자릿수마다 메모리번지수를 이진화하면 하위 8비트가 (8=2^3)000~111까지 반복된다. 따라서 굳이 반복되는 하위 3비트를 사용할 필요가 없다.

16바이트 명령어(=128비트 명령어)는 한 블록이 16바이트이므로 각 자릿수마다 메모리번지수를 이진화하면 하위 4비트가(16=2^4)0000~1111까지 반복된다. 따라서 굳이 반복되는 하위 4비트를 사용할 필요가 없다.

캐시 한 블록 크기 offset 비트
16 4
32 5
64 6
128 7
256 8
512 9
1024 = 1k 10
2048 = 2k 11
4096 = 4k 12









Comments