[컴퓨터구조]가상 메모리(Virtual memory)
가상메모리란?
각 프로그램에 실제 주소가 아닌 가상의 주소를 주는 것, 주기억장치(DRAM)보다 큰 용량을 사용하고자 할 때 이용한다.
DRAM과 HDD간의 requirement
1. 이전 게시글을 참고하면, 캐시의 속도와 메인메모리(DRAM)의 용량을 한번에 가지고 싶기에, 우리는 locality를 사용했다.
이와 같이, 가상메모리를 이용해 메인메모리(DRAM)의 속도와 하드디스크의 용량의 장점을 모두 이용한다.
2. 여러개의 프로세서 간의 메모리를 공유한다. 하지만, 서로 데이터를 read하거나 write하지 않도록 만들어 protection을 제공한다.
3.주소 공간(Address space) - 각 프로그램이 전체 메모리를 다쓰고 있는 것처럼 보이게 한다.
어떻게 ? 가상메모리를 이용한다.
왜? 단순성을 위해서 (complier, linker,loader가 전체 메모리를 다쓸 수 있을 것이라고 가정하고 메모리를 사용한다-이래야 간단해짐)
가상메모리의 기능
CPU에 가상주소로 data를 저장하고 읽어온다.
가상 주소와 물리적 주소를 mapping한다.
가상 메모리
- 두개의 저장소를 이용한다 (메인 메모리, 하드디스크)
- 메인 메모리와 하드디스크 사이의 관계를 관장하는 것은 OS이다. (메모리를 공유하고, 서로의 프로그램을 R/W로 부터 보호함)
- 요즘, 가상메모리를 이용하는 이유는 다른 메모리 계층을 사용하려는 것보다 protection이 크다.
- protection을 이용함으로써, 각 process는 모든 메모리 공간을 독점한 것 처럼 이용한다.
- 원래 캐시보다 가상메모리가 더 먼저 등장했다.
- 가상메모리 주소 vs 물리적 메모리 주소
- 가상 메모리는 프로그래머가 쓰는 주소 공간이다. 가상주소는 process의 address space에 담겨있다.
- 물리적 메모리 주소는 실제 주소이다. 하드웨어가 실제 접근(Access)하는 주소
-메모리 주소가 들어오면, memory translation에 의해 물리적 메모리에 매핑(mapping)된다.
Addressable memory address vs Physical memory address
예시)컴퓨터에서 4GB를 이용할 수 있는데, 실제 물리적 메모리 크기는 128MB ~ 1GB이다.
물리적 메모리 주소 = 128MB ~ 1GB 인데, 가상 메모리가 4GB인것처럼 만들어준다.
가상 메모리는 되게 큰 메모리로 보이는 공간을 제공한다.
- 모든 process의 메모리 이용 합 > 물리적 메모리 공간
- 각 process의 주소 공간 > 물리적 메모리 공간
multi-processing으로 메모리 관리하기
- multi-processing 은 하나의 cpu안에서 여러개의 프로그램을 한번에 동작시키는 것을 말한다. ( 여러 개의 process 한번에 동작 )
- 각각의 프로그램은 혼자 시스템을 사용하는 것 처럼 가상메모리를 이용해 작동한다.
가상 메모리 매핑
1. 프로세서가 메모리로 가상 주소를 보낸다. (소프트웨어에서 사용하는 주소는 가상주소이다)
2. 가상 주소 테이블에서 물리적 주소 테이블로 매핑한다.
3. 가상 주소 테이블이 더 크기 때문에 매핑되지 못하는 주소가 있고, 이는 하드디스크로 들어간다. (하드디스크 크기가 굉장히 크기 때문, 이를 통해 굉장히 큰 크기의 메모리를 사용해도 되는 것 처럼 보임)
4.processor의 가상 주소 중, 물리적 주소에 매핑되지 못한 주소를 가리 키는 것 ▷ miss
miss가 났을 때 대처법
1. miss가 난 부분에 해당하는 HDD data를 찾는다.
2. data를 물리적 메모리 주소 중 빈곳에 넣는다.
3. 물리적 메모리 주소 중 빈칸이 없다면, replacement 정책을 사용한다 (LRU)
4.replace되는 물리적 주소의 데이터를 하드디스크로 복사하고, 새로운 data를 덮어쓴다.
5. virtual mapping table update
+서로 다른 가상 주소가 같은 물리적 주소를 가리킬 수 있음 (같은 곳 공유)
+process 마다 테이블을 따로 둬서 매핑이 중복되지 않게 할수도 있음
Address translation
1. 프로그램은 가상 주소를 사용한다.
장점: relocation이 용이함 (= 만약 어떤 프로그램이 0-200번지를 사용할때 또다른 프로그램이 100번지를 사용하고자 하는 것은 불가능하다. 하지만 이 주소가 가상 주소라면 매핑 테이블을 변경해, 메인 메모리 어디든지 이용할 수 있다.)
2.하드웨어가 가상주소 -> 물리적 주소 매핑을 도와준다.
- OS 는 매핑 방법을 정함
- OS가 매핑 방법을 정하면 하드웨어에서 빠르게 매핑한다.
- 각 프로세스마다 주소 변환 테이블이 필요하다.
주소 변환 과정
1. 가상 메모리 주소를 보냄
2. 가상 메모리를 물리적 메모리 주소로 변환 (Address Translation)
3. 만약 Hit가 나면, 유효한 물리적 메모리 주소로 메인 메모리에 접근해 원하는 데이터를 가져옴
4. 만약 miss가 나면, OS가 fault를 소프트웨어적으로 해결한다, 즉 , 가상 주소를 하드디스크에 저장하고 메인 메모리에 접근한다.
5. 모든 것은 페이지 테이블에 저장을 해둔다.
Pages
: 가상 메모리 block
- 가상 주소(virtual address) : virtual page number + page offset
- 물리적 주소(physical address) : physical page number + page offset
가상 주소를 물리적 주소로 바꾼다는 것은 virtual page number 을 physical page number로 바꾸는 것을 의미한다.
page fault : 가상 메모리 miss
-원하는 데이터가 메모리에 없고 DISK에 들어있을 때
-page fault를 줄이기 위해 replacement policy로 LRU를 이용한다.(덜 쓰는 메모리를 삭제하고 새로운 것 가져오기)
-cache miss 면 hw가 이를 해결하는데, page fault이면 sw가 이를 해결한다.
-write-through는 너무 비용이 크기 때문에 write back을 사용한다.(HDD를 매번 업데이트 하는 것은 너무 비효율적이다.가급적 피하기)
segmentation
◐ 물리적 주소 = segment number + segment offset
◐ segment 길이는 가변적이다. (=여러개의 page)
◐ 장점 : protection이 정교해지고 주소 공간 공유기능(sharing)이 좋아진다.
◐ 단점 : segment길이가 가변적이라서 segment의 범위를 매번 체크하면 시간이 오래걸리고 오버헤드가 커진다.
◐ page방법과 반대
Page tables : 페이지 변환을 해주는 것 (가상 주소 -> 물리적 주소)
1. 가상 주소안에 virtual page number 가 존재한다.
2. virtual page number가 page table에서 index의 역할을 한다.
3. physical memory와 매핑되지 않은 주소는 하드디스크의 주소를 가진다. -> 하드디스크의 주소는 여러개의 숫자로 이루어져있다.(track,sector,Disk)
그런데, virtual address를 실제 메모리를 가르키는 주소로 변환하려면 translation table을 찾아야한다.
하지만 translation table은 메인 메모리에 들어있다.
메인 메모리를 가리키는 주소를 찾아야하는데, 그러려면 메인 메모리 안을 뒤져야한다. (이거 완전 모순아니야?)
하지만, 우리에겐 page table 위치를 가리키는 PTR 이 존재하지! 이건 메모리 안에들어있는 page table의 시작 주소를 알려준다.
-각각의 프로그램이 page table을 가진다.
1.page table register로 page table을 가리킨다. (PTR + virtual page number = 우리가 찾는 물리적 주소)
2.해당 page table에 있는 값을 physical page number로 사용하고 page offset은 그대로 아래로 내린다.
More bits of page table entries
page table에는 valid 와 physical page number을 제외하고도 referene bits 와 dirty bits가 있다.
Reference bits : LRU를 위해 존재한다.
- 주기적 시간에 그 주소를 reference했으면 reference bit = 1, 아니면 0으로 설정한다.
- 주기적으로 0으로 초기화한다.
- 결국, reference bit가 0이면 오래된 bit라고 판단해 메모리가 꽉차있으면 삭제될 확률이 높다.
Dirty bits
- 만약, 메모리가 꽉차고 reference=0인경우 page를 HDD로 버려야한다.
- page를 HDD로 내보낼 때 Dirty bit =1, 아니면 =0인지 확인한다.
- 만일 dirty=1이면 데이터 수정 시 반드시 해당 내용을 HDD에 적어야한다.
- 만익 dirty=0이면 데이터 수정 시 내용을 복사할 필요가 없다.
Why need PA for the cache?
CPU 에서 VA를 보내주고 cache hit면 그 cache를 쓰고, cache miss면 PA를 쓰는 방식이 어떤가?
¶ 장점
평소의 캐시 접근에는 address translation이 안쓰인다. (address translation은 메모리에 있기 때문에 매번 접근하면 효율적이지 않다.)
캐시 miss일 때만 translation이 필요하다.
¶ 단점
synonym problem : 다른 VA였는데 translation 후, 같은 PA를 가진다는 것을 알게되는 경우가 있다. Read는 상관없는데 Write를 하면 오류가 생긴다.
nightmare for update : 같은 물리적 주소를 가질 수 있는 VA가 있기 때문에, 모든 캐시 entry를 업데이트 해야한다. 업데이트가 쉽지 않다.
☞ memory translation으로 물리적 주소를 얻고 그 주소로 캐시에 접근하는 것이 좋다.
VA로 캐시에 접근하면 위와 같은 문제가 생기기 때문에 실제로 PA로 번역한 후 , 캐시에 접근한다.
그런데, translation을 하려면 main memory에 접근해야한다. 그러면 어차피 메인 메모리에 접근하는건데, 캐시를 중간에 쓰는 이유가 사라진다.
이러한 이유로, translation도 캐시처럼 이용한다.(=TLB)
TLB(Translation Lookaside Buffer)
주소 번역을 위한 특별한 캐시
1. VA를 TLB로 보낸다.
2.TLB에서 hit가 나면 물리적주소로 매핑한다.
3.miss가나면 page table로 이동해 해당 주소의 값을 TLB로 가져온다.
4.만약 page fault가 나면 디스크의 데이터를 물리적 메모리에 저장하고 page table이 이 주소를 가르키도록 한다.
5.page update -> TLB업데이트
6.page fault가 아닌경우 TLB만 업데이트
temporal locality로 한번 가져온 데이터를 자주 사용할 확률이 높기에, TLB에서 거의 히트가 난다.
TLB entry structure
-Virtual page # 를 모두 받는 것이니, fully associative 이다.
-TLB에 넣으면, virtual page #으로 해당 주소가 있는지 확인한다.
-TLB miss가 일어나면, virtual page #과 physical page#은 변하지 않지만, Dirty bit(write 여부), reference bit(접근 여부)은 바뀔 수 있다.
-그러므로, TLB miss가 일어나면 대체되기 전에 Dirth,Ref,Valid bit값은 copy back으로 복사하여 저장해놓아야 한다.
가상주소, 캐시, TLB한번에 생각해보기
1. CPU가 가상주소를 TLB에 보내줌
2.TLB에 해당 주소가 있으면, PA로 번역하고 PA주소를 캐시로 보낸다.
3. 그렇게 해서 캐시hit가 나면 그 데이터를 CPU로 보내줌~
4.근데, TLB에서 해당 주소가 없으면(miss), page table을 이용해 TLB에 매핑정보를 가져다 놓는다.
5.TLB미스를 해결해도, 캐시에서 miss가 날 수도있다.
6.PA로 메인메모리에서 캐시로 데이터를 가지고 온다
최악인 경우: TLB miss가나서 page table에서 새로운 매핑 정보를 가져오려했는데, 해당 page table의 valid=0이라서 page fault가 난 경우 ☞ 하드디스크에 접근해야됨(OS가 한다. CPU에 인터럽트 건다.)
하드디스크에서 해당 데이터를 읽어서 메인 메모리를 업데이트하고, 그 메인메모리에 대한 매핑정보를 page table에 업데이트해야한다. 그리고 page table의 정보를 TLB에 써주고 다시 access 시도한다. 이제 translation은 성공했고 PA를 가지고 캐시에 접근하면 캐시도 없기 때문에 해당 정보를 메인 메모리에서 가져와야 한다. 그리고 다시 access하면 성공^^~
TLB는 fully associative, cache는 direct-mapped