เหตุใดสถานะที่ไม่ปลอดภัยจึงไม่ทำให้เกิดการหยุดชะงัก


10

ฉันอ่านระบบปฏิบัติการโดย Galvin และพบว่าบรรทัดด้านล่าง

ไม่ใช่ว่ารัฐที่ไม่ปลอดภัยทั้งหมดล้วน แต่มีการหยุดชะงัก สถานะที่ไม่ปลอดภัยอาจนำไปสู่การหยุดชะงัก

ใครช่วยกรุณาอธิบายว่าdeadlock! =รัฐไม่ปลอดภัยได้อย่างไร ฉันยังจับบรรทัดเดียวกันตรงนี้ด้วย

หากไม่มีลำดับที่ปลอดภัยแสดงว่าระบบอยู่ในสถานะไม่ปลอดภัยซึ่งอาจนำไปสู่การหยุดชะงัก (สถานะที่ปลอดภัยทั้งหมดปราศจากการหยุดชะงัก แต่ไม่ใช่ทุกรัฐที่ไม่ปลอดภัยจะนำไปสู่การหยุดชะงัก)


1
การหยุดชะงักอาจเป็นแนวคิดที่คล้ายกับสภาพการแข่งขันที่เกิดขึ้นเป็นระยะ รหัสที่ไม่ปลอดภัยจะทริกเกอร์การหยุดชะงักเมื่อมีการเรียงลำดับเฉพาะ ลำดับนั้นอาจ "เกิดขึ้นได้ทุกเวลา" aka "อุบัติเหตุที่รอให้เกิดขึ้น" ...
vzn

หมายถึงรัฐที่ไม่ปลอดภัยในทางทฤษฎีมีความเป็นไปได้ของการหยุดชะงัก การหยุดชะงักสามารถเกิดขึ้นได้เมื่อมีบางสิ่งเกิดขึ้น เพื่อความปลอดภัยไม่ว่าจะเกิดอะไรขึ้นจะไม่มีการหยุดชะงัก
nishantbhardwaj2002

1
ด้วยเหตุผลเดียวกันกับที่สถานการณ์อันตรายใด ๆ (ในชีวิตจริง) ไม่ได้ทำให้สิ่งเลวร้ายเกิดขึ้นจริง
David Richerby

คำตอบ:


14

หยุดชะงักหมายถึงบางสิ่งบางอย่างที่เฉพาะเจาะจง: มีสอง (หรือมากกว่า) กระบวนการที่มีอยู่ในปัจจุบันบล็อกรอให้กันและกัน

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

ลองพิจารณาตัวอย่างต่อไปนี้:

Process A                  Process B
lock X                     lock Y           # state is "unsafe"
                           unlock Y
lock Y                                      # state is back to "safe" (no deadlock this time.  We got lucky.)

มีตัวอย่างที่น่าสนใจมากขึ้นในหัวข้อ 7.5.1 ของลิงก์ที่คุณให้ :

พิจารณาระบบที่มี 12 เทปไดร์ฟด้วย:

Process       Max Need       Current
P0:             10              5
P2:              9              3

นี่คือสถานะที่ไม่ปลอดภัย แต่เราไม่ได้อยู่ในการหยุดชะงัก มีเพียง 4 ไดรฟ์ฟรีดังนั้นสำหรับตัวอย่างเช่นถ้า P0 ไม่คำขอเพิ่มอีก 5 และ P2 ไม่ขอเพิ่มอีก 1 เราจะหยุดชะงัก แต่มันยังไม่เกิดขึ้น และ P0 อาจไม่ขอไดรฟ์อีกต่อไป แต่อาจเพิ่มไดรฟ์ที่มีอยู่แล้ว นี่Max needเป็นเรื่องของการประหารชีวิตที่เป็นไปได้ทั้งหมดของโปรแกรมและนี่อาจไม่ใช่การประหารชีวิตครั้งหนึ่งที่เราต้องการไดรฟ์ทั้ง 10 ตัวใน P0


ขอบคุณมากครับ! และฉันเกลียดตำราเรียนที่ไม่ชัดเจน ...
Ning

แต่ฉันก็มีคำถามบางอย่างด้วย: (1) คุณตอบว่า["] ความต้องการสูงสุดนั้นจบลงด้วยการกระทำที่เป็นไปได้ทั้งหมดของโปรแกรม [."]แต่คุณยังพูดว่า["] ถ้า P0 ร้องขอเพิ่ม 5 และ P2 ร้องขอ อีก 1 เราจะหยุดชะงัก [. "]โดยที่ (1) หมายถึงถ้า Max Need ไม่ประสบความสำเร็จเป็นไปได้ที่จะมีการหยุดชะงักในขณะที่ (2) หมายความว่าจะต้องมีการหยุดชะงักเมื่อไม่บรรลุ?
Ning

คือเหตุผลของฉันถูกต้อง ?: ถ้า P2 ไม่คำขอเพิ่มอีก 1 และมันจบแล้วเทปฟรีกลายเป็น (4 + 3 = 7) และตั้งแต่ P1 ขอเพิ่มอีก 5 แล้วก็สามารถประสบความสำเร็จจึงไม่มีการหยุดชะงัก แต่ถ้า P2 ไม่เสร็จสิ้นการหยุดชะงักจะเกิดขึ้นเนื่องจากแม้ว่า P1 ต้องการเพียง 5 เพื่อจบ แต่ก็ยังคง 4 <5
Ning

สำหรับตัวอย่างสุดท้าย: P0 ร้องขอเพิ่ม 5 จากนั้น 5 + 5 + 3 = 13> 12 ดังนั้น P0 ต้องรอ P2 เพื่อสร้างการหยุดชะงักเพียงแค่ให้ P2 ขอเพิ่มอีกหนึ่งตัว
Bit_hcAlgorithm

7

เพื่ออธิบายสิ่งที่ Wandering Logic พูด

บอกว่าฉันมีสองกระทู้ที่ทั้งสองต้องการเข้าถึง X และ Y และไม่มีการซิงโครไนซ์และไม่มีกลไกในการแก้ไขการหยุดชะงัก สิ่งนี้ไม่ปลอดภัยเนื่องจากบุคคลหนึ่งสามารถล็อค X และ Y อื่น ๆ จากนั้นจึงไม่สามารถดำเนินการต่อได้ แต่มันไม่รับประกัน

Thread 1                    Thread 2
Lock X                      
Lock Y
OS Interrupts Thread 1 and passes control to Thread 2
                            Unable to lock needed resources.
OS Interrupts Thread 2 and passes control to Thread 1
Unlock X                    
Unlock Y                    
                            Lock Y
                            Lock X
 ....

สถานการณ์นี้ไม่ได้จบลงด้วยการหยุดชะงัก แต่อาจมี เนื่องจากวิธีการทำงานเธรดจึงไม่มีชุดการไหล ระบบปฏิบัติการควบคุมเธรดและดังนั้นจึงอาจเกิดสิ่งต่อไปนี้:

Thread 1                    Thread 2
Lock X        
OS Interrupts Thread 1 and passes control to Thread 2
                            Lock Y              
DEADLOCK Thread 1 needs Y, Thread 2 needs X. Neither knows to back down and simply waits.

1

สถานะปลอดภัยไม่มีการหยุดชะงักฟรี แต่ถ้าคุณไม่สามารถปฏิบัติตามข้อกำหนดทั้งหมดเพื่อป้องกันการหยุดชะงักอาจเกิดขึ้น ตัวอย่างเช่นถ้าสองเธรดอาจหยุดชะงักเมื่อพวกเขาเริ่มเธรด A จากนั้นเธรด B แต่เมื่อพวกเขาเริ่มตรงกันข้าม (B, A) พวกเขาจะทำงานได้ดี - ให้ฉันสมมติว่า B คือ nicer;) สถานะของระบบไม่ปลอดภัย แต่ด้วยโชคเริ่มต้นลำดับมันจะทำงาน ไม่มีการหยุดชะงัก แต่เป็นไปได้ หากคุณซิงโครไนซ์พวกเขาด้วยมือ - เริ่มต้นในลำดับที่ดี - มันเป็นอันตราย - ด้วยเหตุผลบางอย่างที่พวกเขาอาจไม่ถูกไล่ออกตามที่คุณต้องการ - ระบบยังคงไม่ปลอดภัย (เพราะอาจถึงตายได้) แต่มีโอกาสน้อยมาก ในกรณีที่มีเหตุการณ์ภายนอกบางอย่างเช่นการแช่แข็งเธรดหรือการอินเตอร์รัปต์หลังจากดำเนินการต่อมันจะล้มเหลว

คุณต้องตระหนัก - สถานะที่ปลอดภัยเป็นเงื่อนไขที่เพียงพอเพื่อหลีกเลี่ยงการหยุดชะงัก แต่ไม่ปลอดภัยเป็นเงื่อนไขที่จำเป็นเท่านั้น ตอนนี้มันยากที่จะเขียนโค้ดออกจากหัว แต่ฉันสามารถค้นหาบางอย่าง ฉันพบโค้ดใน Ada ที่มากกว่า 99/100 เท่ามันทำงานได้อย่างสมบูรณ์เป็นเวลาหลายสัปดาห์ (และหยุดทำงานเนื่องจากเซิร์ฟเวอร์รีสตาร์ทไม่ใช่การหยุดชะงัก) แต่นาน ๆ ครั้งมันก็หยุดทำงานหลังจากผ่านไปหลายวินาทีในสภาวะการหยุดชะงัก

ให้ฉันเพิ่มตัวอย่างง่ายๆโดยการเปรียบเทียบกับการหาร: ถ้าฟังก์ชันของคุณหาร c / d และส่งกลับผลลัพธ์โดยไม่ตรวจสอบว่า d เท่ากับ 0 อาจมีการหารด้วยศูนย์ข้อผิดพลาดดังนั้นรหัสไม่ปลอดภัย (ตั้งใจตั้งชื่อเดียวกัน) แต่จนถึง คุณทำสิ่งนั้นทุกอย่างดี แต่หลังจากการวิเคราะห์เชิงทฤษฎีไม่ปลอดภัยและอาจตกอยู่ในพฤติกรรมที่ไม่ได้กำหนดไม่ได้จัดการอย่างเหมาะสม


0

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

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


2
ยินดีต้อนรับสู่เว็บไซต์! จุดเล็ก ๆ : ควรหลีกเลี่ยงวลี "อาจไม่" เป็นภาษาอังกฤษเนื่องจากไม่ชัดเจนว่าหมายถึง "ต้องไม่" ("คุณไม่ควรจอดที่นี่") หรือ "อาจไม่" ("คุณอาจไม่สนุกกับภาพยนตร์เรื่องนี้) . ")
David Richerby

0

สถานะที่ไม่ปลอดภัยเล็กน้อย: เธรด 1 ใช้ล็อก A จากนั้นล็อก B จากนั้นปลดล็อคทั้งสอง เธรด 2 ใช้การล็อก B จากนั้นล็อก A จากนั้นปลดล็อกทั้งสอง

นี้จะนำไปสู่การหยุดชะงักถ้ากระทู้ 2 ใช้เวลาล็อค B เพียงแค่ระหว่างกระทู้ 1 สละล็อค A และพยายามที่จะใช้ล็อค B หรือด้าย 1 ใช้เวลาล็อคเพียงระหว่าง 2 กระทู้สละล็อค B และพยายามที่จะใช้ล็อค A.

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

เดินข้ามถนนโดยที่คุณหลับตา มันไม่ปลอดภัย แต่คุณไม่เคยถูกฆ่า

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