메모리
- Base CPI : 캐시 미스가 없을 때, 명령어를 실행하는 데 필요한 사이클 수
- Cycle Time : CPU의 클럭 주기 시간
- Miss Rate : 캐시에서 원하는 데이터를 찾지 못하는 비율
- Miss Penalty : 캐시 미스가 발생했을 때, 데이터를 가져오는 데 걸리는 시간입니다.
- 평균 메모리 접근 시간(AMAT) : 평균적으로 메모리에 접근하는 데 걸리는 시간
AMAT = Hit Time + (Miss Rate * Miss Penalty)
Hit Time = Base CPI * Cycle Time
만약 L1 캐시만 있다는 가정 하에서는
Base CPI = 1
Cycle Time = 0.5ns
Miss Rate = 3%
Miss Penalty = 100ns
AMAT = (1*0.5) + (0.03 * 100) = 0.5 + 3 = 3.5
L2 캐시가 추가된 경우
- Base CPI = 1
- Cycle Time = 0.5 ns
- L1 Miss Rate = 3% = 0.03
- L1 Miss Penalty = L2 캐시 접근 시간 + (L1에서 L2로의 Miss Rate * 메인 메모리 접근 시간)
- L2 캐시 접근 시간 = 10 ns
- L1에서 L2로의 Miss Rate = 20% = 0.2
- 메인 메모리 접근 시간 = 100 ns
L1 Miss Penalty = 10 + (0.2 * 100) = 10 + 20 = 30 ns
AMAT = (1 * 0.5) + (0.03 * 30) = 0.5 + 0.9 = 1.4 ns
메모리 접근 시간
메모리 대역 폭 증가 -> miss penalty 감소
메모리 대역폭이 증가하면 메모리 접근 속도가 빨라집니다. 이는 캐시 미스가 발생했을 때 메인 메모리에서 데이터를 가져오는 시간을 단축시키므로 miss penalty를 감소시키는 효과가 있습니다.
다단계 캐시에서 primary cache의 가장 중요한 목표는 가능한 한 빠르게 데이터에 접근하는 것입니다. 즉 hit time을 최소화하는 것이 주 목표입니다. L1캐시는 용량이 작지만 속도가 매우 빠르도록 설계되었습니다.
연관성이 증가하면 캐시에서 충돌이 발생할 확률이 줄어듭니다. 충돌은 서로 다른 메모리 블록이 캐시의 같은 위치에 매핑되려고 할 때 발생하며, 캐시 미스의 원인이 됩니다. 연관성이 높아지면 블록을 저장할 수 있는 위치가 더 많아지므로 충돌이 줄어들어 miss rate가 감소합니다.
블록 크기( 캐시와 메인 메모리 간에 데이터를 전송하는 단위)를 증가시키면 더 많은 데이터를 캐시에 가져올 수있습니다. 이는 공간 지역성이 높은 프로그램의 경우 miss rate를 감소시키는 효과가 있습니다.
Miss Rate: 캐시에서 원하는 데이터를 찾지 못하는 비율입니다.
캐시 설계 시 설계 변화 영향
Cache 크기 증가 시
캐시의 크기가 증가하면 더 많은 데이터를 저장할 수 있으므로, 용량 부족으로 인한 Capacity miss가 감소합니다.
Associativity 증가 시
연관성이 증가하면, 같은 캐시 위치에 매핑되려고 하는 블록들의 충돌이 줄어들어 Conflict miss가 감소합니다.
Block 크기 증가 시
블록 크기가 증가하면 한 번에 더 많은 데이터를 캐시에 가져오게 됩니다. 처음 접근하는 데이터 주변의 데이터도 함께 가져오므로, 이후에 그 주변 데이터에 접근할 때 Compulsory miss가 발생하지 않게 됩니다. 즉 Compulsory miss가 감소합니다.
Cache 크기 증가 시 단점
캐시 크기가 증가하면 캐시를 검색하는 데 더 많은 시간이 걸릴 수 있습니다. 캐시가 커질수록 비교해야 할 항목이 많아지기 대문입니다. 즉 접근 시간(Hit Time)이 증가할 수 있습니다.
Associativity 증가 시 단점
연관성이 증가하면 캐시에서 데이터를 찾기 위해 더 많은 비교를 해야 합니다. 그래서 접근 시간이 증가할 수 있습니다.
Block 크기 증가 시 단점 (Cache 크기 상관 없음)
블록 크기가 증가하면 캐시와 메인 메모리 간에 전송해야 하는 데이터의 양이 증가합니다. 따라서 캐시 미스가 발생했을 때 데이터를 가져오는 데 걸리는 시간 즉 Miss Penalty가 증가합니다.
Block 크기 증가 시 단점 (Cache 크기 고정인 경우)
캐시 크기가 고정된 상태에서 블록 크기를 증가시키면 저장할 수 있는 블록 수가 줄어듭니다. 이는 충돌 발생 확률 높여서 Conflict miss를 증가시킵니다.
캐시 사용되는 정보와 그 용도
- 캐시 : CPU와 메인 메모리 사이의 고속 버퍼 메모리
- 블록 : 캐시와 메인 메모리 간에 데이터를 전송하는 단위
- 인덱스 : 캐시에서 특정 블록이 저장된 위치를 나타내는 주소
- 태그 : 메인 메모리의 블록 주소 중 캐시 인덱스로는 구분할 수 없는 부분을 저장하여, 캐시에 저장된 블록이 실제로 CPU가 요청한 블록인지 확인하는 데 사용
- 유효 비트(Valid bit) : 캐시 블록에 유효한 데이터가 저장되어 있는지 여부 나타내는 비트
- 블록 오프셋 (Block Offset) : 블록 내에서 원하는 데이터의 위치를 나타내는 오프셋
- 더티 비트(Dirty Bit) : 캐시 블록에 저장된 데이터가 수정되었는지 여부를 나타내는 비트 Write Back에서 사용
- 사용 비트 (Use Bit) : 캐시 블록이 최근에 사용되었는지 여부를 나타내는 비트
인덱스는 캐시에서 어떤 블록을 선택할지 결정하는 데 사용됩니다. 메인 메모리 주소의 일부 비트가 인덱스로 사용되어, 해당 주소의 데이터가 캐시의 어떤 위치에 저장되어 있는지 또는 저장될 위치를 알려줍니다.
태그는 인덱스로 선택된 캐시 블록이 실제로 CPU가 요청한 메인 메모리 블록과 일치하는지 확인하는 데 사용됩니다. 인덱스만으로는 여러 개의 메인 메모리 블록이 같은 캐시 위치에 매핑될 수 있기 때문에, 태그를 비교하여 정확한 블록인지 확인합니다.
Valid Bit 즉 유효 비트는 해당 캐시 블록에 유효한 데이터가 저장되어 있는지 나타냅니다. 캐시가 처음 초기화되었을 때 모든 유효 비트는 0으로 설정되며, 데이터가 캐시에 로드되면 1이 설정됩니다.
block offset은 선택된 블록 내에서 원하는 워드의 위치를 나타냅니다. 블록이 여러개의 워드로 구성되어 있을 때, 오프셋을 사용하여 원하는 워드를 선택합니다.
Byte offset은 선택된 블록 내에서 원하는 바이트의 위치를 나타냅니다. 워드보다 더 작은 단위의 바이트를 선택할 때 사용됩니다.
Dirty bit는 해당 캐시 블록의 내용이 메인 메모리의 내용과 일치하지 않는지, 즉 수정되었는지 여부를 나타냅니다. Write-back 캐시에서 사용되며, 블록이 캐시에서 쫓겨날 때 비트가 1이면 메인 메모리에 내용을 다시 써야 합니다.
Use bit (사용 비트)는 해당 캐시 블록이 최근에 사용되었는지 여부를 나타냅니다. 페이지 교체 알고리즘에서 어떤 블록을 교체할지 결정하는 데 사용됩니다.
Page Fault Handler 실행
- 페이지 : 가상 메모리를 일정한 크기로 나눈 단위
- 프레임 : 물리 메모리를 일정한 크기로 나눈 단위
- 페이지 테이블 : 가상 주소를 물리 주소로 변환하는 테이블
- TLB : 페이지 테이블의 일부를 캐싱하여 주소 변환 속도를 높이는 캐시
- 유효 비트(Valid Bit) : 페이지 테이블 항목에 존재하는 비트로, 해당 페이지가 물리 메모리에 존재하는지 여부를 나타내면 물리 메모리에 존재하고, 0이면 존재하지 않음
- 페이지 폴트(Page Fault): CPU가 접근하려는 페이지가 현재 물리 메모리에 없을 때 발생하는 인터럽트
- 페이지 폴트 핸들러(Page Fault Handler) : 페이지 폴트가 발생했을 때 운영체제가 실행하는 루틴
CPU가 가상 주소를 사용하여 메모리에 접근하려고 할 때, 먼저 해당 가상 주소에 해당하는 페이지 테이블 항목을 먼저 확인합니다. 이때 유효비트가 0이면, 해당 페이지가 물리 메모리에 없다는 것을 의미하며 페이지 폴트가 발생합니다.
즉 Page Table의 valid bit이 0일 때 발생합니다.
가상 메모리 보호
- 가상 메모리 : 각 프로세스에게 독립적인 주소 공간을 제공하여, 마치 각 프로세스가 자신만의 메모리를 독점적으로 사용하는 것처럼 보이게 하는 기술
- 페이지 테이블 (Page Table) : 가상 주소를 물리 주소로 변환하는 테이블
- 페이지 테이블 레지스터(Page Table Register) : 현재 실행 중인 프로세스의 페이지 테이블 시작 주소를 저장하는 레지스터
- TLB(Translation Lookaside Buffer) : 페이지 테이블의 일부를 캐싱하여 주소 변환 속도를 높이는 캐시
- 프로세스 식별자(Process ID) : 각 프로세스를 고유하게 식별하는 번호
각 프로세스는 자신만의 페이지 테이블을 가져야 합니다. 그래야 각 프로세스가 독립적인 가상 주소 공간을 가지게 됩니다. 페이지 테이블의 시작 주소는 "페이지 테이블 레지스터"에 저장됩니다. 따라서 각 프로세스는 자신만의 페이지 테이블을 가리키는 고유한 페이지 테이블 레지스터를 가져야 합니다.
TLB는 페이지 테이블 항목을 캐싱하여 주소 변환 속도를 높입니다. 하지만 여러 프로세스가 동시에 실행될 수 있기 때문에, TLB에 저장된 항목이 어떤 프로세스의 것인지 구분해야 합니다.
이를 위해 프로세스 식별자 정보를 TLB항목과 함께 저장합니다. TLB 히트가 발생했을 때, 가상 주소뿐만 아니라 현재 실행 중인 프로세스의 PID와 TLB 항목에 저장된 PID를 함께 비교하여 정확한 매칭인지 확인합니다.
페이지 테이블은 메모리 관리의 핵심적인 부분이기 때문에, 일반 프로세스가 함부로 수정할 수 없도록 보호해야 합니다. 페이지 테이블 수정은 운영체제만이 수행할 수 있도록 권한이 제한되어 있습니다.
'IT 프로그래밍 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조]페이지 폴트와 Use Bit의 이해 (0) | 2024.12.18 |
---|---|
[컴퓨터구조] 메모리 계층 (0) | 2024.12.18 |
[컴퓨터구조] 포워딩 hazard 위험 (0) | 2024.12.18 |
[컴퓨터구조] 파이프라인 해저드 (Pipeline Hazards) 및 해결 방법 (0) | 2024.12.18 |
[컴퓨터구조] 파이프라인 및 제어신호 (0) | 2024.12.18 |