วิธีปฏิบัติที่ดีที่สุดคือไม่ต้องสำรวจความคิดเห็น ... แต่จะไม่ทำการสำรวจความคิดเห็นภายในเมื่อมีการเรียกเธรดรอ ()


13

สมมติว่าเรามีเธรดบางตัวที่ต้องการตรวจสอบเมื่อเธรดอื่นเสร็จสิ้นภารกิจ ฉันได้อ่านแล้วว่าเราควรเรียกใช้ฟังก์ชันการรอ () ประเภทที่จะทำให้เธรดนี้รอจนกว่าจะได้รับการแจ้งเตือนว่าเธรดอื่นเสร็จสิ้นแล้ว และนี่เป็นสิ่งที่ดีเพราะมันหมายความว่าเราไม่ได้ทำการสำรวจที่มีราคาแพง

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

ฉันคิดว่าฉันพลาดอะไรบางอย่างที่นี่ใครบางคนสามารถสอนฉันได้ไหม

คำตอบ:


28

ระบบปฏิบัติการจัดเตรียมการเบื้องต้นสำหรับการสื่อสารระหว่างกระบวนการชนิดนี้ซึ่งไม่ต้องการการโพล

หากกระบวนการ A กำลังรอ mutex M ระบบปฏิบัติการจะรู้ว่า A ไม่สามารถรันและทำให้มันอยู่ในกลุ่มของกระบวนการเพื่อรอสิ่งที่จะเกิดขึ้น เมื่อกระบวนการที่ถือ M ปล่อยออกมาระบบปฏิบัติการจะดูรายการกระบวนการที่รออยู่ ขั้นตอนแรกในรายการอาจจะได้รับการออกจากถังไม่ได้ใช้งานและวางบนคิววิ่ง ครั้งต่อไปที่ A ได้รับการแบ่งเวลาการรอ () ที่เรียกว่าจะกลับมาและโปรแกรมจะดำเนินต่อไป


ดังนั้นในวิธีที่มันเป็นแบบสำรวจ แต่ในระดับ OS?
tgkprog

7
ไม่ @tgkprog สิ่งนี้ไม่ใช่การสำรวจเนื่องจากกระบวนการรอไม่ได้ถูกกำหนดเวลาให้รันจนกว่าระบบปฏิบัติการหรือกระบวนการอื่นจะเผยแพร่ mutex กระบวนการสำรวจจะดำเนินต่อไปเพื่อแข่งขันในการกำหนดเวลาซีพียูเพื่อตรวจสอบว่ามันควรจะหยุดรอ กระบวนการโพลในการจัดเรียงนี้สามารถเบิร์นส่วนของเวลา CPU ได้อย่างมากในขณะที่รอ
joshp

ฉันหมายถึงกระบวนการของระบบปฏิบัติการสำรวจสถานะ mutex แม้ว่าฉันจะแน่ใจว่ามันได้รับการปรับปรุงและดีกว่าสิ่งที่เราสามารถทำได้ อาจทำงานเป็นส่วนหนึ่งของกำหนดการ
tgkprog

4
@tgkprog: ระบบปฏิบัติการไม่ได้ให้ความสนใจกับสิ่งที่เกิดขึ้นกับ mutex จนกว่ากระบวนการที่ถือไว้จะเผยแพร่หรือยกเลิก เหตุการณ์เหล่านั้นอาจทำให้ระบบปฏิบัติการส่งล็อก mutex ไปยังกระบวนการใดก็ตามที่อยู่ในรายการรอก่อนและทำเครื่องหมายกระบวนการนั้นว่ารันได้ ไม่มีการสำรวจที่เกี่ยวข้องเพียงแค่ตอบกลับเหตุการณ์ ทุกสิ่งที่ joshp กล่าวนั้นรวมอยู่ในการอ้างอิง :-)
Blrfl

2
@csss: ค่อนข้างมาก กระบวนการอาจยุติโดยสมัครใจ (เช่นการเรียกใช้_exit(2)บนระบบ POSIX-y) หรือโดยไม่สมัครใจ (เช่นข้อผิดพลาดเช่นหารด้วยศูนย์ทำให้เกิดการขัดจังหวะหรือการโทรอื่นkill(2)) ไม่ว่าในกรณีใดการควบคุมจะถูกส่งกลับไปยัง OS อย่างชัดเจนซึ่งรู้ว่ากระบวนการใดกำลังทำงานอยู่หรือถูกฆ่า งานการสิ้นสุดกระบวนการรวมถึงการปลดปล่อยทรัพยากรของมันรวมถึง mutexes หาก mutex ถูกยึดครองโดยกระบวนการที่ตายแล้ว OS จะปล่อยออกมา หากกระบวนการอยู่ในรายการรอของ mutex กระบวนการนั้นจะถูกลบออก
Blrfl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.