การหยุดชะงักคืออะไร
ก่อนอื่นให้ดูตัวอย่างชีวิต: มีสะพานบนแม่น้ำพร้อมดาดฟ้าสะพานแคบ ๆ ที่สามารถรองรับรถคันเดียวเท่านั้นและไม่สามารถอนุญาตให้รถสองคันไปขนานกันได้ หากรถสองคัน A และ B ขับไปที่สะพานจากปลายทั้งสองของสะพานจากนั้นสำหรับรถยนต์ A มันจะเดินข้ามส่วนของถนนทางด้านซ้ายของดาดฟ้าสะพาน (นั่นคือมันใช้ทรัพยากรส่วนหนึ่งของสะพาน) หากคุณต้องการข้ามสะพานคุณต้องรอให้รถ B ยอมแพ้ดาดฟ้าสะพานทางด้านขวา รถ A ไม่สามารถก้าวไปข้างหน้าได้ในเวลานี้ สำหรับ Car B มันเดินข้ามส่วนของถนนทางด้านขวาของดาดฟ้าสะพาน (นั่นคือมันใช้ทรัพยากรส่วนหนึ่งของสะพาน) หากคุณต้องการข้ามสะพานคุณต้องรอให้รถ A ยอมแพ้ดาดฟ้าสะพานทางด้านซ้ายและ Car B ไม่สามารถก้าวไปข้างหน้าได้ในเวลานี้ รถยนต์ทั้งสองด้านไม่ได้ย้อนกลับซึ่งส่งผลให้รอซึ่งกันและกันเพื่อยอมแพ้ดาดฟ้าสะพาน แต่ไม่มีใครให้ทางและจะรออย่างไม่สิ้นสุด ปรากฏการณ์นี้หยุดชะงัก หากรถเปรียบเทียบกับกระบวนการและดาดฟ้าสะพานถูกใช้เป็นทรัพยากรแล้วปัญหาข้างต้นจะอธิบายว่า: ประมวลผลทรัพยากร R1 รอทรัพยากร RR ที่ถูกครอบครองโดยกระบวนการ B; กระบวนการ B มีทรัพยากร RR รอทรัพยากร R1 ที่ถูกครอบครองโดยกระบวนการ A. ยิ่งไปกว่านั้นทรัพยากร R1 และ RR อนุญาตให้กระบวนการหนึ่งครอบครองได้นั่นคือสองกระบวนการไม่ได้รับอนุญาตให้ครอบครองในเวลาเดียวกัน เป็นผลให้กระบวนการไม่สามารถดำเนินการต่อไปได้ หากไม่มีมาตรการอื่น ๆ สถานการณ์การรอคอยวัฏจักรนี้จะดำเนินต่อไปเรื่อย ๆ และการหยุดชะงักของกระบวนการจะเกิดขึ้น
ในระบบคอมพิวเตอร์ทรัพยากรซอฟต์แวร์และฮาร์ดแวร์อาจถูกปิดกั้น ตัวอย่างเช่น: มีไดรเวอร์ซีดีรอมเพียงตัวเดียวและเครื่องพิมพ์หนึ่งเครื่องในระบบ กระบวนการหนึ่งเป็นเจ้าของไดรเวอร์ซีดีรอมและใช้สำหรับเครื่องพิมพ์ กระบวนการอื่น ๆ เป็นเจ้าของเครื่องพิมพ์และใช้สำหรับซีดีรอม เป็นผลให้กระบวนการทั้งสองถูกบล็อกและไม่สามารถตัดการเชื่อมต่อได้ด้วยตนเอง
การหยุดชะงักที่เรียกว่าหมายถึงสถานการณ์ที่หลายกระบวนการวนผ่านทรัพยากรที่พวกเขาครอบครองและยังคงอยู่ในทางตันอย่างไม่มีกำหนด เห็นได้ชัดว่าหากไม่มีแรงภายนอกกระบวนการทั้งหมดที่เกี่ยวข้องกับการหยุดชะงักจะถูกบล็อกเสมอ จากตัวอย่างข้างต้นเราจะเห็นได้ว่าเหตุผลพื้นฐานสำหรับการหยุดชะงักในระบบคอมพิวเตอร์คือทรัพยากรที่ จำกัด และการทำงานที่ไม่เหมาะสม นั่นคือ: เหตุผลหนึ่งคือระบบมีทรัพยากรน้อยเกินไปและอยู่ไกลจากการปฏิบัติตามข้อกำหนดของทรัพยากรของกระบวนการพร้อมกัน การหยุดชะงักนี้เกิดจากทรัพยากรการแข่งขันเป็นแกนหลักของการสนทนาของเรา ตัวอย่างเช่น: ข้อความเป็นทรัพยากรชั่วคราว ในบางจุดประมวลผล A กำลังรอข้อความที่ส่งโดยกระบวนการ B กระบวนการ B กำลังรอข้อความที่ส่งโดยกระบวนการ C และกระบวนการ C กำลังรอข้อความที่ส่งโดยกระบวนการ A หากข้อความยังไม่มาถึงไม่มีกระบวนการทั้งสามกระบวนการ A, B และ C ไม่สามารถก้าวไปข้างหน้าและการหยุดชะงักจะเกิดขึ้นในการสื่อสารกระบวนการ อีกเหตุผลหนึ่งคือการหยุดชะงักที่เกิดจากคำสั่งก้าวหน้ากระบวนการที่ไม่เหมาะสม ทรัพยากรขนาดเล็กอาจไม่จำเป็นต้องนำไปสู่การหยุดชะงัก เช่นเดียวกับคนสองคนที่ข้ามสะพานไม้กระดานเดียวหากทั้งคู่ต้องผ่านไปก่อนและเป็นทางตันบนสะพานไม้กระดานเดี่ยวพวกเขาจะนำไปสู่การหยุดชะงักของทรัพยากรการแข่งขันอย่างหลีกเลี่ยงไม่ได้ อย่างไรก็ตามหากคนสองคนตรวจสอบเป็นครั้งแรกว่ามีคนอื่นอยู่บนสะพานก่อนไปที่สะพานและขึ้นไปบนสะพานด้วยตัวเองเมื่อไม่มีคนอื่นบนสะพานแล้วปัญหาจะได้รับการแก้ไข ดังนั้นหากโปรแกรมได้รับการออกแบบอย่างไม่มีเหตุผลและกระบวนการได้รับการส่งเสริมอย่างไม่เหมาะสมก็จะทำให้เกิดการหยุดชะงัก
การหยุดชะงัก
เฉพาะเมื่อเธรด T1 ครอบครอง O1 และต้องใช้ O2 และ T2 ใช้ O2 ในเวลานี้และยังต้องใช้ O1 จะมีการหยุดชะงัก (คล้ายกับคนสองคนที่กินด้วยตะเกียบสองตัวพวกเขาทั้งคู่ต้องการตะเกียบหนึ่งอันจากอีกฝ่ายกิน)
รหัสต่อไปนี้: เธรด T1 ใช้ O1 และปล่อยเฉพาะ O1 หลังจากได้รับวัตถุ O2 เธรด T2 ใช้ O2 ก่อนแล้วจึงได้รับ O1 ในเวลานี้ O1 ถูกครอบครองโดยด้าย T1 O2 ถูกครอบครองโดยด้าย T2, T1 และ T2 กำลังรออย่างไม่สิ้นสุดและการหยุดชะงักจะเกิดขึ้น
แพ็คเกจ javasimple;/** * deadlock demo * @author haokui * */คลาสสาธารณะ diesynchronized {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {/** * สร้างและเริ่มสองเธรด t1 และ t2 เธรดทั้งสองจะต้องแบ่งปันสองวัตถุ O1 และ O2*/ Object O1 = New Object (); วัตถุ O2 = วัตถุใหม่ (); เธรด t1 = เธรดใหม่ (ใหม่ T1 (O1, O2)); เธรด t2 = เธรดใหม่ (ใหม่ T2 (O1, O2)); t1.start (); t2.start (); }} // สร้างคลาสเธรดสองคลาส T1 ใช้งาน Runnable {Object O1; วัตถุ O2; สาธารณะ T1 (Object O1, Object O2) {this.o1 = O1; this.o2 = o2; } โมฆะสาธารณะเรียกใช้ () {// ล็อค O1 และ O2 ซิงโครไนซ์ (O1) {ลอง {thread.sleep (1,000); } catch (interruptedException e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ E.PrintStackTrace (); } ซิงโครไนซ์ (O2) {System.out.println ("O2"); }}}}}}} คลาส T2 ใช้งาน Runnable {Object O1; วัตถุ O2; สาธารณะ T2 (Object O1, Object O2) {this.o1 = O1; this.o2 = o2; } โมฆะสาธารณะเรียกใช้ () {ซิงโครไนซ์ (O2) {ลอง {thread.sleep (1,000); } catch (interruptedException e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ E.PrintStackTrace (); } ซิงโครไนซ์ (O1) {System.out.println ("O1"); - หมายเหตุ: การเกิดขึ้นพร้อมกันเกิดขึ้นเฉพาะเมื่อมีการแบ่งปัน O1 และ O2 วัตถุสองวัตถุสามารถแชร์ผ่านตัวสร้าง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น