Hệ điều hành: đo thật
Sê-ri 45 bài đo thật về hệ điều hành bằng C trong container Linux: syscall, tiến trình/fork, bộ nhớ ảo, page cache, lập lịch, I/O — mỗi bài một phép đo, một đo hớ, một sơ đồ.
9/45 phần đã đăng
Giải thuật
1
Chi phí một system call
Tưởng getpid() được glibc cache nên gần như free, và hàm nào trông như syscall thì đều vào kernel. Đo ra: một syscall thật ~103ns (450x một phép tính), getpid glibc không còn cache nên vẫn 100ns, còn clock_gettime qua vDSO chỉ 12,7ns vì không vào kernel. Đo thật.
03/09/2026
· 7 phút đọc
2
fork: chi phí tạo tiến trình
Tưởng fork đắt vì phải sao chép cả bộ nhớ. Đo ra: Copy-on-Write nên fork KHÔNG chép dữ liệu — chỉ 74µs, 1,6 lần một luồng. Nhưng CoW không làm fork miễn phí theo kích thước: fork sau khi cấp 256MB chậm 1,86 lần vì phải nhân đôi bảng trang. Đo thật.
03/09/2026
· 7 phút đọc
3
Copy-on-write sau fork
Tưởng sau fork con đọc/ghi đều như thường, và Copy-on-Write là miễn phí. Đo ra: đọc trang rẻ (15,6ns) nhưng lần GHI đầu vào mỗi trang tốn 909ns — 96 lần lần ghi sau — vì mỗi trang phải chịu một CoW fault (bẫy, cấp trang, chép 4KB). CoW không free, chỉ hoãn. Đo thật.
03/09/2026
· 7 phút đọc
4
exec: nạp một chương trình
Tưởng exec chỉ là nhảy vào chương trình mới nên rẻ. Đo ra: execve tốn 45,6µs cho binary tĩnh (nạp ELF, ánh xạ segment), và 73,5µs cho binary động — chậm 1,61 lần vì trình liên kết ld.so phải phân giải symbol trước main. Đo thật.
03/09/2026
· 7 phút đọc
5
Chuyển ngữ cảnh: tiến trình vs luồng
Tưởng chuyển ngữ cảnh giữa hai tiến trình đắt hơn nhiều so với giữa hai luồng vì phải flush TLB. Đo ra: chỉ 1,09 lần (579ns vs 532ns) — CPU hiện đại gắn ASID nên đổi bảng trang không cần flush TLB. Chênh thật ngoài đời là gián tiếp. Đo thật.
03/09/2026
· 7 phút đọc
6
Chi phí một page fault
Tưởng mmap/malloc xong là có bộ nhớ dùng ngay, và đo chi phí fault chỉ cần chạm trang rồi chia. Đo ra: một minor fault ~368ns, nhưng rusage lộ ra chỉ 364 fault cho 30000 trang vì huge page gom 512 trang mỗi fault. Đếm số fault thật, đừng giả định. Đo thật.
03/09/2026
· 7 phút đọc
7
mmap vs malloc
Tưởng malloc lớn (>128KB) luôn dùng mmap nên chậm như mmap trực tiếp. Đo ra: malloc 256KB chỉ 10ns vì ngưỡng mmap của glibc là động — nó giữ khối trong arena để tái dùng; ép phải mmap thì thành 1445ns. malloc nhanh vì tái dùng, không phải phép màu. Đo thật.
03/09/2026
· 7 phút đọc
8
TLB và chi phí TLB miss
Tưởng chỉ cache dữ liệu mới quyết định tốc độ truy cập bộ nhớ. Đo ra: TLB — cache dịch địa chỉ — cũng là một giới hạn. Cùng một vùng 67MB, trang 4KB chậm 1,52 lần so với huge page 2MB dù dữ liệu và cache y hệt: phần chênh ~19ns là TLB miss thuần. Đo thật.
03/09/2026
· 7 phút đọc
9
Huge pages: đo tác động
Tưởng huge page luôn nhanh hơn. Đo ra: nó chỉ giúp khi TLB là nút thắt — vùng 0,3MB vừa TLB chỉ nhanh 1,13 lần (gần như không giúp), phải tới 67MB vượt TLB mới thắng 1,66 lần. Và có mặt trái: page fault huge zero cả 2MB, khựng ~40µs. Đo thật.
03/09/2026
· 7 phút đọc
Còn 36 phần nữa sẽ lần lượt được đăng.