นางสาวกนกอร ศิริอำนาจ กลุ่ม 2
บทที่ 7 หน้า 237 ในหนังสือเรียนโอเอส ใน บทนี้จะเป็นเรื่องเกี่ยวกับ deadlocks คือ สิ่งที่น่าจะ รู้อยู่แล้ว ก็คือ สิ่งที่ทำให้ application หรือบางครั้ง แม้ว่าคอมพิวเตอร์เกิดอาการ "hang" แม้ฮาร์ดแวร์จะ ปกติดี แต่เราต้องการทราบสิ่งที่เพิ่มเติมเกี่ยวกับสิ่ง นี้ เราต้องเรียนรู้มันต่อไป
deadlocks คือ สิ่งที่เราควรจะกำหนดขึ้นอย่าง ชัดเจนแน่นอน โดยทั่วไปก็คือ เมื่อกำหนดโปรเซส ( หรือ เทรด ) มีวงจร dependancy ที่มีลูปอนันต์ หนังสือเล่มนี้กล่าวในทางคลุมเครือบ้างในวรรคแรก ของบท คือ ในระบบ multiprogramming กระบวนการหลายกระบวนการอาจมีการแย่งกันใช้ ทรัพยากร ที่มีจำนวนจำกัด คำร้องขอของโปรเซส และถ้าหากทรัพยากรไม่สามารถใช้งานได้ ในขณะที่ โปรเซสจะต้องเข้าสู่สภาวะรอคอย บางครั้ง กระบวนการที่รอคอยอยู่นั้น อาจไม่สามารถเปลี่ยน สถานะอื่นได้ เนื่องจากอาจมีการร้องขอทรัพยากร จากส่วนอื่นอีก โดยมีการรอคอยของอีกโปรเซสหนึ่ง เรียกว่า deadlocks
แต่ให้หากคิดว่ามีคนอยู่ สองคน คนหนึ่งมีชื่อผู้ใช้ และอีกคนมีรหัสผ่าน แล้วถ้าหากมีทั้งสองอย่างคุณ สามารถดาวน์โหลดคำตอบจากการบ้าน ตัวอย่าง สมมุติว่า person 1 มีขั้นตอนวิธีดังนี้ person1: get username get password access account, download stuff release password release username
ok, แต่ person 2 มีขั้นตอนวิธีที่แตกต่าง : person2: get password get username access account, download stuff release username release password ในความเป็นจริงมันควรจะมีวิธีการที่เหมือนกัน ลอง ดูการทำ context switch ของเครื่องคอมพิวเตอร์ ลองใส่ person 1 เข้าไปใน column ทางซ้ายและ person 2 เข้าไปใน column ทางขวา
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 คือ การกีดกั้น ในบริเวณ หรือ ส่วนของโปรแกรมที่ process เข้าครอบครองรีซอร์ส ซึ่งเรียกว่า Critical region ซึ่งการกีดกั้นก็คือการ ไม่ยอมให้ process ใด ๆ เข้าใช้พื้นที่ ๆ เป็น Critical region ซึ่งมีคุณสมบัติอยู่ 4 ประการ คือ ไม่มี process อยู่ใน critical region พร้อมกัน ไม่มีสมมติฐาน และข้อจำกัด ด้านความเร็ว หรือจำนวน ซีพียูมาเป็นปัจจัย ไม่มี process นอก critical region ที่ block การ ทำงานของ process อื่น ไม่มี process ที่รอเข้าใจ critical region ตลอดเวลา
2) Hold & Wait คือ ถ้าโปรเซสสามารถถือครอง ทรัพยากรที่ตัวเองได้รับ และในขณะเดียวกันก็ สามารถทำการร้องขอทรัพยากรเพิ่มเติมได้ 3) No preemption คือ ถ้าโปรเซสกำลังใช้งาน ทรัพยากรอยู่ และระบบไม่สามารถบังคับให้โปรเซส นั้นปล่อยทรัพยากรนั้นให้เป็นอิสระได้
4) Circular wait คือ เกิดวงจรรอคอย ถ้าเกิดทั้ง 4 อย่างนี้ขึ้นอาจเกิด deadlocks กับ คุณได้ หากไม่เกิดสิ่งหนึ่งภายในทั้ง 4 อย่าง การ เกิด deadlocks ก็จะไม่เกิดขึ้น เพื่อให้คุณเห็นว่า ตอนนี้เรารู้วิธีการโจมตีปัญหาและหลีกเลี่ยงการเกิด deadlocks เราต้องค้นหาวิธีการรับประกันหนึ่งใน 4 เหล่านี้เป็นให้ไม่เกิดขึ้น เราก็จะสามารถรับประกัน ได้ว่า การเกิด deadlocks จะไม่เกิดขึ้น
วิธีการป้องกันการเกิด deadlocks 1. ระบุลำดับของทรัพยากรทั้งหมด แต่คุณไม่ สามารถมีหมายเลขซ้ำๆ ได้ 2. รหัสของคุณต้องได้รับทรัพยากรในลำดับ ascending และต้องได้รับทรัพยากรทั้งหมดก่อน งานจะเริ่ม 3. รหัสของคุณต้องปล่อยทรัพยากรในลำดับ descending หลังการทำงาน
นี่คืองาน ลำดับแรกให้ทำ # 1 username คือ 1 password คือ 2 ต่อไป ปรับปรุง person 2 ให้อยู่ในลำดับที่ ถูกต้อง ตอนนี้ person 1 และ person 2 อยู่ใน ลำดับที่ถูกต้องแล้ว ในตัวอย่างนี้ person 1 and 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 ( ดูข้อมูลเพิ่มได้ ในหน้า 257)