ส้อมกับด้ายต่างกันอย่างไร?


คำตอบ:


99

ส้อมช่วยให้คุณมีกระบวนการใหม่ล่าสุดซึ่งเป็นสำเนาของกระบวนการปัจจุบันโดยมีส่วนรหัสเดียวกัน เมื่ออิมเมจหน่วยความจำเปลี่ยนไป (โดยทั่วไปเกิดจากพฤติกรรมที่แตกต่างกันของทั้งสองกระบวนการ) คุณจะได้รับการแยกภาพหน่วยความจำ (คัดลอกเมื่อเขียน) อย่างไรก็ตามรหัสปฏิบัติการจะยังคงเหมือนเดิม งานจะไม่ใช้หน่วยความจำร่วมกันเว้นแต่จะใช้Inter Process Communication (IPC)แบบดั้งเดิม

กระบวนการหนึ่งสามารถมีหลายเธรดโดยแต่ละกระบวนการทำงานแบบขนานภายในบริบทเดียวกันของกระบวนการ หน่วยความจำและทรัพยากรอื่น ๆ ร่วมกันระหว่างหัวข้อข้อมูลที่ใช้ร่วมกันดังนั้นจึงต้องเข้าถึงได้ผ่านทางวัตถุบางดั้งเดิมและการประสาน (เช่นmutexes , ตัวแปรสภาพและsemaphores ) ที่ช่วยให้คุณเพื่อหลีกเลี่ยงความเสียหายของข้อมูล


3
คุณอาจต้องการอ้างถึง "สำเนาของกระบวนการปัจจุบัน" เป็นกระบวนการย่อย

1
อย่างไรก็ตามส่วนข้อความมักจะใช้ร่วมกัน (เสมือน) และแม้แต่ส่วนข้อมูลก็สามารถคัดลอกเมื่อเขียนได้
จ่อคิว


80

ส้อม

Fork ไม่ใช่กระบวนการใหม่ที่ดูเหมือนกระบวนการเก่าหรือกระบวนการหลัก แต่ก็ยังเป็นกระบวนการที่แตกต่างกันโดยมี ID กระบวนการที่แตกต่างกันและมีหน่วยความจำของตัวเอง กระบวนการพาเรนต์สร้างพื้นที่แอดเดรสแยกต่างหากสำหรับเด็ก ทั้งกระบวนการหลักและกระบวนการย่อยมีส่วนของรหัสเดียวกัน แต่ดำเนินการแยกจากกัน

ตัวอย่างที่ง่ายที่สุดของการฟอร์กคือเมื่อคุณรันคำสั่งบนเชลล์ใน Unix / Linux ทุกครั้งที่ผู้ใช้ออกคำสั่งเชลล์จะแยกกระบวนการลูกและงานจะเสร็จสิ้น

เมื่อมีการเรียกใช้ระบบ fork สำเนาของเพจทั้งหมดที่เกี่ยวข้องกับกระบวนการพาเรนต์จะถูกสร้างขึ้นโดยโหลดลงในตำแหน่งหน่วยความจำแยกต่างหากโดยระบบปฏิบัติการสำหรับกระบวนการย่อย แต่ในบางกรณีก็ไม่จำเป็น เช่นเดียวกับในการเรียกระบบ 'exec' ไม่จำเป็นต้องคัดลอกหน้ากระบวนการหลักเนื่องจาก execv จะแทนที่พื้นที่ที่อยู่ของกระบวนการหลักเอง

สิ่งที่ควรทราบเกี่ยวกับการตีมีดังนี้:

  • กระบวนการย่อยจะมี ID กระบวนการเฉพาะของตนเอง
  • กระบวนการย่อยจะต้องมีสำเนาของตัวอธิบายไฟล์ของพาเรนต์
  • การล็อกไฟล์ที่ตั้งค่าโดยกระบวนการหลักจะไม่ถูกสืบทอดโดยกระบวนการย่อย
  • semaphores ใด ๆ ที่เปิดในกระบวนการหลักจะต้องเปิดในกระบวนการย่อยด้วย
  • กระบวนการย่อยต้องมีสำเนาของตัวบอกคิวข้อความของผู้ปกครอง
  • เด็กจะมีพื้นที่ที่อยู่และหน่วยความจำของตัวเอง

เธรด

เธรดเป็นกระบวนการน้ำหนักเบา (LWPs) ตามเนื้อผ้าเธรดเป็นเพียงสถานะ CPU (และสถานะขั้นต่ำอื่น ๆ ) ที่มีกระบวนการที่มีส่วนที่เหลือ (ข้อมูล, สแต็ก, I / O, สัญญาณ) เธรดต้องการค่าใช้จ่ายน้อยกว่าการ“ ฟอร์ก” หรือการสร้างกระบวนการใหม่เนื่องจากระบบไม่ได้เตรียมใช้งานพื้นที่หน่วยความจำเสมือนของระบบใหม่และสภาพแวดล้อมสำหรับกระบวนการ ในขณะที่มีประสิทธิภาพสูงสุดในระบบมัลติโปรเซสเซอร์ซึ่งสามารถกำหนดตารางการไหลของกระบวนการให้ทำงานบนโปรเซสเซอร์อื่นได้ดังนั้นจึงได้รับความเร็วผ่านการประมวลผลแบบขนานหรือแบบกระจาย แต่ยังพบการเพิ่มขึ้นในระบบยูนิโพรเซสเซอร์ซึ่งใช้ประโยชน์จากเวลาแฝงใน I / O และฟังก์ชันระบบอื่น ๆ ซึ่งอาจหยุดกระบวนการ การดำเนินการ

เธรดในกระบวนการเดียวกันใช้ร่วมกัน:

  • คำแนะนำกระบวนการ
  • ข้อมูลส่วนใหญ่
  • เปิดไฟล์ (ตัวอธิบาย)
  • สัญญาณและตัวจัดการสัญญาณ
  • ไดเร็กทอรีการทำงานปัจจุบัน
  • รหัสผู้ใช้และกลุ่ม

รายละเอียดเพิ่มเติมสามารถพบได้ที่นี่


2
กระบวนการสามารถมีหลายเธรด หากเธรดใดเธรดหนึ่งในกระบวนการเรียกใช้ fork กระบวนการที่แยกจะมีหน่วยความจำที่ซ้ำกันทั้งหมด แต่มีเพียงเธรดการเรียกเท่านั้นที่อยู่ในกระบวนการใหม่
Michael


31

คำตอบของ Dacav นั้นยอดเยี่ยมฉันแค่อยากจะเพิ่มว่าไม่ใช่ทุกรุ่นเธรดที่ให้การประมวลผลหลายอย่างแท้จริง

ตัวอย่างเช่นการใช้เธรดเริ่มต้นของ Ruby ไม่ได้ใช้เธรด OS / เคอร์เนลที่แท้จริง แทนที่จะเลียนแบบการมีเธรดหลายเธรดโดยการสลับระหว่างอ็อบเจ็กต์เธรดภายในเคอร์เนลเธรด / กระบวนการเดียว

สิ่งนี้มีความสำคัญในระบบมัลติโปรเซสเซอร์ / มัลติคอร์เนื่องจากเธรดน้ำหนักเบาประเภทนี้สามารถทำงานบนคอร์เดียวเท่านั้น - คุณไม่ได้รับประสิทธิภาพมากนักจากการมีเธรดหลายเธรด

สถานที่อื่นที่สร้างความแตกต่างคือเมื่อเธรดหนึ่งบล็อก (รอ I / O หรือเรียก IOCTL ของไดรเวอร์) บล็อกเธรดทั้งหมด

สิ่งนี้ไม่ได้เกิดขึ้นบ่อยนักในปัจจุบันการใช้งานเธรดส่วนใหญ่ใช้เคอร์เนลเธรดซึ่งไม่ประสบปัญหาเหล่านี้ แต่ควรคำนึงถึงความสมบูรณ์

ในทางตรงกันข้าม fork จะให้กระบวนการอื่นที่รันได้พร้อมกันบน CPU ทางกายภาพอื่นในขณะที่กระบวนการดั้งเดิมกำลังดำเนินการ บางคนพบว่า IPC เหมาะกับแอปของตนมากกว่าส่วนคนอื่น ๆ ชอบเธรด

ขอให้โชคดีและสนุก! มัลติเธรดมีทั้งความท้าทายและคุ้มค่า


8
+1 สำหรับการกดทับเส้นประสาท: "ไม่ใช่ทุกเธรดที่ให้การประมวลผลหลายขั้นตอนที่แท้จริงแก่คุณ"
Dacav

5

เธรดเป็นฟังก์ชันที่ทำงานแบบขนานส้อมเป็นกระบวนการใหม่ที่มีการสืบทอดพ่อแม่ เธรดเป็นสิ่งที่ดีในการรันงานแบบขนานในขณะที่ส้อมเป็นกระบวนการอิสระที่ทำงานพร้อมกัน เธรดมีเงื่อนไขการแข่งขันและมีเซมาฟอร์ควบคุมและล็อคหรือมิวเท็กซ์ท่อสามารถใช้ได้ทั้งในส้อมและเธรด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.