Theo Wikipedia (có thể sai)
Khi một lệnh gọi hệ thống fork () được phát ra, một bản sao của tất cả các trang tương ứng với tiến trình cha mẹ được tạo ra, được HĐH nạp vào một vị trí bộ nhớ riêng cho tiến trình con. Nhưng điều này là không cần thiết trong một số trường hợp nhất định. Hãy xem xét trường hợp khi một đứa trẻ thực hiện một
exec
cuộc gọi hệ thống "" (được sử dụng để thực hiện bất kỳ tệp thực thi nào từ trong chương trình C) hoặc thoát ra rất nhanh sau đófork()
. Khi đứa trẻ cần thiết chỉ để thực thi một lệnh cho tiến trình cha, không cần sao chép các trang của tiến trình cha, vìexec
thay thế không gian địa chỉ của tiến trình đã gọi nó bằng lệnh được thực thi.Trong những trường hợp như vậy, một kỹ thuật gọi là copy-on-write (COW) được sử dụng. Với kỹ thuật này, khi một ngã ba xảy ra, các trang của quy trình cha không được sao chép cho quy trình con. Thay vào đó, các trang được chia sẻ giữa trẻ và quá trình cha mẹ. Bất cứ khi nào một quá trình (cha mẹ hoặc con cái) sửa đổi một trang, một bản sao riêng của trang cụ thể đó được tạo ra cho quá trình đó (cha mẹ hoặc con cái) thực hiện sửa đổi. Quá trình này sau đó sẽ sử dụng trang mới được sao chép thay vì trang được chia sẻ trong tất cả các tài liệu tham khảo trong tương lai. Quá trình khác (quy trình không sửa đổi trang được chia sẻ) tiếp tục sử dụng bản sao gốc của trang (hiện không còn được chia sẻ). Kỹ thuật này được gọi là copy-on-write vì trang được sao chép khi một số tiến trình ghi vào nó.
Có vẻ như khi một trong các quy trình cố gắng ghi vào trang, một bản sao mới của trang sẽ được phân bổ và gán cho quy trình tạo ra lỗi trang. Trang gốc được đánh dấu có thể ghi được sau đó.
Câu hỏi của tôi là: điều gì xảy ra nếu fork()
được gọi nhiều lần trước khi bất kỳ quy trình nào thực hiện ghi vào trang chia sẻ?
pmap -XX PID
hoặc cat /proc/PID/smap
.