Trên Linux, nếu bạn ngã ba() và các lối thoát khỏi quá trình rẽ nhánh (con) là tất cả các trang bộ nhớ ảo vẫn được đánh dấu là sao chép trên ghi trong phụ huynh?Nếu bạn ngã ba() và các lối thoát khỏi quá trình rẽ nhánh (con) là tất cả các trang VM vẫn đánh dấu COW trong phụ huynh?
Tôi nghĩ rằng các trang sẽ vẫn được đánh dấu là COW vì bất kỳ điều gì khác có thể sẽ cực kỳ tốn kém để triển khai, có thể yêu cầu số lượng trang trên mỗi trang và việc giữ sách đắt tiền khác. Nhưng tôi đã tự hỏi ngày khác, nếu tôi ngã ba một quá trình để thực hiện một số mã trong một "ảnh chụp ổn định" của quá trình hiện tại. Điều gì xảy ra khi tiến trình con thoát? Tất cả các trang bộ nhớ trong trang mẹ có được đánh dấu là copy-on-write không? Điều đó có nghĩa là forking trong một quá trình với rất nhiều bộ nhớ ảo (ví dụ: 128GB +) chỉ để thực thi một số mã trong vài phút sẽ gây ra sự xuống cấp hiệu suất kéo dài trong quá trình cha mẹ, hàng giờ hoặc thậm chí vài ngày sau đó (chưa kể đến cuộc gọi ngã ba đó sẽ không được giá rẻ.)
tôi chỉ tò mò như những gì các hành vi thực tế là trên Linux (và tôi không có ý tưởng làm thế nào tôi có thể kiểm tra nó.)
Tôi không chắc chắn, nhưng bạn nên sử dụng 'posix_spawn', không phải' fork', để chạy các chương trình bên ngoài. –
IIRC, COW được đặt trên * cả * trang cha và con. Người đầu tiên đến lấy pagefault và trang được nhân bản (và cả hai trang nhân bản đều không có COW nữa) BTW: bạn có thể nhìn vào nguồn gốc. Nó là mã nguồn mở, bạn biết đấy ... – wildplasser