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