Bộ nhớ/Module 3 — Tổng kết & cheat sheet
20/26
Bài 20 / 26~12 phútBộ nhớ ảoMiễn phí lượt xem

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). mmapcopy-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ệmCốt lõiPitfall / 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 RAMIn 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ùngSo sánh địa chỉ giữa 2 process là vô nghĩa
Page / FrameTrang ả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 tableMảng PTE: mỗi trang ảo → khung vật lý + metadata bitsMulti-level để tiết kiệm RAM cho sparse address space
PTEpresent, accessed, dirty, write-protect bits + PFNThiếu hiểu PTE → không hiểu fault và COW
VPN / PFN / offsetVPN tra bảng → PFN; offset giữ nguyênoffset = bit thấp của địa chỉ, không dịch
MMUPhần cứng dịch VA → PA mỗi truy cậpKhông thể tắt — luôn chạy khi user mode
TLBCache (VA→PA) trong CPU — ~1–4 chu kỳ khi hitMiss → page walk → 100–200 chu kỳ; TLB flush khi context switch
Page walkDuyệt multi-level page table khi TLB missTốn kém — lý do TLB tồn tại
Page faultPTE present=0 → trap OSMinor (map lại, nhanh) vs major (đọc đĩa, chậm)
Demand pagingRAM chỉ gán khi trang bị chạm thậtmalloc lớn không tiêu RAM ngay
SwapTrang ít dùng đẩy ra đĩa; nạp lại khi cầnChậm ~1.000–100.000× RAM; không thay thế RAM
Clock algorithmDuyệt vòng, clear accessed bit, chọn khung accessed=0Dirty bit = phải ghi ra swap trước khi evict
ThrashingWorking set vượt RAM → swap liên tục → throughput ~0Thêm tiến trình khi RAM căng = phản tác dụng
Working setTập trang dùng tích cực trong cửa sổ thời gian gầnOOM killer khi cả RAM+swap cạn
mmapFile ánh xạ vào địa chỉ ảo, nạp theo demand pagingMAP_SHARED ghi ngược file; MAP_PRIVATE dùng COW
Copy-on-writeChia sẻ trang read-only đến khi bị ghi → OS copy trangFork write-heavy = RAM peak 2× data size

📖 Glossary module

Thuật ngữĐịnh nghĩa 1 câu
Địa chỉ ảoToạ độ 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 tableCấu trúc dữ liệu (OS duy trì) ánh xạ trang ảo sang khung vật lý
PTEPage Table Entry — một hàng trong page table: PFN + các metadata bit
VPNVirtual Page Number — phần cao của địa chỉ ảo, dùng làm index tra page table
PFNPhysical Frame Number — chỉ số khung vật lý trong PTE
OffsetPhần thấp của địa chỉ — vị trí byte bên trong trang, giữ nguyên khi dịch
MMUMemory Management Unit — phần cứng dịch VA → PA mỗi truy cập bộ nhớ
TLBTranslation Lookaside Buffer — cache (VA→PA) trong CPU, tránh page walk
Page walkDuyệt multi-level page table từ CR3 để tìm PTE khi TLB miss
Multi-level page tablePage table phân cấp để không cấp phát bảng cho vùng địa chỉ trống
Page faultException khi PTE present=0 — trap vào OS để xử lý (minor hoặc major)
Minor faultPage fault khi trang đã trong RAM nhưng chưa map — chỉ cần cập nhật PTE
Major faultPage fault khi trang phải đọc từ đĩa/swap — tốn I/O
Demand pagingChiến lược chỉ gán RAM vật lý khi trang bị chạm lần đầu (lazy allocation)
SwapVùng lưu trữ trên đĩa chứa trang bị đẩy ra khỏi RAM
Page replacementThuật toán chọn trang nào swap-out khi RAM đầy (LRU, clock…)
ThrashingTrạng thái working set vượt RAM, OS swap liên tục, throughput gần 0
Working setTập trang tiến trình truy cập tích cực trong cửa sổ thời gian gần nhất
mmapSyscall ánh xạ file hoặc vùng ẩn danh vào không gian địa chỉ ảo
Copy-on-writeKỹ thuật chia sẻ trang read-only giữa tiến trình đến khi một bên ghi
forkTạ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.
    • Nếu chưa: đọc lại bài 02 mục 2–3 và bài 03 mục 2–4.
  • 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

Đặt 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