Module 3 — Tổng kết & cheat sheet
Recap bộ nhớ ảo: địa chỉ ảo/vật lý, paging, MMU, TLB, page fault, swap, thrashing, mmap và copy-on-write. Cheat sheet, glossary, pitfall và self-assessment.
TL;DR: Module 3 bóc tách cơ chế mà OS và phần cứng dùng để cho mỗi tiến trình ảo giác "sở hữu toàn bộ máy". Địa chỉ chương trình thấy là ảo — MMU dịch sang vật lý qua page table mỗi lần truy cập, với TLB cache kết quả để gần như miễn phí. Khi trang không trong RAM, page fault kích OS nạp vào — từ swap (major) hoặc chỉ map lại (minor). mmap và copy-on-write tận dụng lớp gián tiếp đó để chia sẻ trang thông minh: fork tức thì, shared library một bản RAM, file lớn hơn RAM vẫn đọc được. Đây là trang để bookmark.
Đã đi qua những gì
Bạn bắt đầu từ câu hỏi cơ bản nhất: tại sao hai tiến trình cùng dùng địa chỉ 0x400000 mà không đụng nhau? Câu trả lời là mỗi tiến trình có không gian địa chỉ ảo riêng, và một lớp dịch biến địa chỉ ảo thành địa chỉ vật lý thật. Bạn đi vào cơ chế: bộ nhớ chia trang cố định, page table (với multi-level để tiết kiệm bộ nhớ) lưu ánh xạ, MMU dịch mỗi truy cập phần cứng, TLB cache bản dịch để tránh page walk mỗi lần. Rồi đến mặt động: trang vắng trong RAM sinh page fault — minor (map lại) hay major (đọc đĩa) — và demand paging để malloc lớn không tiêu RAM ngay. Khi RAM đầy, swap và clock algorithm chọn trang nào để đẩy; khi working set vượt RAM là thrashing. Cuối cùng hai siêu năng lực: mmap (file như bộ nhớ, demand paging từ file) và copy-on-write (fork tức thì, shared library một bản).
mindmap
root(("Bo nho ao"))
Dia chi
Ao vs vat ly
Khong gian rieng moi tien trinh
ASLR
Paging
Trang 4KB va khung
Page table va PTE
Multi-level giam RAM
MMU va TLB
MMU dich moi truy cap
TLB cache ban dich
Page walk khi TLB miss
Page fault
Minor fault map lai
Major fault doc dia
Demand paging lazy
Swap
Swap-out khi RAM day
Clock second-chance
Thrashing working set
mmap va COW
File nhu bo nho
MAP SHARED vs PRIVATE
Fork tuc thi COW
Shared library 1 ban🗺️ Cheat sheet
| Khái niệm | Cốt lõi | Pitfall / khi nào dùng |
|---|---|---|
| Địa chỉ ảo | Địa chỉ chương trình thấy — không phải vị trí thật trên RAM | In con trỏ ra không nói được ô RAM nào |
| Địa chỉ vật lý | Byte thật trên thanh RAM — chỉ phần cứng và OS dùng | So sánh địa chỉ giữa 2 process là vô nghĩa |
| Page / Frame | Trang ảo 4 KB; khung vật lý 4 KB — đơn vị ánh xạ | Kích thước cố định giúp tránh phân mảnh ngoài |
| Page table | Mảng PTE: mỗi trang ảo → khung vật lý + metadata bits | Multi-level để tiết kiệm RAM cho sparse address space |
| PTE | present, accessed, dirty, write-protect bits + PFN | Thiếu hiểu PTE → không hiểu fault và COW |
| VPN / PFN / offset | VPN tra bảng → PFN; offset giữ nguyên | offset = bit thấp của địa chỉ, không dịch |
| MMU | Phần cứng dịch VA → PA mỗi truy cập | Không thể tắt — luôn chạy khi user mode |
| TLB | Cache (VA→PA) trong CPU — ~1–4 chu kỳ khi hit | Miss → page walk → 100–200 chu kỳ; TLB flush khi context switch |
| Page walk | Duyệt multi-level page table khi TLB miss | Tốn kém — lý do TLB tồn tại |
| Page fault | PTE present=0 → trap OS | Minor (map lại, nhanh) vs major (đọc đĩa, chậm) |
| Demand paging | RAM chỉ gán khi trang bị chạm thật | malloc lớn không tiêu RAM ngay |
| Swap | Trang ít dùng đẩy ra đĩa; nạp lại khi cần | Chậm ~1.000–100.000× RAM; không thay thế RAM |
| Clock algorithm | Duyệt vòng, clear accessed bit, chọn khung accessed=0 | Dirty bit = phải ghi ra swap trước khi evict |
| Thrashing | Working set vượt RAM → swap liên tục → throughput ~0 | Thêm tiến trình khi RAM căng = phản tác dụng |
| Working set | Tập trang dùng tích cực trong cửa sổ thời gian gần | OOM killer khi cả RAM+swap cạn |
| mmap | File ánh xạ vào địa chỉ ảo, nạp theo demand paging | MAP_SHARED ghi ngược file; MAP_PRIVATE dùng COW |
| Copy-on-write | Chia sẻ trang read-only đến khi bị ghi → OS copy trang | Fork write-heavy = RAM peak 2× data size |
📖 Glossary module
| Thuật ngữ | Định nghĩa 1 câu |
|---|---|
| Địa chỉ ảo | Toạ độ trong không gian địa chỉ riêng của tiến trình — cái mọi chương trình thao tác |
| Địa chỉ vật lý | Chỉ số byte thật trên thanh RAM — chỉ phần cứng và OS dùng trực tiếp |
| Page (trang) | Khối bộ nhớ ảo liên tục kích thước cố định (thường 4 KB) — đơn vị ánh xạ |
| Frame (khung) | Khối bộ nhớ vật lý cùng kích thước trang — nơi trang ảo được nạp vào |
| Page table | Cấu trúc dữ liệu (OS duy trì) ánh xạ trang ảo sang khung vật lý |
| PTE | Page Table Entry — một hàng trong page table: PFN + các metadata bit |
| VPN | Virtual Page Number — phần cao của địa chỉ ảo, dùng làm index tra page table |
| PFN | Physical Frame Number — chỉ số khung vật lý trong PTE |
| Offset | Phần thấp của địa chỉ — vị trí byte bên trong trang, giữ nguyên khi dịch |
| MMU | Memory Management Unit — phần cứng dịch VA → PA mỗi truy cập bộ nhớ |
| TLB | Translation Lookaside Buffer — cache (VA→PA) trong CPU, tránh page walk |
| Page walk | Duyệt multi-level page table từ CR3 để tìm PTE khi TLB miss |
| Multi-level page table | Page table phân cấp để không cấp phát bảng cho vùng địa chỉ trống |
| Page fault | Exception khi PTE present=0 — trap vào OS để xử lý (minor hoặc major) |
| Minor fault | Page fault khi trang đã trong RAM nhưng chưa map — chỉ cần cập nhật PTE |
| Major fault | Page fault khi trang phải đọc từ đĩa/swap — tốn I/O |
| Demand paging | Chiến lược chỉ gán RAM vật lý khi trang bị chạm lần đầu (lazy allocation) |
| Swap | Vùng lưu trữ trên đĩa chứa trang bị đẩy ra khỏi RAM |
| Page replacement | Thuật toán chọn trang nào swap-out khi RAM đầy (LRU, clock…) |
| Thrashing | Trạng thái working set vượt RAM, OS swap liên tục, throughput gần 0 |
| Working set | Tập trang tiến trình truy cập tích cực trong cửa sổ thời gian gần nhất |
| mmap | Syscall ánh xạ file hoặc vùng ẩn danh vào không gian địa chỉ ảo |
| Copy-on-write | Kỹ thuật chia sẻ trang read-only giữa tiến trình đến khi một bên ghi |
| fork | Tạo tiến trình con bằng cách chia sẻ không gian địa chỉ cha qua COW |
⚠️ Pitfall tổng hợp
1. Nhầm địa chỉ ảo là vị trí RAM thật:
// In ra la dia chi AO, khong phai RAM vat ly
int x = 42;
printf("%p\n", (void*)&x); // vi du: 0x7ffd3a2c4b1c
// Con so nay khong co y nghia cross-process
2. Tưởng malloc lớn tiêu RAM ngay:
// DUNG: demand paging -- RAM chi bi dung khi cham thuc su
char *buf = malloc(1024 * 1024 * 1024); // 1 GB cap phat tuc thi
buf[0] = 1; // -> minor fault: khung dau tien moi duoc cap
buf[4096] = 1; // -> minor fault: khung thu hai
// Tong RAM dung = so trang thuc su da cham x 4KB
3. Duyệt mảng lớn swap-out gây major fault:
// Neu working set vuot RAM, moi buoc co the la major fault
for (int i = 0; i < N; i++) {
process(arr[i]); // ~10ms thay vi ~100ns neu swap
}
// Fix: giam so tien trinh dong thoi; them RAM; dung SSD NVMe swap
4. Fork write-heavy — RAM peak gấp đôi:
// Redis BGSAVE: parent tiep tuc nhan writes trong khi child serialize
fork();
// parent ghi key -> COW copy trang -> RAM tang len
// Worst case: RAM = 2 x dataset_size khi snapshot dang chay
5. MAP_SHARED khi cần isolation:
// SAI neu chi muon doc file, khong anh huong nguoi khac:
void *p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
p[0] = 42; // -> ghi len file va thay doi voi moi tien trinh khac!
// DUNG: MAP_PRIVATE de COW bao ve:
void *p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
p[0] = 42; // -> ban sao rieng, file khong doi
✅ Self-assessment
Bạn đã đạt module này nếu trả lời được:
- Explain được vì sao cần bộ nhớ ảo và phân biệt địa chỉ ảo với địa chỉ vật lý.
- Nếu chưa: đọc lại bài 01 mục 2–3.
- Trace được cách MMU dịch địa chỉ ảo sang vật lý qua page table và TLB, từng bước.
- Diagnose được page fault và swap; giải thích vì sao thrashing làm hệ thống đứng.
- Nếu chưa: đọc lại bài 04 mục 2–5.
- Explain được mmap và copy-on-write, liên hệ tới
fork()và chia sẻ bộ nhớ.- Nếu chưa: đọc lại bài 05 mục 2–3.
🚀 What's next
Module 3 đã giải thích phần cứng và OS quản lý bộ nhớ ở tầng thấp nhất: địa chỉ ảo, page table, page fault, swap. Module 4 — Quản lý bộ nhớ ngôn ngữ bậc cao — nâng lên một tầng: khi bạn viết Java, Python, Go, hay C, ai giải phóng bộ nhớ bạn cấp phát? Bạn sẽ thấy sự khác biệt giữa cấp phát thủ công (malloc/free) và garbage collection tự động — và vì sao có GC vẫn có thể rò bộ nhớ.
Bài tiếp theo: Module 4 — Quản lý bộ nhớ ngôn ngữ bậc cao: tổng quan
📚 Tài liệu mở rộng
- Sách (free online): Operating Systems: Three Easy Pieces (Remzi & Andrea Arpaci-Dusseau) — chương Paging (18–20), TLB (19), Swapping (21–22) là tài liệu OS chuẩn và dễ đọc nhất hiện tại.
- Bài viết kinh điển: What Every Programmer Should Know About Memory (Ulrich Drepper) — phần 4 về virtual memory và TLB đi sâu vào hiệu năng thực tế.
- Man page:
man 2 mmap— tài liệu chính thức về flags, error codes, và behaviour của mmap trên Linux.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên