Làm thế nào một quả bom ngã ba hoạt động: trong mã C (hoặc giống như C), một hàm có tên fork()
được gọi. Điều này khiến linux hoặc Unix hoặc Unix-a-like tạo ra một quy trình hoàn toàn mới. Quá trình này có một không gian địa chỉ, ID tiến trình, mặt nạ tín hiệu, mô tả tệp mở, tất cả các cách chiếm không gian trong bộ nhớ có phần hạn chế của nhân hệ điều hành. Quá trình mới được tạo cũng có một vị trí trong cấu trúc dữ liệu của kernel để các tiến trình chạy. Đối với quá trình được gọi fork()
, có vẻ như không có gì xảy ra. Một quá trình ném bom sẽ cố gắng gọi fork()
nhanh nhất có thể, nhiều lần nhất có thể.
Thủ thuật là quá trình mới được tạo cũng trở lại từfork()
cùng một mã. Sau một ngã ba, bạn có hai quy trình chạy cùng một mã. Mỗi quá trình ném bom mới cố gắng gọi fork()
nhanh nhất có thể, nhiều lần có thể. Mã bạn đã đưa ra làm ví dụ là phiên bản Bash-script của bom ngã ba.
Ngay sau đó, tất cả các tài nguyên liên quan đến quá trình của nhân hệ điều hành sẽ được sử dụng hết. Bảng quy trình đã đầy. Danh sách các quy trình chờ để chạy đã đầy. Bộ nhớ thực đã đầy, vì vậy phân trang bắt đầu. Nếu điều này diễn ra đủ lâu, phân vùng trao đổi sẽ lấp đầy.
Điều này trông giống như một người dùng: mọi thứ chạy siêu chậm. Bạn nhận được thông báo lỗi như "không thể tạo quy trình" khi bạn thử những thứ đơn giản như ls
. Cố gắng ps
gây ra một khoảng dừng tạm thời (nếu nó hoàn toàn chạy) và đưa ra một danh sách rất dài các quy trình. Đôi khi tình huống này yêu cầu khởi động lại thông qua dây nguồn.
Bom ngã ba từng được gọi là "thỏ" ngày xưa. Vì chúng sinh sản rất nhanh.
Để cho vui, tôi đã viết một chương trình ném bom trong C:
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
while (1)
fork();
return 0;
}
Tôi đã biên dịch và chạy chương trình đó dưới Arch Linux trong một xterm. Tôi một xterm khác tôi đã cố gắng để có được một danh sách quá trình:
1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable
Vỏ Z trong xterm thứ 2 không thể gọi fork()
thành công vì các quá trình ném bom liên kết với xterm thứ 1 đã sử dụng hết tất cả các tài nguyên hạt nhân liên quan đến quá trình được tạo và chạy.