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.