บทที่ 7 Deadlock Your company slogan
Deadlock ระบบคอมพิวเตอร์โดยทั่วไปประกอบด้วยทรัพยากร หรือรีซอร์ส ( resource)จำนวนมากที่สามารถถูกเรียกใช้งานโดยโปรเซสเซอร์ (Proceses) หนึ่ง ณ เวลาใดเวลาหนึ่งเท่านั้น ทรัพยากรเหล่านี้จะไม่สามารถให้ไมโครโปรเซสเซอร์มากกว่า 1 ไมโครโปรเซสมาใช้พร้อมๆ กัน ดังนั้นปฏิบัติการที่ดีจะต้องมีความสามรถที่จะหยุดการทำงานโปรเซสใดๆ เป็นการชั่วคราว ถ้าโปรเซสนั้นพยายามเรียกใช้งานอยู่ และทำให้เกิดข้อผิดพลาดดังกล่าว โปรแกรม หรือแอปพลิเคชันโดยทั่วไปเมื่อทำงาน จะเปิดโปรเซสขึ้นมากมาย โปรเซสเหล่านั้นส่วนใหญ่ต้องการใช้ทรัพยากรมากกว่า 1 แต่หากโปรเซสมีการร้องขอการใช้ทรัพยากรเพื่อใช้งานพร้อมๆกัน ณ จุดนี้เองที่โปรเซสจะถูกปฏิเสธให้ทำงานและหยุดเพื่อรอใช้ทรัพยากรของอีกฝ่ายหนึ่ง โดยไม่มีวันที่จะได้ทรัพยากรของอีกฝ่ายเลย ซึ่งเหตุการณ์นี้เรียกว่า วงจรอับ หรือ deadlock
Deadlock คืออะไร “กลุ่มของโปรเซสที่ถูกปฏิเสธไม่ให้ทำงาน (blocking) อันมีผลเนื่องมาจาก การแย่งชิงการใช้ทรัพยากรหรือ การสื่อสาร โดยที่โปรเซสในกลุ่มต่างรอคอยสัญญาณการทำงานที่เกิดขึ้นโดยเฉพาะจากโปรเซสภายในกลุ่มนี้เท่านั้น” เนื่องจากโปรเซสต้องรอสัญญาณการทำงาน และไม่มีโปรเซสใดสามารถส่งสัญญาณการทำงานให้กับโปรเซสอื่น ภายในกลุ่มได้ ซึ่งจะส่งผลทั้งหมดต้องรอคอยอย่างไม่มีสิ้นสุด โดยในนิยามนี้ สมมุติว่า ไม่มีการอินเตอร์รัพต์ (interrupt) ขึ้นในระบบเพื่อที่จะเรียกใช้โปรเซสที่อยู่ในกลุ่มนี้ขึ้นมาใช้งานได้ ในกรณีที่เกิดขึ้นโดยทั่วไปนั้น สัญญาณแต่ละโปรเซสจะรอคอยก็คือ สัญญาณการปล่อยทรัพยากร ที่ถูกใช้งานโดยโปรเซสภายในกลุ่มใช้งานอยู่ (โดยทรัพยากรนั้นเป็นได้ทั้งฮาร์ดแวร์และซอร์ฟแวร์)หรือถ้าอาจจะกล่าวในอีกทัศนะหนึ่งก็คือสมาชิก ของแต่ละโปรเซสในวงจรอับต่างรอคอยทรัพยากรที่ถูกใช้งานโดยโปรเซสที่อยู่ในวงจรอับนั้นเอง ไม่มีโปรเซสใดสมารถทำงานได้ถูกเรียกออกมาจากกลุ่มได้
เงื่อนไขการเกิด Deadlock ทรัพยากรเป็นแบบใช้ร่วมกันไม่ได้ (Mutual Exclusion) มีเพียงหนึ่งโปรเซสเท่านั้นที่จะใช้ทรัพยากรได้ อีกโปรเซสต้องรอ ถือครองแล้วรอคอย (Hold and Wait) โปรเซสตัวหนึ่งใช้ทรัพยากรอยู่ โดยที่กำลังรอคอยทรัพยากรอีกตัวหนึ่ง ซึ่งทรัพยากรตัวนี้ก็ถูกครอบครองโดยอีกโปรเซสหนึ่ง ไม่มีการแทรกกลางคัน (No Preemption) ทรัพยากรจะถูกคืนเมื่อโปรเซสต้องการคืน หากไม่คืน OS ทำอะไรไม่ได้ รอคอยเป็นวงกลม (Circular Wait) เป็นการรอคอยแบบงูกินหาง
เงื่อนไขการใช้ทรัพยากรของโปรเซส โปรเซสทุกโปรเซสจะต้องดำเนินการตามเงื่อนไขนี้ ร้องขอ (Request) จะรอจนกว่าได้รับทรัพยากรนั้น ใช้งาน (Use) ใช้งานจนเสร็จ คืนทรัพยากร (Release) ใช้เสร็จแล้วก็คืนกลับสู่ระบบ ปัญหา deadlock เกิดจาก ร้องขอตลอดกาล ใช้งานแล้วไม่คืน
การป้องกันการเกิดวงจรอับ(deadlock) การใช้ทรัพยากรร่วมกันได้ (Mutual exclusion prevention)เช่นการเข้าถึงแฟ้มข้อมูลยอมให้ทุกโปรเซสเข้าใช้งานโดยอ่านได้อย่างเดียวและยอมให้มีการเขียนกระบวนการเดียวเท่านั้น การป้องกันการถือครองและการรอคอย ( Hold and wait prevention)โดยกำหนดให้แต่ละโปรเซสต้องร้องขอทรัพยากรทั้งหมด และจะอนุญาตเมื่อได้ทรัพยากรครบ ยอมให้มีการแทรกกลางคัน (Premptable) ระบบจะไม่ยอมให้โปรเซสร้องขอทรัพยากรจนกว่าจะปลดปล่อยทรัพยากรของตัวเอง การป้องกันการเกิดวงจรรอคอย (Circular wait protection) โดยการกำหนดลำดับของทรัพยากรทั้งหมดในระบบ ซึ่งโปรเซสจะร้องขอได้เฉพาะทรัพยากรที่อยู่ในลำดับสูงกว่าเท่านั้น
การแก้ไขวงจรอับ (Recovery from Deadlock) ระบบอาจจัดการได้ 2 วิธี คือ รายงานให้ผู้ควบคุมเครื่องทราบว่า ขณะนี้เกิดวงจรอับขึ้นในระบบแล้ว ให้ผู้ควบคุมจัดการแก้ไขวงจรอับเอง ระบบแก้ไขวงจรอับเองโดยอัตโนมัติ มี 2 วิธี คือ ยกเลิกการบวนการที่ติดอยู่ในวงจรอับบางกระบวนการเพื่อที่จะตัดวงจรอับ อนุญาตให้มีการแทรกกลางคันทรัพยากรบางส่วนที่ติดอยู่ในวงจรอับได้ เพื่อให้ระบบกลับคืนสู่สภาวะปกติ
กราฟการจัดสรรพทรัพยากร (Resource Allocation Graph) เมื่อกระบวนการ P₁ ร้องขอทรัพยากรประเภท R₁ เราก็จะเขียนเส้นร้องขอลงในกราฟ การจัดสรรพทรัพยากร และเมื่อการร้องขอนั้นได้รับอนุมัติจากระบบ เส้นร้องขอก็จะถูกแปลง ไปเป็นเส้นถือครองแทน และหลังจากที่กระบวนการปล่อยทรัพยากรคืนสู่ระบบแล้ว เส้นถือครองก็จะถูกลบออกไปจากกราฟเช่นกัน กราฟการจัดสรรพทรัพยากรในรูปข้างต้น แสดงสถานะของระบบได้ ดังนี้ เซต P = { P₁, P₂, P₃ } เซต R = { R₁, R₂, R₃, R₄ } เซต E = { P₁ à R₁, P₂ à R₃, R₁ à P₂, R₂ à P₂, R₂ à P₁, R₃ àP₃ }