Giải thuật 03/09/2026 9 phút

Tạo một luồng tốn 47µs, fork một tiến trình chỉ 82µs: cả hai niềm tin thường gặp đều sai

Tưởng tạo luồng gần như miễn phí, còn fork đắt gấp trăm lần vì phải nhân đôi cả bộ nhớ? Tôi đo: tạo+join một luồng rỗng mất ~47µs (không hề miễn phí), fork+waitpid ~82µs — fork chỉ 1,8 lần thread nhờ copy-on-write. Cả hai đều tốn hàng chục micro giây, và đó là lý do có thread pool.

Giải thuật 03/09/2026 9 phút

Đổi qua lại giữa hai tiến trình không hề đắt hơn giữa hai luồng — sách đã lỗi thời

Tưởng chuyển ngữ cảnh gần như tức thì, và chuyển giữa tiến trình đắt hơn hẳn giữa luồng vì phải xả TLB? Tôi đo bằng ping-pong qua pipe: mỗi lần chuyển ~8,5µs (hàng nghìn chu kỳ, không tức thì), và tiến trình bằng luồng (~1,0x) nhờ TLB gắn nhãn ASID. Một 'sự thật' sách giáo khoa đã lỗi thời vì phần cứng tiến hóa.

Giải thuật 03/09/2026 9 phút

Mutex không tranh chấp chỉ tốn 3,3ns: cái đắt của khóa không nằm ở nơi bạn tưởng

Tưởng khóa luôn đắt, hoặc mutex bị giành thì mỗi thao tác tốn ~8,5µs vì luồng phải ngủ? Tôi đo tinh tế hơn: không tranh chấp chỉ 3,3ns (futex, không vào nhân), tranh chấp với vùng tới hạn ngắn chỉ ~25ns (spin + cache nảy), chỉ vùng tới hạn dài mới thật sự ngủ. Cái đắt là tranh chấp nhân độ dài vùng tới hạn, không phải việc khóa.

Giải thuật 03/09/2026 9 phút

Atomic 'lock-free' vẫn chậm 10 lần khi đông, và vòng CAS còn thua cả mutex

Tưởng atomic miễn phí, lock-free nên không bị tranh chấp, luôn nhanh hơn mutex nhiều lần? Tôi đo cả ba đều lệch: atomic không tranh chấp chỉ ~1,6ns (rẻ hơn mutex 2 lần, cùng bậc), fetch_add tranh chấp vẫn chậm 10 lần vì cache nảy, và vòng CAS 8 luồng chậm hơn cả mutex vì phải thử lại. Lock-free không phải contention-free.

Giải thuật 03/09/2026 9 phút

Mỗi luồng ghi biến riêng, không chia sẻ gì — vẫn chậm gấp đôi: bí ẩn false sharing

Tưởng hai biến khác nhau, mỗi luồng ghi biến của riêng mình thì không thể ảnh hưởng nhau? Tôi đo: chúng làm nhau chậm 2,05 lần ở 8 luồng vì tình cờ nằm chung một dòng cache 64 byte — false sharing. Căn lề mỗi biến sang một dòng riêng thì nhanh gấp đôi, dù logic không đổi một chữ. Bug hiệu năng vô hình trong mã nguồn.

Giải thuật 03/09/2026 9 phút

16 luồng chạy chậm hơn 1 luồng 16 lần: khi thêm luồng làm chương trình tệ đi

Tưởng thêm luồng luôn nhanh hơn và song song scale tuyến tính? Tôi đo hai workload trên cùng một máy: loại độc lập scale tới ~số lõi (4,86× ở 16 luồng), còn loại cùng ghi một biến scale ÂM — 16 luồng chỉ bằng 6% một luồng. Khác biệt duy nhất là có chia sẻ ghi hay không. Song song không tự động nhanh.