ให้เราค้นหาความแตกต่างบางอย่างระหว่าง fork () และ vfork () ด้วยความช่วยเหลือของกราฟเปรียบเทียบที่แสดงด้านล่าง
แผนภูมิเปรียบเทียบ
พื้นฐานสำหรับการเปรียบเทียบ | ส้อม() | vfork () |
---|---|---|
ขั้นพื้นฐาน | กระบวนการลูกและกระบวนการหลักมีการแยกช่องว่างที่อยู่ | กระบวนการลูกและกระบวนการหลักใช้พื้นที่ที่อยู่เดียวกัน |
การกระทำ | ผู้ปกครองและกระบวนการเด็กดำเนินการพร้อมกัน | กระบวนการหลักยังคงถูกระงับจนกว่ากระบวนการลูกจะดำเนินการให้เสร็จสมบูรณ์ |
การแก้ไข | หากกระบวนการย่อยเปลี่ยนแปลงหน้าใด ๆ ในพื้นที่ที่อยู่จะไม่สามารถมองเห็นกระบวนการหลักได้เนื่องจากพื้นที่ที่อยู่แยกต่างหาก | หากกระบวนการย่อยเปลี่ยนแปลงหน้าใด ๆ ในพื้นที่ที่อยู่จะสามารถเห็นกระบวนการหลักได้เนื่องจากพวกเขาแบ่งปันพื้นที่ที่อยู่เดียวกัน |
คัดลอกบนเขียน | fork () ใช้ copy-on-write เป็นทางเลือกโดยที่ parent และ child แชร์เพจเดียวกันจนกว่าเพจใดเพจหนึ่งจะแก้ไขเพจที่แบ่งใช้ | vfork () ไม่ใช้ copy-on-write |
คำจำกัดความของ fork ()
fork () เป็นการเรียกระบบใช้เพื่อสร้าง กระบวนการใหม่ กระบวนการใหม่ที่สร้างขึ้นโดยการเรียก fork () เป็นกระบวนการลูกของกระบวนการที่เรียกใช้การเรียกระบบ fork () รหัสของกระบวนการลูกจะเหมือนกับรหัสของกระบวนการหลัก หลังจากการสร้างกระบวนการเด็กกระบวนการทั้งสองคือกระบวนการพ่อแม่และลูกเริ่มต้นการดำเนินการจากคำสั่งถัดไปหลังจาก fork () และกระบวนการทั้งสองได้รับการดำเนินการ พร้อมกัน
กระบวนการหลักและกระบวนการลูกมี พื้นที่ที่อยู่แยกต่างหาก ดังนั้นเมื่อกระบวนการใด ๆ ปรับเปลี่ยนคำสั่งหรือตัวแปรใด ๆ ในรหัส มันจะไม่ปรากฏในรหัสกระบวนการอื่น ๆ สมมติว่าถ้ากระบวนการลูกแก้ไขรหัสมันจะไม่ส่งผลกระทบต่อกระบวนการหลัก
กระบวนการลูกบางอย่างหลังจากการสร้างของพวกเขาทันทีเรียก exec () การเรียกระบบ exec () แทนที่กระบวนการ ด้วยโปรแกรมที่ระบุในพารามิเตอร์ จากนั้นพื้นที่ที่อยู่แยกต่างหากของกระบวนการลูกไม่ได้ใช้งาน ทางเลือกหนึ่งที่นี่คือการคัดลอกเมื่อเขียน
การ คัดลอกเมื่อเขียน ให้กระบวนการผู้ปกครองและเด็กที่จะแบ่งปันพื้นที่ที่อยู่เดียวกัน หากกระบวนการใด ๆ ที่เขียนบนหน้าในพื้นที่ที่อยู่สำเนาของพื้นที่ที่อยู่ถูกสร้างขึ้นเพื่อให้กระบวนการทั้งสองทำงานอย่างอิสระ
คำจำกัดความของ vfork ()
รุ่น fork ที่แก้ไข () คือ vfork () การเรียกใช้ระบบ vfork () ยังใช้เพื่อสร้างกระบวนการใหม่ คล้ายกับ fork () ที่นี่ยังมีกระบวนการใหม่ที่สร้างขึ้นเป็นกระบวนการเด็กของกระบวนการที่เรียก vfork () รหัสกระบวนการลูกก็เหมือนกับรหัสกระบวนการหลัก ที่นี่กระบวนการย่อย หยุดการประมวลผล ของพาเรนต์จนกว่าการประมวลผลจะเสร็จสิ้นเนื่องจากกระบวนการทั้งสองใช้พื้นที่ที่อยู่เดียวกันร่วมกัน
ในขณะที่กระบวนการลูกและผู้ปกครองแบ่งปัน พื้นที่ที่อยู่เดียวกัน หากกระบวนการใด ๆ แก้ไขรหัสก็จะปรากฏให้เห็นกระบวนการอื่น ๆ ที่ใช้หน้าเดียวกัน ให้เราสมมติว่ากระบวนการหลักเปลี่ยนแปลงรหัสหรือไม่ มันจะสะท้อนให้เห็นในรหัสของกระบวนการเด็ก
ในฐานะที่ใช้ vfork () ไม่ได้สร้างการแยกพื้นที่ที่อยู่สำหรับกระบวนการลูกและผู้ปกครอง ดังนั้นจึงต้อง ดำเนินการใน กรณีที่กระบวนการลูกเรียก exec () ทันทีหลังจากการสร้าง ดังนั้นจะไม่มีการสูญเสียพื้นที่ที่อยู่และเป็นวิธีที่ มีประสิทธิภาพ ในการสร้างกระบวนการ vfork ไม่ได้ใช้ copy-on-write
ความแตกต่างที่สำคัญระหว่าง fork () และ vfork ()
- ความแตกต่างหลักระหว่าง fork และ vfork คือกระบวนการลูกที่สร้างโดย fork มี พื้นที่หน่วยความจำแยก จากกระบวนการหลัก อย่างไรก็ตามกระบวนการลูกที่สร้างขึ้นโดยการโทรของระบบ vfork แบ่งปัน พื้นที่ที่อยู่เดียวกัน ของกระบวนการหลัก
- กระบวนการลูกที่สร้างขึ้นโดยใช้ส้อม ดำเนินการพร้อมกัน กับกระบวนการหลัก ในขณะที่กระบวนการเด็กที่สร้างขึ้นโดยใช้ vfork ระงับ การดำเนินการของกระบวนการหลักจนกว่าการดำเนินการจะเสร็จสมบูรณ์
- เนื่องจากพื้นที่หน่วยความจำของกระบวนการพาเรนต์และชายด์คือการดัดแปลงแยกต่างหากโดยกระบวนการใด ๆ จึงไม่ส่งผลกระทบต่อเพจของผู้อื่น อย่างไรก็ตามในขณะที่กระบวนการผู้ปกครองและเด็กใช้ร่วมกันการปรับเปลี่ยนที่อยู่หน่วยความจำเดียวกันที่ทำโดยกระบวนการใด ๆ สะท้อนให้เห็นในพื้นที่ที่อยู่
- call call ของระบบ () ใช้ copy-on-write เป็นทางเลือกซึ่งช่วยให้กระบวนการลูกและผู้ปกครองแชร์พื้นที่ที่อยู่เดียวกันจนกว่าจะมีการแก้ไขหน้า ในทางตรงกันข้าม vfork ไม่ได้ใช้ copy-on-write
สรุป:
การเรียกใช้ระบบ vfork () จะต้องดำเนินการเมื่อมีการเรียกใช้กระบวนการลูกเรียก exec () ทันทีหลังจากการสร้างโดยใช้ fork () เนื่องจากพื้นที่ที่อยู่แยกต่างหากสำหรับกระบวนการลูกและผู้ปกครองจะไม่ใช้ที่นี่