DEADLO CK นางสาวเบญจวรรณ จิตร ถวิล
วันนี้เริ่มต้นเรียนบทที่ 7 หน้า 237 ในตำรา เรียนจะเกี่ยวกับ deadlocks คือ สิ่งที่รู้อยู่แล้ว คือ สิ่งที่ทำให้แอพพลิเคชั่นหรือบางครั้งถ้า คอมพิวเตอร์เกิดอาการ "hang" แม้ฮาร์ดแวร์จะ ปกติดี แต่ต้องการทราบสิ่งที่เพิ่มเติมเกี่ยวกับสิ่งนี้ ต้องเรียนรู้มันต่อไป
deadlocks คือ สิ่งที่กำหนดขึ้นอย่าง แม่นยำ โดยทั่วไปคือ เมื่อกำหนดโปรเซสหรือ เทรด มีวงจร dependancy ที่มีลูปอนันต์ ใน หนังสือกล่าวคลุมเครือในวรรคแรกของบท คือ " ในระบบ multiprogramming กระบวนการหลาย กระบวนการอาจแย่งกันใช้ทรัพยากรที่มีจำนวน จำกัด คำร้องขอของโปรเซสและถ้าทรัพยากรไม่ สามารถใช้ได้ ในขณะที่โปรเซสจะต้องเข้าสู่ สถานะรอ บางครั้งกระบวนการที่รออยู่อาจไม่ สามารถเปลี่ยนสถานะอื่นได้ เนื่องจากทรัพยากร ที่มีการร้องขออาจเกิดขึ้นอีก โดยมีการรอขอของ อีกโปรเซสหนึ่งเรียกว่า deadlocks
ให้คิดว่ามีสองคน คนนึงมีชื่อผู้ใช้และ อีกคนมีรหัสผ่าน ถ้ามีทั้งสองอย่างสามารถ ดาวน์โหลดคำตอบจากการบ้าน ตัวอย่าง สมมุติว่า person 1 มีขั้นตอนวิธีดังนี้ person1: get username get password access account, download stuff release password release username
แต่ person 2 มีขั้นตอนวิธีที่แตกต่าง : person2: get password get username access account, download stuff release username release password
ที่จริงควรจะมีวิธีการที่เหมือนกัน ลอง ดูการทำ context switch ของเครื่อง คอมพิวเตอร์ ใส่ person 1 เข้าไปใน คอลัมน์ซ้ายและ ใส่ person 2 เข้าไปใน คอลัมน์ขวา
get username (context switch) get password (process 2 hangs trying to get username, since process 1 has it) (context switch) (process 1 hangs trying to get password, since process 2 has it) D E A D L O C K
person 1 ต้องรอ password จาก person 2 จนกว่าจะทำเสร็จ person 2 ต้องรอ username จาก person 2 จนกว่าจะทำเสร็จ ถ้า ' โชคดี ' และได้รันทั้งสองอัน โดยไม่มี context switch ในขณะนั้นและไม่มีใครได้รับ สอง resources แล้วจะไม่ปัญหาเกิดขึ้น แต่ไม่ สามารถรับประกันว่าจะไม่เคยมี context switch เกิดขึ้นเลย ดังนั้นไม่มีใครมีทรัพยากรเมื่อเริ่ม การใช้ เหตุนี้จึงศึกษาบทที่ 7 เพื่ออธิบาย เกี่ยวกับ deadlocks ต้องเรียนรู้วิธีการตรวจสอบ deadlocks, และวิธีหลีกเลี่ยงการเกิดของ deadlocks
ลักษณะของ deadlocks 1. Mutual exclusion คือ การกีดกั้น ใน บริเวณ หรือส่วนของโปรแกรมที่โปรเซส ครอบครอง resource ซึ่งเรียกว่า Critical region การกีดกั้น คือ การไม่ยอมให้โปรเซสใดเข้าใช้ พื้นที่ของ Critical region ซึ่งมีคุณสมบัติอยู่ 4 ประการ คือ 1. ไม่มีโปรเซสอยู่ใน critical region พร้อมกัน 2. ไม่มีสมมติฐาน และข้อจำกัดความเร็ว หรือจำนวนซีพียู 3. ไม่มีโปรเซสนอก critical region ที่ บล็อคการทำงานของโปรเซสอื่น 4. ไม่มีโปรเซสที่รอเข้าใจ critical region ตลอดเวลา
2. Hold & Wait คือ โปรเซสสามารถ ถือครองทรัพยากรที่ตัวเองได้รับใน ขณะเดียวกันก็สามารถทำการร้องขอทรัพยากร เพิ่มเติมได้ 3. No preemption คือ ถ้าโปรเซส กำลังใช้งานทรัพยากรอยู่ และระบบไม่สามารถ บังคับให้โปรเซสนั้นปล่อยทรัพยากรนั้นให้เป็น อิสระได้ 4. Circular wait คือ เกิดวงจรรอคอย ถ้า 4 อย่างนี้เกิดขึ้นสามารถมีการเกิด deadlocks ได้ หากสิ่งใดสิ่งหนึ่งของสิ่งเหล่านี้ เป็นเท็จ, การเกิด deadlocks เพื่อให้รู้วิธีการ โจมตีปัญหาและหลีกเลี่ยงการเกิด deadlocks ต้องค้นหาวิธีที่รู้ว่า 1 ใน 4 อย่างนี้เป็นเท็จ จะสามารถรับประกันการเกิด deadlocks ว่าจะ ไม่เกิดขึ้น
วิธีการป้องกันการเกิด deadlocks 1. ระบุลำดับของทรัพยากรทั้งหมด แต่ไม่ สามารถมีหมายเลขซ้ำได้ 2. รหัสต้องได้รับทรัพยากรในลำดับ ascending และต้องได้รับทรัพยากรทั้งหมด ก่อนจะเริ่ม 3. รหัสต้องปล่อยทรัพยากรในลำดับ descending หลังการทำงาน นี่คืองาน ลำดับแรกให้ทำ # 1 username คือ 1 password คือ 2
ปรับปรุง person 2 ให้อยู่ในลำดับที่ถูกต้อง ตอนนี้ person 1 และ person 2 อยู่ในลำดับที่ ถูกต้องแล้ว ในตัวอย่างนี้ person 1 และ person 2 มีลักษณะคล้ายกัน person1: get username [1] get password [2] access account, download stuff release password [2] release username [1] person2: get username [1] get password [2] access account, download stuff release password [2] release username [1]
คอมพิวเตอร์ทำ context switch จะ วางกระบวนการที่ 1 ในคอลัมน์ซ้ายและ กระบวนการที่ 2 ในคอลัมน์ขวา get username (context switch) [wait because cannot get username] (context switch) get password (context switch) [keep waiting] (context swtich)
access account, download stuff (context switch) [still waiting] (context switch) release password (context swtich) [waiting some more] (context switch) release username (context switch) get username …
สามารถดูโดยไม่มี deadlocks การ context switch ระหว่างใช้คำสั่งเดียว ปัญหาใน ตัวอย่างอธิบายวิธีทำงาน ไม่สามารถป้องกัน deadlocks โดยใช้วิธีนี้ ( อาจจะเป็นรหัสที่เขียนโดยนักเรียนหรือผู้ใช้ ) สามารถทำอะไร ? ตรวจสอบ deadlocks: ใช้อัลกอลิทึมของ กราฟเพื่อวงจรรอบ เมื่อกระบวนการไม่ได้เปลี่ยน สถานะไปที่ นาที X ทำลาย deadlocks: หากพบ deadlocks, ดูวงจรและฆ่าหนึ่งกระบวนการ. ตรวจสอบ deadlocks ใหม่และทำซ้ำจนไม่มี deadlocks (p 251)
THE END