Overlay vs Virtual Memory
Overlay
프로그램의 실행간에 메모리 관리를 프로그램이 직접한다.
어떤 데이터는 필요 없으니까 메모리에서 지우고, 필요한 데이터는 메모리로 가져오면서 필요한 부분씩 쪼개서 실행하는것.
게임이라면 게임이 메모리 관리를 직접하는데, 직접하게 만들기 위해선 프로그래머가 직접 개발 당시에 코딩한다.
게임을 만들 때 프로그래머가 직접 설계한다.
운영체제가 메모리 관리를 하지 않는다
Virtual Memory
프로그래머가 메모리 관리를 하지 않고 운영체제가 한다.
운영체제가 알아서 어떤 부분을 가져오고, 지운다.
하지만 한계점이 존재한다.
성능상의 최적화가 안될 수 있고 제대로 동작하지 않으면 성능이 안좋을 수 있다.
MMU(Memory Management Unit): CPU 패키지 내의가상주소를 물리주소로 변환하는 장치
CPU패키지 내의 MMU는 CPU에게 가상주소를 전달받아 실제주소로 변환 후 버스로 내보낸다.
실제 메모리는 48kb지만 가상메모리를 합쳐서 100kb라면 48kb까지의 주소는 실제주소, 48이후의 주소를 가상주소라고 한다.
주소변환
가상주소와 실제 메모리의 위치는 달라도 된다. 연속적이지 않던 메모리가 연속적이게되도 상관없다.
실제메모리 16, 20번지에는 각각 2와 5라는 숫자형 데이터가 들어있다.
Load R2, 16
Load R3, 24
Add R4, R2, R3 를 하게 된다면?
R2레지스터에 주소 16의 메모리의 값을 가져오는데, 16번 메모리의 실제주소는 20번이며, 값은 5이다. R2레지스터에 5를 가져온다.
R3레지스터에 주소 24의 메모리의 값을 가져오는데, 24번 메모리의 싲레주소는 32번이며, 값은 12다. R3레지스터에 12를 가져온다.
R4레지스터에 R2, R3값을 더해서 저장하게 된다. 결국 5 + 12 = 17이 저장되게 된다.
이처럼 주소 변환에 가상 주소 공간에서 실제 주소 공간으로 매핑되는 시간이 추가되게된다.
메모리를 참조하는 모든 명령어에서 주소 변환 시간이 추가되게 되며, 주소변환은 명령어를 실행할 때 가상주소가 실제주소로 전환된다.
이런 매핑은 빠르게 일어나야 한다. 또한 프로그래머는 가상주소만 볼 수 있다.
주소 변환
1. 변환 테이블
가상 메모리의 공간과 실제 메모리의 공간의 주소를 변환테이블로 유지시키는 방법이다.
문제점
1. 테이블의 크기가 커진다. 가상메모리가 1mb일 경우 변환테이블은 2mb가 필요하다.
가상메모리 1mb의 주소, 실제 메모리 1mb의 주소를 한 테이블에 넣어야 하기 때문이다.
2. 시간이 오래걸린다. 가상 메모리의 주소가 도착했을경우 변환 테이블에서 해당하는 가상메모리 값을 찾아야하기 때문이다.
2. Paging
Page: 가상 메모리에서 변환의 단위. 1page는 가상메모리 시스템에 따라 다를 수 있는데 보통 1kb ~ 4kb ~ 16kb 단위로 매핑 정보를 유지한다.
Page frame: 페이지 크기와 동일한 크기인데, 페이지가 가상 메모리쪽의 단위라고 하면 page framee은 실제 메모리 쪽의 나누어져 있는 단위.
page 단위로 매핑하는 것을 paging이라고 한다.
Mapping
가상 주소의 page# 1, offset 4는 page#1 시작부분의 4만큼 떨어져 있는 공간을 의미한다.
실제주소로 매핑해도 page#4, offset 4로 변환된다. offset은 변하지 않고 page#만 변화한다.
예제
32-bit logical address
page size = 4KB
페이징을 사용할 때:
한 페이지의 offset 크기(bit): 페이지 크기가 2의 몇승인지 = 4KB = 4 * 1024 = 2^2 * 2^10 = 2^12 -> 12bit
가상 주소에서 page number 크기(bit): 주소의 크기 - offset의 크기 = 32 - 12 = 20bit
가상 주소 공간의 크기: 2의 ^총 비트(bit)의 수 = 2^32 = 2^2 * 2^20 -> 4GB
128MB의 실제 메모리에서 page frame 개수=
Direct Mapping
page#를 page frame으로 변환하는 기법이다.
Direct인 이유는 page#가 바로 인덱스 역할을 하기 때문이다.
아래의 16bit길이의 주소가 있다. 이 16bit의 주소 중 앞 4bit는 page#이고, 뒤의 12bit는 offset을 의미한다. 또, Present/Abset bit는 실제 메모리에 공간이 존재 하는지, 안하는지를 구분한다.
위의 주소에서 page#인 0010은 2를 뜻한다. 이는 page table에서 2번째 index에 위치한 110을 가리킨다. 또한 present/absent bit가 1이므로 실제 메모리에 존재한다. 그러므로 page#는 page frame으로 변환되어 110으로 변환되고, 페이징 기법에서 offset은 변하지 않기 때문에 유지되어 주소 변환이 이루어 진다.
또한 page#는 4bit이지만, 실제 메모리는 3bit로 이루어져 있다. 즉 2^4만큼의 가상메모리 중 2^3만큼이 실제 메모리에 존재한다는 뜻이다. 또한 한개의 page의 offset이 12bit이므로 한 개의 페이지는 2^2 * 2^10 = 4KB 이다. 즉 가상메모리는 4KB짜리의 page들이 16개 존재한다.
Direct Mapping은 매핑이 O(1)의 속도가 필요하므로 매우 빠르게 이루어 진다. 단지 인덱스가 주어지고 해당 인덱스에 곧바로 접근하면 되기 때문이다. 하지만 실제로 존재하지 않는 장소(Present/Absent)를 테이블상에 유지시켜야 한다는 단점도 존재한다.
가상 주소를 물리 주소로 변환 = 하드웨어
페이지 테이블을 관리 = 운영체제
페이지 테이블의 위치 = CPU(direct mapping 방식을 사용하면 page table이 크기 때문에 main memory에 위치하게 될 수 있다.)
페이지 테이블 엔트리 구조
Refrenced/modified 참조 되었는지, 수정 되었는지를 나타냄.
Present/Absent 가상 메모리의 공간이 실제 메모리에도 존재 하는지 나타냄. 0인경우 해당 페이지의 주소가 메모리가 아닌 디스크에 존재.
페이지 부재
페이지 부재(Page Fault)- 페이지가 없어서 발생하는 예외상황. Direct Mapping에서 present/absent bit이 0인경우. 실제 메모리에 없는 가상 메모리 주소를 엑세스 하게 되는 경우
absent bit이 0인 가상 메모리를 엑세스하게 된다면 가상 메모리가 실제 메모리를 전부 점유하고 있다면 가장 적에 엑세스하는 실제 메모리에서 가상 메모리를 떼어내고 디스크에 저장 후 absent bit이 0인 가상 메모리를 실제 메모리와 연결시켜 준다.
후에 최소 1번 최대 2번 디스크 작업이 진행된다. 메모리의 정보가 변경되었다면 디스크에도 같은 정보를 저장해야하기 때문이다.
그리고 주소 변환 정보를 만들고, 페이지 테이블에 새로 생긴 변환 정보를 넣는다.
연관사상(Associative Mapping)
연관 사상은 어떤 정보를 액세스 할 때 인덱스를 가지고 하는게 아니다.
찾아갈 위치가 어딘지 미리 알지 못 하며 변환 정보를 찾아야 하는데, 그림처럼 하나하나 다 확인해 본다. 이는 하드웨어적으로 병렬처리를 해서 한번에 찾는데 한 스택이면 찾을 수 있다. 이는 Associatimg memory라는 장치가 한다.
associative page map table에는 테이블 상의 page#와 대응되는 실제 메모리의 p프라임이 들어있는데 p값이 들어있는 엔트리를 찾아서 p프라임을 실제 메모리로 가져와서 사용한다.
TLBs - Translation Lookaside Buffers(변환 색인 버퍼)
가상 테이블 번호가 129번일 경우 테이블에서 129를 찾아서 실제 메모리의 페이지 넘버는 62로 변환된다.
Protection - 접근 권한에 대해 갖고있는 정보
Modified - 해당 페이지가 수정된 일이 있는지 나타냄
Valid - 각 테이블 엔트리가 유효한지, 아닌지를 나타냄. 부팅 시에는 초기 쓰레기 값이 들어있어서 0이 되는데, 유효한 값을 집어넣으면 1로 바뀜(운영체제가 담당) valid가 0이 될때는 부팅될때, 문맥 교환이 일어날때이다.
TLB는 MemoryManagementUnit에 들어있다.
만약 찾는 페이지 번호가 없을 경우 TLB miss, 찾았을 경우엔 TLB hit
TLB miss가 일어나도 처리는 해주어야 한다. 하지만 속도가 느려진다.
TLB Mapping
TLB miss가 일어나면 다이렉트 매핑으로 주소를 찾아온다. 다이렉트 매핑은 테이블의 크기가 커서 메인메모리 또는 디스크에 들어있는데 이는 캐시메모리에 비해 속도가 느리므로 시간이 TLB hit보다 시간이 더 걸린다.
다이렉트 매핑으로 주소를 찾아오면 찾아온 주소를 돌려주고, TLB 테이블에 추가한다. 다음 시도때 miss가 발생하지 않기 위함이다.(운영체제가 담당)
TLB hit의 경우 빠르게 주소를 찾을 수 있는데 hit의 경우 하드웨어적인 성공이다.
ALU: 산술 논리 연산 장치
검정선: 데이터 버스
빨간선: 주소 버스
ALU를 기준으로 왼쪽 빨간선엔 offset 12bit가 지나다니고 오른쪽엔 page# 20bit가 지나다닌다.
ALU에서 가상주소가 나와서 실제주소로 바뀌어서 메모리로 가야 하는데 과정 중간에 TLB가 있는것이다.
paging기법에서 offset은 매핑이 일어나도 변하지 않는다. 하지만 page#은 변환이 필요하기 때문에 tlb를 거쳐서 메모리로 간다. TLB의 동작속도는 1clock정도로 매우 빠르다. 또한 캐시로 들어가는 것도 실제 주소다. 메인 메모리처럼 캐시도 실제 주소를 접근한다. 하지만 캐시는 경우에 따라서 가상주소가 접근되게 설계할 수 있다.