คำอธิบายของ Wakeups ปลอม ๆ ดูเหมือนเป็นข้อผิดพลาดที่ไม่คุ้มค่ากับการแก้ไขใช่ไหม?


30

จากบทความของ Wikipedia เกี่ยวกับSpurious Wakeups

"เธรดอาจถูกปลุกจากสถานะรอแม้ว่าจะไม่มีเธรดที่ส่งสัญญาณตัวแปรเงื่อนไข"

ในขณะที่ฉันรู้เกี่ยวกับ 'ฟีเจอร์' นี้ฉันไม่เคยรู้ว่าเกิดอะไรขึ้นจริง ๆ ในบทความเดียวกัน

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

ดูเหมือนว่าเป็นข้อบกพร่องที่ไม่คุ้มค่ากับการแก้ไขใช่ไหม


1
ที่เกี่ยวข้อง: "ทำไม pthread_cond_wait ถึงมีการปลุกแบบลวงตา", stackoverflow.com/questions/8594591/…
Florian Castellane

คำตอบ:


39

TL; DRอัสสัมชัญ ("สัญญา") ของการเสแสร้งปลอมคือการตัดสินใจทางสถาปัตยกรรมที่สมเหตุสมผลที่ทำขึ้นเพื่ออนุญาตให้มีการใช้งานที่แข็งแกร่งอย่างแนบเนียนของเครื่องมือจัดการเธรด

"การพิจารณาประสิทธิภาพ" ไม่เกี่ยวข้องที่นี่สิ่งเหล่านี้เป็นเพียงความเข้าใจผิดที่เริ่มแพร่หลายเนื่องจากมีการระบุไว้ในเอกสารอ้างอิงที่เชื่อถือได้ที่ตีพิมพ์ (การอ้างอิงที่เชื่อถือได้อาจมีข้อผิดพลาด y'know - เพียงแค่ถามกาลิเลโอกาลิลี )บทความ Wikipedia เก็บการอ้างอิงถึงบันทึกย่อที่คุณยกมาเพียงเพราะมันตรงกับแนวทางอย่างเป็นทางการของการอ้างอิงการอ้างอิงที่เผยแพร่

เหตุผลที่น่าสนใจมากขึ้นสำหรับการแนะนำแนวคิดของการหลอกลวงแบบปลอมมีไว้ในคำตอบที่ SOซึ่งมีพื้นฐานจากรายละเอียดเพิ่มเติมที่มีให้ในบทความ (ในเวอร์ชั่นที่เก่ากว่า) ของบทความนั้นมาก:

บทความวิกิพีเดียเกี่ยวกับการปลอมแปลงมีการขโมยอาหารอันโอชะนี้:

มีการpthread_cond_wait()ใช้งานฟังก์ชันใน Linux โดยใช้การfutexเรียกของระบบ การเรียกระบบการบล็อกแต่ละครั้งบน Linux จะส่งคืนทันทีEINTRเมื่อกระบวนการได้รับสัญญาณ ... pthread_cond_wait()ไม่สามารถเริ่มการรอได้เนื่องจากอาจพลาดการปลุกที่แท้จริงในเวลาเพียงเล็กน้อยนอกfutexระบบโทร

ลองคิดดูสิ ... เช่นเดียวกับรหัสใด ๆ ตัวจัดตารางเวลาเธรดอาจมีความผิดพลาดชั่วคราวเนื่องจากมีสิ่งผิดปกติเกิดขึ้นในฮาร์ดแวร์ / ซอฟต์แวร์พื้นฐาน แน่นอนควรใช้ความระมัดระวังเพื่อให้สิ่งนี้เกิดขึ้นน้อยที่สุดเท่าที่จะเป็นไปได้ แต่เนื่องจากไม่มีสิ่งใดที่เป็นซอฟต์แวร์ที่แข็งแกร่ง 100% จึงมีเหตุผลที่จะถือว่าสิ่งนี้สามารถเกิดขึ้นได้และดูแลการกู้คืนที่สง่างาม โดยการสังเกตการเต้นของหัวใจที่หายไป)

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

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


จากมุมมองของกระทู้สิ่งนี้ค่อนข้างคล้ายกับกฎของ Postel (หรือที่เรียกว่าหลักการความทนทาน )

ระมัดระวังในสิ่งที่คุณทำมีอิสระในสิ่งที่คุณยอมรับจากผู้อื่น

การสันนิษฐานว่ามีการเสแสร้งการปลุกปั่นให้ทำอย่างระมัดระวังในสิ่งที่มันทำ : ตั้งเงื่อนไขเมื่อแจ้งหัวข้ออื่น ๆ และเปิดเสรีในสิ่งที่รับ : ตรวจสอบเงื่อนไขเมื่อกลับมาจากการรอและทำซ้ำถ้ายังไม่รอ


10
อืม ... กฎหมายของ Postel ... เหตุผลที่ HTML และเทคโนโลยีเว็บทุกประเภทมีอึเข้าไปมาก (เช่นการยอมรับ HTML ของการวางแท็กที่ไม่ดี) นั่นเป็นคำตอบที่ดี
Thomas Eding

3
กฎหมายของ Postel คือสาเหตุที่ทำให้ข้อบกพร่องหลายอย่างไม่สามารถตรวจจับได้เป็นเวลาหลายปีเพราะเฮ้แม้ว่าฟังก์ชั่นของคุณจะให้ผลลัพธ์ที่ผิด แต่แอปก็ยังทำงานได้! สุดยอดสิ่งประดิษฐ์ที่เคยมีมา
Pacerier

2
@Pacerier: ฟังก์ชั่นที่ส่งคืนเอาต์พุตที่ไม่ถูกต้องไม่เป็นไปตามกฎหมายของ Postel (ส่วนที่อนุรักษ์นิยม)
YvesgereY

@Pacerier: OTOH เรียกร้องให้ส่วนประกอบอื่น ๆ มีความเข้มงวดเพื่อให้ข้อผิดพลาดสามารถถูกจับได้ก่อนหน้านี้เป็นตำแหน่งที่น่าสนใจโดยทำผิดในหลักการ 'Fail Fast' และการออกแบบ 'Contract Based'
YvesgereY

1

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

การรักษาหนึ่งสำหรับสองประเด็นซึ่งฉันสรุปโดยต่อไปนี้:

Spurious wakeup: เธรดการรอถูกกำหนดเวลาก่อนที่จะสร้างเงื่อนไข
การนอนเลยเวลาที่กำหนดบังคับ: เธรดการรอถูกกำหนดเวลาหลังจากเงื่อนไขได้รับการปลอมแปลงอีกครั้ง

ตั้งแต่ภายหลังอาจเกิดขึ้นบางคนไปเท่าที่แนะนำการหลอกลวงในสัญญา:

  • ในการบังคับใช้แนวปฏิบัติที่ดีโดยกำหนดลูปเพรดิเคต
  • เพื่อให้เสรีภาพในการใช้งานตัวกำหนดตารางเวลา (รวมถึงตัวเลือกการกู้คืนฉุกเฉินตามที่ชี้โดย @gnat)

การอ้างอิงดังนั้น


ฉันต้องการ +1 สิ่งนี้ แต่สำหรับความคิดที่ว่ามีคนแนะนำการปลุกแบบลวงหลอกโดยเจตนาเพื่อให้ผู้โทรเข้ามาเพิ่มลูปของเพรดิเคตเพื่อจัดการกับการนอนหลับที่เกินกำหนด ฉันพบว่านึกไม่ถึง
ruakh

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