Əsas məzmuna keçin

Yaddaş İerarxiyası

Memory Hierarchy Nədir?

Memory Hierarchy - müxtəlif sürət və tutum xarakteristikalarına malik yaddaş səviyyələrinin təşkilidir. Məqsəd sürətli və ucuz yaddaşın balansını təmin etməkdir.

Yaddaş Piramidası

graph TB
subgraph "Sürət və Qiymət"
R[Registers<br/>~1 cycle<br/>~KB]
end

R --> L1[L1 Cache<br/>~4 cycles<br/>~32-64 KB]
L1 --> L2[L2 Cache<br/>~10-20 cycles<br/>~256-512 KB]
L2 --> L3[L3 Cache<br/>~40-75 cycles<br/>~8-32 MB]
L3 --> RAM[Main Memory RAM<br/>~200+ cycles<br/>~GB]
RAM --> SSD[SSD Storage<br/>~100K cycles<br/>~TB]
SSD --> HDD[HDD Storage<br/>~1M cycles<br/>~TB]

style R fill:#ff6b6b
style L1 fill:#ffa500
style L2 fill:#ffd700
style L3 fill:#90ee90
style RAM fill:#87ceeb
style SSD fill:#dda0dd
style HDD fill:#d3d3d3

Əsas Səviyyələr

1. Registers

  • Yer: CPU daxilində
  • Sürət: 1 cycle (~0.25 ns)
  • Ölçü: 32-256 bytes
  • Xüsusiyyət: Ən sürətli, ən kiçik

2. Cache Memory

L1 Cache (Level 1)

  • CPU core-a aid
  • Split: Instruction cache (I-cache) və Data cache (D-cache)
  • Ölçü: 32-64 KB per core
  • Latency: 4-5 cycles

L2 Cache (Level 2)

  • Core-a aid və ya shared
  • Unified cache (instruction + data)
  • Ölçü: 256-512 KB per core
  • Latency: 12-20 cycles

L3 Cache (Level 3)

  • Bütün core-lar arasında shared
  • Ölçü: 8-32 MB
  • Latency: 40-75 cycles

3. Main Memory (RAM)

  • Ölçü: 8-128 GB (tipik sistemlərdə)
  • Latency: 200-300 cycles (~50-100 ns)
  • Volatile: Elektrik kəsilməsi ilə məlumat itirilir

4. Storage (SSD/HDD)

  • SSD: 100,000+ cycles (~100 μs)
  • HDD: 10,000,000+ cycles (~10 ms)
  • Non-volatile: Məlumat qalır

Yaddaş İerarxiyası Cədvəli

SəviyyəSürətÖlçüQiymət/GBLatency
RegistersƏn sürətli~KBN/A~1 cycle
L1 CacheÇox sürətli~64 KBN/A~4 cycles
L2 CacheSürətli~512 KBN/A~12 cycles
L3 CacheOrta sürətli~16 MBN/A~40 cycles
RAMOrta~16 GBOrta~200 cycles
SSDYavaş~1 TBAşağı~100 μs
HDDÇox yavaş~4 TBƏn aşağı~10 ms

Locality Principles

Temporal Locality (Zaman Lokalliği)

Yaxın keçmişdə istifadə olunan məlumatlara yenidən müraciət olma ehtimalı yüksəkdir.

sequenceDiagram
participant CPU
participant Cache
participant Memory

Note over CPU: Loop daxilində<br/>eyni variable
CPU->>Cache: Request data A
Cache->>Memory: Miss - fetch A
Memory-->>Cache: Return A
Cache-->>CPU: Return A

CPU->>Cache: Request A (again)
Cache-->>CPU: Hit - return A (fast!)

CPU->>Cache: Request A (again)
Cache-->>CPU: Hit - return A (fast!)

Nümunə:

for (int i = 0; i < 1000; i++) {
sum += array[0]; // array[0] - temporal locality
}

Spatial Locality (Məkan Lokalliği)

Yaxın ünvanların da tezliklə istifadə olunma ehtimalı yüksəkdir.

graph LR
A[Address 100] --> B[Address 104]
B --> C[Address 108]
C --> D[Address 112]

style A fill:#90ee90
style B fill:#90ee90
style C fill:#90ee90
style D fill:#90ee90

Nümunə:

for (int i = 0; i < 1000; i++) {
sum += array[i]; // Sequential access - spatial locality
}

Memory Access Patterns

Sequential Access (Optimal)

// GOOD: Cache-friendly
for (int i = 0; i < N; i++) {
process(array[i]);
}

Strided Access

// DECENT: Hər k-cı element
for (int i = 0; i < N; i += k) {
process(array[i]);
}

Random Access (Worst)

// BAD: Cache-unfriendly
for (int i = 0; i < N; i++) {
int index = random();
process(array[index]);
}

Matrix Access Pattern

// GOOD: Row-major order (C/C++)
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
sum += matrix[i][j]; // Sequential in memory
}
}

// BAD: Column-major access (C/C++)
for (int j = 0; j < M; j++) {
for (int i = 0; i < N; i++) {
sum += matrix[i][j]; // Strided access
}
}

Virtual Memory

Virtual Memory - hər prosesə öz ayrı yaddaş məkanı illüziyasını yaradır.

graph TB
subgraph "Process 1"
V1[Virtual Address<br/>0x00000000 - 0xFFFFFFFF]
end

subgraph "Process 2"
V2[Virtual Address<br/>0x00000000 - 0xFFFFFFFF]
end

subgraph "Physical Memory"
P[Physical Address<br/>0x00000000 - 0x3FFFFFFF]
end

V1 -->|Page Table 1| P
V2 -->|Page Table 2| P

subgraph "Disk"
D[Swap Space]
end

P -.->|Page out| D
D -.->|Page in| P

Virtual Memory Üstünlükləri

  • İzolyasiya: Proseslər bir-birinin yaddaşına girmə bilməz
  • Abstraction: Hər proses öz yaddaşı var kimi görünür
  • Paging: Physical memory-dən çox virtual memory istifadəsi
  • Sharing: Kod səhifələri shared ola bilər

Virtual Memory Çatışmazlıqları

  • Overhead: Address translation vaxt alır
  • Page faults: Disk-ə müraciət çox yavaşdır
  • TLB miss: Translation overhead

Page Tables

Page Table - virtual address-i physical address-ə çevirən cədvəldir.

graph LR
VA[Virtual Address] --> VPN[Virtual Page Number]
VA --> Offset[Page Offset]

VPN --> PT[Page Table]
PT --> PPN[Physical Page Number]

PPN --> PA[Physical Address]
Offset --> PA

Address Translation

Virtual Address Structure:

  • Virtual Page Number (VPN): Yuxarı bitlər
  • Page Offset: Aşağı bitlər

Physical Address Structure:

  • Physical Page Number (PPN): Page Table-dan
  • Page Offset: Dəyişmir

Multi-Level Page Tables

graph TB
VA[Virtual Address] --> L1[Level 1 Index]
VA --> L2[Level 2 Index]
VA --> L3[Level 3 Index]
VA --> Offset[Offset]

L1 --> PT1[Page Directory]
PT1 --> PT2[Page Middle Directory]
L2 --> PT2
PT2 --> PT3[Page Table]
L3 --> PT3
PT3 --> PPN[Physical Page Number]

PPN --> PA[Physical Address]
Offset --> PA

Üstünlükləri:

  • Yaddaşda az yer tutur
  • Sparse address space üçün yaxşı

TLB (Translation Lookaside Buffer)

TLB - page table entry-lərinin cache-idir, address translation-u sürətləndirir.

sequenceDiagram
participant CPU
participant TLB
participant PageTable
participant Memory

CPU->>TLB: Virtual Address

alt TLB Hit
TLB-->>CPU: Physical Address (fast!)
CPU->>Memory: Physical Address
Memory-->>CPU: Data
else TLB Miss
TLB->>PageTable: Lookup VPN
PageTable-->>TLB: PPN
TLB-->>CPU: Physical Address
Note over TLB: Update TLB
CPU->>Memory: Physical Address
Memory-->>CPU: Data
end

TLB Xüsusiyyətləri

  • Sürət: 1-2 cycles
  • Ölçü: 64-1024 entries
  • Hit rate: ~95-99%
  • Structure: Fully-associative və ya set-associative

TLB Miss Növləri

Minor (Soft) TLB Miss:

  • Page Table-də entry var
  • Sadəcə TLB-də yox idi
  • Hardware və ya OS tərəfindən həll olunur

Major (Hard) TLB Miss:

  • Page Table-də entry yox
  • Page disk-də (swap)
  • Page fault - disk-dən yükləmə lazımdır

Memory Access Flow

graph TB
Start[Memory Access] --> TLB_Check{TLB Hit?}

TLB_Check -->|Yes| L1_Check{L1 Hit?}
TLB_Check -->|No| PT[Page Table Walk]
PT --> Update_TLB[Update TLB]
Update_TLB --> L1_Check

L1_Check -->|Yes| Done[Return Data]
L1_Check -->|No| L2_Check{L2 Hit?}

L2_Check -->|Yes| Update_L1[Update L1]
L2_Check -->|No| L3_Check{L3 Hit?}

L3_Check -->|Yes| Update_L2[Update L2]
L3_Check -->|No| RAM_Check{RAM Hit?}

RAM_Check -->|Yes| Update_L3[Update L3]
RAM_Check -->|No| Page_Fault[Page Fault]

Page_Fault --> Disk[Load from Disk]
Disk --> Update_RAM[Update RAM]

Update_L1 --> Done
Update_L2 --> Update_L1
Update_L3 --> Update_L2
Update_RAM --> Update_L3

Performans Optimizasiyası

1. Data Structure Alignment

// BAD: Padding waste
struct Bad {
char a; // 1 byte
int b; // 4 bytes (3 bytes padding)
char c; // 1 byte (3 bytes padding)
}; // Total: 12 bytes

// GOOD: Optimized layout
struct Good {
int b; // 4 bytes
char a; // 1 byte
char c; // 1 byte (2 bytes padding)
}; // Total: 8 bytes

2. Cache Line Awareness

#define CACHE_LINE_SIZE 64

// Align to cache line
struct alignas(CACHE_LINE_SIZE) CacheAligned {
int data;
// ...
};

3. Sequential Access

// Prefer sequential over random access
// Utilize spatial locality
for (int i = 0; i < N; i++) {
array[i] = compute(i); // Sequential write
}

Əlaqəli Mövzular

  • Cache Memory: Cache strukturu və protokolları
  • Virtual Memory: Paging və memory management
  • CPU Performance: Memory bandwidth təsiri
  • False Sharing: Multi-threading cache problemləri