Search

Virtual Memory

메인메모리를 hdd의 캐시로 쓰는 기술
메모리간의 효율적이고 안전한 공유를 가능하도록 한다.
코어별로 다른 프로그램을 실행할 수 있다. 물리적으로 메인 메모리는 하나밖에 없다
메인 메모리를 공유해야한다. 프로그램 입장에서는 다쓰고싶은데?
가상으로 다 쓴다고 생각하고 사용하는 방법이 virtual memory
메모리를 가짜로 만들어준다. 그리고 프로그램든 간에는 공유하지 않는다
physical memory에서는 공유를 한다
cpu와 os는 가상주소를 실제주소로 translate할 필요가 있다
캐시의 블록을 vm에서는 page라고 하고 cache miss를 vm에서는 page fault라고 한다
캐시는 프로세서와 메인메모리 사이의 memory hierarchy최상위
프로그램마다 가상의 주소공간 할당
physical memory는 캐시 메인메모리 등 포함이다
프로그램들끼리는 share안하지만 physical memory에서는 share하고있다
마치 하나의 프로그램이 전체 메모리를 쓰고있는것처럼 해준다
flexible하고 안전하게 메모리를 사용할 수 있는 기술
cache에서 block이 page, cache miss를 page fault라고 한다
block ⇒ multiword
m = block offset
블록은 word 여러개 있는 단위
page는 multi block이다 block이 모인것
페이지는 블록보다 훨씬 크다 그러니까
가상에서 physical로 연결이 된다
virtyal address하나는 line이 하나밖에 없다 single-mapping
피지컬은 여러개의 virtual address에 매핑이 되어도 된다 즉 공유한다
virtual address가 항상 physical address에 존재하는것은 아니다 disk address를 가리키고 있을수도 있음
virtual memory를 어떤 방식으로 매핑할까?
page size = 4kib
0~11까지 page offset
block offset에서는 00이고 single word면 m은 없었고 그것들을 offset이라고 했는데
page offset에서도 00이고 10개 비트. 훨씬 많은 word를 가지고 있다
사이즈 자체가 블락이랑 page랑 다르다
physical offset변환할때 page offset은 그대로 내려오고 virtual page number는 translation을 거쳐서 physicla page number로 번역됨
page가 fault나면 아랫단계에서 가져와야한다 disk에서
디스크는 아주 느려서 수백만의 clock cycle이 낭비됨. os에서 핸들링해줌
page fault rate을 최소화하는게 중요함
fully associative placement
n-way set associative = n을 max로 보내면 fully가 된다
fully가 좋긴한데 문제는 comparator가 하나하나 다 있어야한다 그래서 비싸다
write back system ⇒ write buffer내장하고 있음
smart replacement algoritm 소프트웨어적으로 replace를 잘 하는것 근데 배우진 않는다

Page table

placement information저장하고 있는 테이블
페이지 테이블 ⇒ translation에 쓰임
virtual을 physical로 바꾸는 과정
virtual page number마다 page table에 매핑되어있음
virtual page number비트수만큼 페이지 테이블도 존재해야한다
2의 20승개만큼의 페이지 테이블 엔트리
page table register 피지컬 메모리에 있는 starting address를 가리키고 있다
레지스터 = special location in processor
page테이블도 physical memory에 있다 메인 메모리에 있다 = 프로세서 외부에 있다
페이지 테이블에는 valid dirty ref의 3개의 특수 비트가 존재함
페이지가 메모리에 없으면 페이지 테이블은 disk의 swap space를 가리킨다
디스크로 매핑되는것은 valid가 0인것
비트를 읽어서 가져오는데 physical page number가 18비트밖에 없음 실제 mips에서는 physical address가 32비트임 그래서 20비트다!
30인 경우에는 18이 되겠지만 mips는 32이다
virtual page number로 page table indexing한다
physical memory에 링킹이 되어있다 valid가 1이면
0이면 swap으로 링킹이 된다
page fault 줄이기 위해서LRU 사용한다 다른걸로는 random이 있다
랜덤은 블록이 set안에서 아무데나 들어갈수있는것 lru방식은 block이 set안에 들어가는데 가장 오래된 데이터의 위치로 들어가는것
reference bit = use bit 페이지에 엑세스하면 1로 만들어짐 os가 주기적으로 0으로 바꿈. virtual page number로 엑세스하는데 엑세스하는순간 reference bit이 1로 바뀐다. 일정시간동안 안쓰이면 os가 1을 지워버리고 0으로 바꿔버린다
reference bit를 둬서 최근에 사용됬냐 안됐냐를 판단하는것!
disk wrtie은 어마어마한 시간이 걸리기 때문에 write back방식을 사용하는데
dirty bit을 쓴다. 페이지가 쓰였을때 dirty bit세팅한다
프로세서가 데이터를 쓰라고 해서 값이 바뀌었다. 그러면 dirty bit이 1이되고 physical memory에 반영하지 않음. 바로 반영한다는건 write through방식인거고
write back이니까 캐시에만 쓰고 메인메모리에는 안쓰고 진행함
데이터가 캐시에서 영영 없어질때 write back한다 피지컬 메모리에
즉 다른값을 쓸때 데이터가 영영 사라질 수 잇으니 그때 쓰는것
dirty bit을 보고 백업해주고 다른걸로 바꾼다
페이지 테이블은 외부에 있음 뭔가 데이터 요청할때마다 프로세서 외부로 가야한다 page table엑세스하기 위해서 그럼 시간이 오래걸린다 그래서 tlb를 사용함 프로세서 내부에 있다. 페이지 테이블의 cache이다. 딜레이를 없애기 위한 page table상위레벨의 메모리. tlb를 보고 없으면 페이지 테이블로 간다
tlb도 캐시니까 miss라는 표현을 쓴다 page fault가 아니라
맨 처음에 virtual address부터 시작함 가상주소로부터 시작하낟
프로그램이 가지고 있는 가상주소로 데이터 달라고 요청이 들어오면 virtual address를 phyiscal address로 translation해야하는데
페이지 오프셋은 그대로 내려오고 앞에있는 virtual page numver는 페이지 테이블 엑세스에 쓴다. 외부에 있으므로 너무 느려서 캐시를 만든것이 tlb. tlb에 먼저 엑세스한다. tlb는 fully associative이다 비교기가 element마다 다 있다
비교기에서 비교해서 맞는걸 찾으면 tlb hit가 난것
hit는 and gate이다. 다른 하나는 valid 하나는 비교기 결과
physical address결과도 32비트
physical address구했으니 메모리 엑세스 해야한다. 가장먼저 엑세스하는 메모리는 캐시. 프로세서는 메인 메모리로 접근할 방법이 없다 cache에 무조건 먼저접근
없으면 그때 메인메모리로 간다
캐시에 엑세스하는 방법은 byte offset 00 block offset 4개 = m 2의4승 words
=16 words block single blok이 16개의 데이터를 가지고 있다
두개 합쳐서 offset이라고 얘기한다. offset은 총 6이되고
캐시 인덱스 = n 2의8승개만큼의 block들이 존재한다
physical address tag는 32- m - n -2 =18
인덱스로 캐시 엑세스. 몇번째 블록인지. hit가 나는지는 valid비트와 tag비교기 값으로 확인해서 데이터가 있는지 본다. 캐시 인덱스와 block offset으로 데이터 접근하는데 캐시 인덱스가 왜 필요한지? 몇번째 블록인지 가리킬때 쓴다
16개의 word로 되어있고 block은
16개중에 몇번째의 element냐 지정할때 block offset쓰고 4개의 비트로 지정
그리고 그 데이터를 프로세서로 보낸다.
tlb miss 캐시니까 당연히 미스가 난다
페이지 테이블에는 있는데 tlb에는 없다 cpu가 page table의 엔트리를 가져온다 그리고 faulting instruction을 다시 시작한다. 여기서도 가상주소는 tlb로만 엑세스하고 없으면 페이지테이블에서 가져와서 다시 tlb로 접근한다.
page table에서 없으면 disk의 swap공간으로 간다
페이지가 dirty이면 디스크에 쓰고 올린다
types of misses
메모리 hierarchy에서 miss의 타입들
miss에는 세가지 다른 타입이 있음 tlb miss, page fault, cache miss
총 8개의 미스가 있어야할거같지만 7개만 있다. hit/hit/hit인 경우는 miss아니니까
3가지 경우는 불가능하다
tlb로 갔는데 데이터가 있다 그럼 페이지 테이블에 엑세스할 필요 없다.
page table의 캐시가 tlb이니까 tlb에 있는데 페이지 테이블에 없다는것은 말이 안됨
페이지테이블에 없으면 디스크의 swap space로 간다
lw의 destination과 base register가 똑같이 되어있으면 tlb미스가 나도 실행했다면 s1의 값이 바뀐다, 그동안 tlb miss를 해결하고 다시 실행한다. s1이 업데이트되어서 엉뚱한 위치로 간다 tlb미스를 먼저 해결하고 명령어를 실행해야한다 그래서!
tlb는 fully associative
pagetable은 비교기가 필요하다? x
페이지테이블은 캐시가 아니라서 인덱싱만 해서 가면 된다 비교기는 캐시일때만 필요한거다
tlb는 태그가 있어야 하고 page table은 필요가 없다