2013-03-23 17 views
5

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ó.)

+0

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. –

+0

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

Trả lời

8

Ngoài các ghi copy-on- bit cũng có số tham chiếu trong bảng trang. Vì vậy, khi một nhánh trẻ em, tất cả các trang không phải riêng tư trong cha mẹ được đánh dấu COW, và số lượng tham chiếu được tăng lên.

Sau đó, khi quá trình con đang chạy và cha mẹ viết một trang, trang sẽ bị lỗi trang và trang được sao chép như bạn mong đợi và số lượng tham chiếu bị giảm. Khi con thoát, nó sẽ giảm tất cả các tham chiếu trang của nó với một trang và các trang có số tham chiếu bằng không được bỏ đi.

Bây giờ khi cha mẹ viết một trang có bộ COW bit và số tham chiếu của một, COW-bit chỉ đơn giản là bị bỏ qua.

+0

Bây giờ thật ngọt ngào! – Eloff

0

Dấu hạt nhân đánh dấu tất cả các trang được chia sẻ là được bảo vệ chống ghi, do đó dẫn đến ngoại lệ nếu cố gắng sửa đổi một. Bản sao được tạo và được đánh dấu là có thể ghi (do đó không có ngoại lệ), trong khi bản gốc vẫn được bảo vệ chống ghi.

Nếu bản gốc được ghi vào, ngoại lệ khác xảy ra, nhưng hạt nhân sẽ thấy rằng trang đó không được chia sẻ bởi bất kỳ quá trình nào khác và do đó sẽ đánh dấu trang đó là có thể ghi. Khi một quá trình chấm dứt, tất cả các trang của nó sẽ được giải phóng, và do đó hạt nhân sẽ xóa bỏ trạng thái COW một cách hiệu quả khỏi mọi trang trong phụ huynh khi nó được sửa đổi.

Các vấn đề liên quan