Bài viết mới nhất

Tổng 1873 bài
Hệ điều hành 03/09/2026 9 phút

Tôi giết PID cha bằng SIGKILL — cú mạnh nhất có thể — mà ba tiến trình con vẫn sống nhăn

Trực giác nói 'cha chết thì con chết theo'. Tôi dựng cây tiến trình thật rồi bắn SIGKILL vào đúng PID cha: nó chết ngay, ba worker chẳng suy suyển. Vì tín hiệu không lan theo quan hệ cha–con. Muốn hạ cả cụm phải nhắm nhóm — kill(-pgid) một phát hạ tất. Đo thật trong container.

Hệ điều hành 03/09/2026 8 phút

getpid() tốn 120ns, gấp 55 lần một lời gọi hàm: và 'sự thật' tôi nhớ về nó đã hết hạn từ 2017

Một syscall (getpid) tốn ~120 ns, gấp ~55 lần một lời gọi hàm (~2 ns) — vì phải vượt vào kernel. Tôi tưởng glibc cache pid nên getpid rẻ; strace chứng minh nó trap mỗi lần (5 gọi = 5 syscall). glibc đã bỏ cache đó từ 2017 để đổi lấy tính đúng. Đừng tin sự thật nhớ được về hệ thống — đo trên máy thật.

Hệ điều hành 03/09/2026 10 phút

Cùng một cú ghi vào trang chỉ đọc: lần thì SIGSEGV chết tươi, lần thì kernel âm thầm sửa hộ

char *s="hello"; s[0]='H'; — biên dịch trót lọt, chạy thì chết. Tôi đo ba ca ghi vào trang chỉ đọc, cả ba SIGSEGV, suýt chốt 'ghi vào trang chỉ đọc thì chết'. Rồi ca thứ tư sau fork lật ngược: cùng cái bẫy phần cứng đó, kernel lại lặng lẽ copy trang chứ không giết. Đo thật trong container.

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

rand() % n làm nửa số ra gấp đôi nửa kia, và bit cuối chỉ đảo 0,1,0,1

rand() % 20000 đo ra lệch đúng 2 lần giữa hai vùng giá trị vì 32768 không chia hết cho 20000. Bit thấp nhất của LCG chỉ đảo 0,1,0,1 — chu kỳ 2, tất định hoàn toàn. Còn xorshift chạy 717 triệu số/giây, nhanh hơn rand() 2,8 lần nhưng tuyệt đối không dùng được cho mật mã. 'Ngẫu nhiên' là tính chất phải đo. Tôi đo.