ใครช่วยอธิบายความแตกต่างระหว่างส้อมกับด้ายได้ไหม
ใครช่วยอธิบายความแตกต่างระหว่างส้อมกับด้ายได้ไหม
คำตอบ:
ส้อมช่วยให้คุณมีกระบวนการใหม่ล่าสุดซึ่งเป็นสำเนาของกระบวนการปัจจุบันโดยมีส่วนรหัสเดียวกัน เมื่ออิมเมจหน่วยความจำเปลี่ยนไป (โดยทั่วไปเกิดจากพฤติกรรมที่แตกต่างกันของทั้งสองกระบวนการ) คุณจะได้รับการแยกภาพหน่วยความจำ (คัดลอกเมื่อเขียน) อย่างไรก็ตามรหัสปฏิบัติการจะยังคงเหมือนเดิม งานจะไม่ใช้หน่วยความจำร่วมกันเว้นแต่จะใช้Inter Process Communication (IPC)แบบดั้งเดิม
กระบวนการหนึ่งสามารถมีหลายเธรดโดยแต่ละกระบวนการทำงานแบบขนานภายในบริบทเดียวกันของกระบวนการ หน่วยความจำและทรัพยากรอื่น ๆ ร่วมกันระหว่างหัวข้อข้อมูลที่ใช้ร่วมกันดังนั้นจึงต้องเข้าถึงได้ผ่านทางวัตถุบางดั้งเดิมและการประสาน (เช่นmutexes , ตัวแปรสภาพและsemaphores ) ที่ช่วยให้คุณเพื่อหลีกเลี่ยงความเสียหายของข้อมูล
Fork ไม่ใช่กระบวนการใหม่ที่ดูเหมือนกระบวนการเก่าหรือกระบวนการหลัก แต่ก็ยังเป็นกระบวนการที่แตกต่างกันโดยมี ID กระบวนการที่แตกต่างกันและมีหน่วยความจำของตัวเอง กระบวนการพาเรนต์สร้างพื้นที่แอดเดรสแยกต่างหากสำหรับเด็ก ทั้งกระบวนการหลักและกระบวนการย่อยมีส่วนของรหัสเดียวกัน แต่ดำเนินการแยกจากกัน
ตัวอย่างที่ง่ายที่สุดของการฟอร์กคือเมื่อคุณรันคำสั่งบนเชลล์ใน Unix / Linux ทุกครั้งที่ผู้ใช้ออกคำสั่งเชลล์จะแยกกระบวนการลูกและงานจะเสร็จสิ้น
เมื่อมีการเรียกใช้ระบบ fork สำเนาของเพจทั้งหมดที่เกี่ยวข้องกับกระบวนการพาเรนต์จะถูกสร้างขึ้นโดยโหลดลงในตำแหน่งหน่วยความจำแยกต่างหากโดยระบบปฏิบัติการสำหรับกระบวนการย่อย แต่ในบางกรณีก็ไม่จำเป็น เช่นเดียวกับในการเรียกระบบ 'exec' ไม่จำเป็นต้องคัดลอกหน้ากระบวนการหลักเนื่องจาก execv จะแทนที่พื้นที่ที่อยู่ของกระบวนการหลักเอง
สิ่งที่ควรทราบเกี่ยวกับการตีมีดังนี้:
เธรดเป็นกระบวนการน้ำหนักเบา (LWPs) ตามเนื้อผ้าเธรดเป็นเพียงสถานะ CPU (และสถานะขั้นต่ำอื่น ๆ ) ที่มีกระบวนการที่มีส่วนที่เหลือ (ข้อมูล, สแต็ก, I / O, สัญญาณ) เธรดต้องการค่าใช้จ่ายน้อยกว่าการ“ ฟอร์ก” หรือการสร้างกระบวนการใหม่เนื่องจากระบบไม่ได้เตรียมใช้งานพื้นที่หน่วยความจำเสมือนของระบบใหม่และสภาพแวดล้อมสำหรับกระบวนการ ในขณะที่มีประสิทธิภาพสูงสุดในระบบมัลติโปรเซสเซอร์ซึ่งสามารถกำหนดตารางการไหลของกระบวนการให้ทำงานบนโปรเซสเซอร์อื่นได้ดังนั้นจึงได้รับความเร็วผ่านการประมวลผลแบบขนานหรือแบบกระจาย แต่ยังพบการเพิ่มขึ้นในระบบยูนิโพรเซสเซอร์ซึ่งใช้ประโยชน์จากเวลาแฝงใน I / O และฟังก์ชันระบบอื่น ๆ ซึ่งอาจหยุดกระบวนการ การดำเนินการ
เธรดในกระบวนการเดียวกันใช้ร่วมกัน:
คำตอบของ Dacav นั้นยอดเยี่ยมฉันแค่อยากจะเพิ่มว่าไม่ใช่ทุกรุ่นเธรดที่ให้การประมวลผลหลายอย่างแท้จริง
ตัวอย่างเช่นการใช้เธรดเริ่มต้นของ Ruby ไม่ได้ใช้เธรด OS / เคอร์เนลที่แท้จริง แทนที่จะเลียนแบบการมีเธรดหลายเธรดโดยการสลับระหว่างอ็อบเจ็กต์เธรดภายในเคอร์เนลเธรด / กระบวนการเดียว
สิ่งนี้มีความสำคัญในระบบมัลติโปรเซสเซอร์ / มัลติคอร์เนื่องจากเธรดน้ำหนักเบาประเภทนี้สามารถทำงานบนคอร์เดียวเท่านั้น - คุณไม่ได้รับประสิทธิภาพมากนักจากการมีเธรดหลายเธรด
สถานที่อื่นที่สร้างความแตกต่างคือเมื่อเธรดหนึ่งบล็อก (รอ I / O หรือเรียก IOCTL ของไดรเวอร์) บล็อกเธรดทั้งหมด
สิ่งนี้ไม่ได้เกิดขึ้นบ่อยนักในปัจจุบันการใช้งานเธรดส่วนใหญ่ใช้เคอร์เนลเธรดซึ่งไม่ประสบปัญหาเหล่านี้ แต่ควรคำนึงถึงความสมบูรณ์
ในทางตรงกันข้าม fork จะให้กระบวนการอื่นที่รันได้พร้อมกันบน CPU ทางกายภาพอื่นในขณะที่กระบวนการดั้งเดิมกำลังดำเนินการ บางคนพบว่า IPC เหมาะกับแอปของตนมากกว่าส่วนคนอื่น ๆ ชอบเธรด
ขอให้โชคดีและสนุก! มัลติเธรดมีทั้งความท้าทายและคุ้มค่า
เธรดเป็นฟังก์ชันที่ทำงานแบบขนานส้อมเป็นกระบวนการใหม่ที่มีการสืบทอดพ่อแม่ เธรดเป็นสิ่งที่ดีในการรันงานแบบขนานในขณะที่ส้อมเป็นกระบวนการอิสระที่ทำงานพร้อมกัน เธรดมีเงื่อนไขการแข่งขันและมีเซมาฟอร์ควบคุมและล็อคหรือมิวเท็กซ์ท่อสามารถใช้ได้ทั้งในส้อมและเธรด