ตาม Wikipedia (ซึ่งอาจผิด)
เมื่อมีการออกการเรียกระบบ fork () สำเนาของหน้าทั้งหมดที่เกี่ยวข้องกับกระบวนการหลักจะถูกสร้างขึ้นโหลดลงในตำแหน่งหน่วยความจำแยกต่างหากโดยระบบปฏิบัติการสำหรับกระบวนการลูก แต่นี่ไม่จำเป็นในบางกรณี พิจารณากรณีที่เมื่อเด็กรัน "
exec
" ระบบโทร (ที่ใช้ในการเรียกใช้ไฟล์ปฏิบัติการใด ๆ จากภายในโปรแกรม C) หรือออกในเร็ว ๆfork()
นี้หลังจากที่ เมื่อเด็กต้องการเพียงแค่เรียกใช้คำสั่งสำหรับกระบวนการหลักไม่จำเป็นต้องคัดลอกเพจกระบวนการหลักเนื่องจากexec
แทนที่พื้นที่ที่อยู่ของกระบวนการที่เรียกใช้งานด้วยคำสั่งที่จะดำเนินการในกรณีเช่นนี้จะใช้เทคนิคที่เรียกว่า copy-on-write (COW) ด้วยเทคนิคนี้เมื่อมีการแยกหน้าเพจของกระบวนการหลักจะไม่ถูกคัดลอกสำหรับกระบวนการลูก แต่จะมีการแชร์หน้าระหว่างเด็กและกระบวนการหลักแทน เมื่อใดก็ตามที่กระบวนการ (พาเรนต์หรือชายด์) แก้ไขเพจสำเนาที่แยกต่างหากของเพจนั้นจะถูกสร้างขึ้นสำหรับกระบวนการนั้น (พาเรนต์หรือชายด์) ซึ่งดำเนินการแก้ไข กระบวนการนี้จะใช้เพจที่คัดลอกใหม่แทนที่จะเป็นเพจที่แชร์ในการอ้างอิงในอนาคตทั้งหมด กระบวนการอื่น (กระบวนการที่ไม่ได้แก้ไขเพจที่ใช้ร่วมกัน) ยังคงใช้สำเนาต้นฉบับของหน้าต่อไป (ซึ่งตอนนี้ไม่ได้ถูกแชร์อีกต่อไป) เทคนิคนี้เรียกว่า copy-on-write เนื่องจากหน้าจะถูกคัดลอกเมื่อบางกระบวนการเขียนไป
ดูเหมือนว่าเมื่อกระบวนการอย่างใดอย่างหนึ่งพยายามที่จะเขียนไปยังหน้าสำเนาใหม่ของหน้าได้รับการจัดสรรและกำหนดให้กับกระบวนการที่สร้างความผิดหน้า หน้าเดิมได้รับการทำเครื่องหมายว่าสามารถเขียนได้ในภายหลัง
คำถามของฉันคือจะเกิดอะไรขึ้นหากการfork()
เรียกถูกเรียกหลายครั้งก่อนที่กระบวนการใด ๆ พยายามเขียนลงในเพจที่ใช้ร่วมกัน?
pmap -XX PID
cat /proc/PID/smap