lw $1, 8($0)
8번 virtual address 에서 레지스터로 데이터를 가져올 때 일어나는 과정
1. virtual address 를 physical address로 변환하기
1. TLB 에 접근
8번 주소를 분해한다.
만약 주소의 길이가 32bit 라면 4KB 페이지 크기를 고려하여 12bit 를 떼고,
TLB 인덱스의 개수가 8개라면 3bit 를 index bit 로서 추가로 떼어내, 남은 17 bit 를 tag 로서 TLB 에서 PA를 찾는다.
1-1. TLB Hit
TLB Hit 라면 바로 Physical Address 를 가져온다.
이때 TLB에 기록된 dirty bit, ref bit는 신경쓸 필요가 없는걸까?
1-2. TLB Miss
메인 메모리에 있는 Page Table에 직접 접근한다. (Page Table Register 이용)
1-2-1. Merely TLB Miss
Page Table에 저장된 내용이 Physical Page Number 였다면, 이 내용을 TLB로 가져온다.
이때 만약 TLB에서 기존 PTE를 빼야하는데 PTE에 dirty bit가 세팅되어있었다면?
→ TLB 에 저장된 PTE 의 dirty bit 가 1 이었을 때, 이 값이 page table 에 세팅된 값과 다를 수 있다! 따라서 이때 반영한다.
use bit 를 1로 설정한다.
1-2-2. Page Fault
Page Table에 저장된 내용이 disk address의 시작주소였다면,
- swap space 에서 해당 페이지를 메모리로 로드한다.
- 이때 기존의 페이지를 빼고 새로 로드해야 할 수 있는데, 기존 페이지 중에 use bit 가 0인 페이지를 빼야한다.
- 기존 페이지를 Page Table에서 찾았을 때 dirty bit가 설정되어있었다면, 해당 페이지의 내용을 디스크 (swap space)에 쓴 뒤에 뺀다.
- Page Table에서 기존 페이지를 찾아서 Physical Page Number 대신 Disk Address 시작주소를 저장하도록 바꾼다.
이때 만약 캐시가 wrtie back 정책을 사용하느라 아직 메모리에 데이터를 쓰지 않은 상황이라면?
→ 캐시에 데이터가 존재한다는 뜻은 메모리에 접근했었다는 뜻이고, 메모리에 접근했었다면 use bit가 1이 되니 이 페이지는 뺄 일이 없다.
→ 그러면 use bit 가 1인 페이지는 절대로 빼지 않는걸까?, 수업 중에 use bit는 정기적으로 0으로 초기화한다고 했는데, 그럼 이때는 문제가 있지 않을까?
- 기존 페이지가 빠진 자리에 swap space 에서 가져온 페이지를 로드한다.
- Page Table 에 swap space 에서 가져온 페이지의 Physical Address를 Physical Page Number 로 업데이트한다.
- 이 내용을 TLB에 캐싱한다.
- valid, use bit 를 1로 설정한다.
2. TLB에서 얻은 PA를 CPU에게 알려준다.
2. physical address를 쪼개서 캐시에 접근하기
1. 물리 주소 쪼개기
얻어낸 물리주소가 16번이라고 하자.
만약 주소의 길이가 30bit 라면 2bit 의 byte offset, 2bit 의 word offset 을 제거해서 block address를 계산한다.
block address 에서 캐시의 entry (set) 개수 만큼을 나타내는 bit를 제외해서 해당 캐시 엔트리에 접근한다.
tag 를 비교하고 valid 비트를 확인한다.
2. 캐시에 접근하기
2-1. 캐시 히트
캐시에 있는 block 데이터에서 CPU가 원하는 word를 바로 가져온다.
2-2. 캐시 미스
- 캐시는 해당하는 물리주소가 가리키는 메모리로 직접 접근해서 cache block 단위로 데이터를 가져온다.
- 이때 캐시 엔트리에 여유가 없다면, 기존 엔트리를 방출한다.
- 기존 엔트리를 방출할 때 dirty bit가 설정되어 있다면, 방출하기 전에 해당 엔트리가 가리키는 메모리의 값을 업데이트한다.
- 메모리에서 가져온 block 데이터에서 CPU가 원하는 word를 찾아 돌려준다.
sw $1, 8($0)
8번 virtual address 에 데이터를 쓸 때 일어나는 과정
1. virtual address 를 physical address로 변환하기
1. TLB 에 접근
8번 주소를 분해한다.
만약 주소의 길이가 32bit 라면 4KB 페이지 크기를 고려하여 12bit 를 떼고,
TLB 인덱스의 개수가 8개라면 3bit 를 index bit 로서 추가로 떼어내, 남은 17 bit 를 tag 로서 TLB 에서 PA를 찾는다.
1-1. TLB Hit
TLB Hit 라면 바로 Physical Address 를 가져온다.
이때 TLB에 기록된 dirty bit, ref bit는 신경쓸 필요가 없는걸까?
1-2. TLB Miss
메인 메모리에 있는 Page Table에 직접 접근한다. (Page Table Register 이용)
1-2-1. Merely TLB Miss
Page Table에 저장된 내용이 Physical Page Number 였다면, 이 내용을 TLB로 가져온다.
이때 만약 TLB에서 기존 PTE를 빼야하는데 PTE에 dirty bit가 세팅되어있었다면?
→ TLB 에 저장된 PTE 의 dirty bit 가 1 이었을 때, 이 값이 page table 에 세팅된 값과 다를 수 있다! 따라서 이때 반영한다.
use bit 를 1로 설정한다.
1-2-2. Page Fault
Page Table에 저장된 내용이 disk address의 시작주소였다면,
- swap space 에서 해당 페이지를 메모리로 로드한다.
- 이때 기존의 페이지를 빼고 새로 로드해야 할 수 있는데, 기존 페이지 중에 use bit 가 0인 페이지를 빼야한다.
- 기존 페이지를 Page Table에서 찾았을 때 dirty bit가 설정되어있었다면, 해당 페이지의 내용을 디스크 (swap space)에 쓴 뒤에 뺀다.
- Page Table에서 기존 페이지를 찾아서 Physical Page Number 대신 Disk Address 시작주소를 저장하도록 바꾼다.
이때 만약 캐시가 wrtie back 정책을 사용하느라 아직 메모리에 데이터를 쓰지 않은 상황이라면?
→ 캐시에 데이터가 존재한다는 뜻은 메모리에 접근했었다는 뜻이고, 메모리에 접근했었다면 use bit가 1이 되니 이 페이지는 뺄 일이 없다.
→ 그러면 use bit 가 1인 페이지는 절대로 빼지 않는걸까?, 수업 중에 use bit는 정기적으로 0으로 초기화한다고 했는데, 그럼 이때는 문제가 있지 않을까?
- 기존 페이지가 빠진 자리에 swap space 에서 가져온 페이지를 로드한다.
- Page Table 에 swap space 에서 가져온 페이지의 Physical Address를 Physical Page Number 로 업데이트한다.
- 이 내용을 TLB에 캐싱한다.
- valid, use bit 를 1로 설정한다.
2. TLB에서 얻은 PA를 CPU에게 알려준다.
3. dirty bit 설정
sw 명령어이므로, 새로운 값을 쓸 것이다. (메모리에 바로 쓰든, 캐시에만 써두든)
따라서 TLB 가 가리키는 entry 의 dirty bit를 1로 설정한다.
page table이 가리키는 entry 의 dirty bit를 1로 설정한다.
TLB Hit 일 때는 page table에 접근하지 않는데?
→ 그래서 이때는 TLB에만 dirty bit 를 세팅한다.
→ 그러면 나중에 TLB 데이터가 Page Table에 반영되기 전에 page fault 가 발생해서 페이지를 교체하는 순간, 하필 dirty bit가 동기화 되지 않아서 하드디스크에 바뀐 값을 반영하지 않을 수도 있지 않을까?
→ 결국 문제는 page fault 가 발생했을 때, 캐시의 내용과 메모리의 내용 / TLB 내용과 Page Table 이 동기화 되지 않았을 수 있는 것이 문제다!! 그러면 page fault가 발생했을 때는 캐시도, TLB도 모두 강제로 일단 다 동기화시킨 다음에 swap sapce에서 페이지를 가져오나?
2. physical address를 쪼개서 캐시에 접근하기
1. 물리 주소 쪼개기
얻어낸 물리주소가 16번이라고 하자.
만약 주소의 길이가 30bit 라면 2bit 의 byte offset, 2bit 의 word offset 을 제거해서 block address를 계산한다.
block address 에서 캐시의 entry (set) 개수 만큼을 나타내는 bit를 제외해서 해당 캐시 엔트리에 접근한다.
tag 를 비교하고 valid 비트를 확인한다.
2. 캐시에 접근하기
2-1. 캐시 히트
캐시에 있는 block 데이터에서 CPU가 원하는 word 위치에 값을 쓰고 dirty bit 를 세팅한다.
2-2. 캐시 미스
- 캐시는 해당하는 물리주소가 가리키는 메모리로 직접 접근해서 cache block 단위로 데이터를 가져온다.
- 이때 캐시 엔트리에 여유가 없다면, 기존 엔트리를 방출한다.
- 기존 엔트리를 방출할 때 dirty bit가 설정되어 있다면, 방출하기 전에 해당 엔트리가 가리키는 메모리의 값을 업데이트한다.
- 메모리에서 가져온 block 데이터에서 CPU가 원하는 word 위치에 값을 쓰고 dirty bit를 세팅한다.
혼자 내린 결론
결국 시험에 나온 내용도 아니었고, 교수님도 page replacement policy는 시험에 안낸다고 하셨었던 내용인데 혼자 고민해본 내용이다.
근데 왜 시험에 안 낸다고 하셨는지 알 것 같다.
내가 한 고민은 지금 생각해보면 당연한 고민이고, 지금의 컴퓨터는 이 고민을 해결한 결과물일 텐데, 컴퓨터 구조를 처음 공부하는 학부생 수준에서 이 정도로 디테일하게 공부하는 건 쉽지 않을 것 같다는 생각이 들었다.
(예를 들면, page fault 가 발생했을 때, 교체할 page 중에서 캐시가 physical 주소를 갖고 있지 않은 페이지만 골라서 찾아야 하는데, 이렇게 하려면 캐시를 일단 메모리랑 동기화하고, 페이지를 교체한다든가.. 등으로 케이스가 복잡해짐)
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] 29. Pipeline MIPS 회로 그리는 과정 (0) | 2024.06.10 |
---|---|
[컴퓨터 구조] 27. Virtual Memory (2) - TLB (0) | 2024.06.07 |
[컴퓨터 구조] 26. Virtual Memory (1) - 개요 (0) | 2024.06.06 |
[컴퓨터 구조] 25. Cache (3) - 성능 개선 (0) | 2024.06.06 |
[컴퓨터 구조] 24. Cache (2) - Direct-Mapped Cache (0) | 2024.06.04 |