วันพฤหัสบดีที่ 6 ธันวาคม พ.ศ. 2550

1.3 Mutual Exclusion with busy waiting

เนื่องจากในสภาวะ mutual Exclusion จะยอมไห้มีการครองรีซอร์ได้ครั้งละ1โปรเซส ทำไห้โปรเซสอื่นต้องรออยู่ภายนอก Critical Regionแต่การรอขอโปรเซสก็ยังเป็นการครอบครองเวลาซีพี ทำไห้เสียประโยชร์เนื่องจากไม่ได้งานอะไรเลย การรอของโปรเซสก็ยังเป็นการครอบครองซีพียูทำให้เสียประโยชน์เมื่อไม่ได้งานใด ๆ เลยการรอของโปรเซสในลักษณะนี้เรียกว่า busy waiting
-- Disable Interrupt วิธีการนี้เป็นการยกเลิกอินเตอร์รัพต์ ทำให้ซีพียูทำงานได้อย่างต่อเนื่องโดยไม่สนใจอินเตอร์รัพต์ใด ๆ เลย ทำให้โปรเซสที่อยู่ใน Critical Region ได้เอ็กซิคิวต์จนเสร็จเรียบร้อยแล้วจะได้ไม่เกิดRaceCondition ขึ้นมาได้
ข้อเสียของวิธี Disable Interrupt มี 3 ประการ
• ถ้าใช้คำสั่ง Disable Interrupt ไว้ตอนต้นแต่ลืมใช้คำสั่ง Able Inteerrupt ไว้ท้ายสุดของโปรเซสของผู้ใช้
• ไม่นิยมใช้ใน User Mode
• คำสั่ง Disable Inteerrupt จะมีผลกับระบบที่ใช้ซีพียูเพียงตัวเดียว
-- Lock Variable
วิธีการนี้เป็นการใช้ซอฟแวร์ในการตรวจสอบเกิด Race Condition โดยการกำหนดตัวแปรขึ้นมา 1 ตัว โดยใช้ตัวแปรนี้จะคอยตรวจสอบว่ามีโปรเซสใดอยู่ใน Critical Region
-- Strict Alternation วิธีนี้เป็นการสลับกันเพื่อเข้า Critical Region ระหว่างโปรเซสสองโปรเซส เช่น ถ้าโปรเซส A และ B ต้องการเข้า Critical Region โปรเซส A ที่มาก่อนก็จะได้เข้า Critical Region ก่อนหลังจากนั้นจะให้โปรเซส B ได้เข้าCritical Region บ้าง
-- Peterson's Solution ถึงแม้เด็กเกอร์จะเป็นบุคคลแรกที่ค้นวิธีแก้ปัญหา Mutual Exclusion ที่ไม่ใช้วิธีสลับเวลาแต่อัลกอริทึมที่นำมาการแก้ปัญหาของปีเตอร์สันเป็นวิธีที่ง่ายกว่า
-- TSL InstructionTSL Instruction หรือ Test Set Lock Instruction เป็นคำสั่งที่ทำให้เกิด Mutual Exclusion ที่ช่วยแก้ปัญหา Lock Variable โดยการทำ Test Set Lock เสร็จเป็นขั้นตอนเดียววิธีการก็คือจะอ่านค่าจากหน่วยความจำมาเก็บไว้ในรีจีสเตอร์ แล้ว Set ค่าในหน่วยความจำเป็น 1 ในลักษณะคำสั่งTSL RX,LOCKการทำงานจะเริ่มจากการอ่านค่าจากหน่วยความจำที่แอ็ดเดรสLOCKมาเก็บไว้ที่รีจีสเตอร์ RX แล้วเก็บค่าที่ไม่ไช่ 0 ( ในที่นี้ใช้ 1 ) ลงในแอ็ดเดรสนั้น การอ่านค่าและการเก็บค่าลงในหน่วยความจำขณะนั้นจะไม่มีโปรเซสใดสามารถใช้หน่วยความจำนั้นได้จนกว่าคำสั่งนั้นจะเสร็จสิ้น อาจกล่าวได้ว่าซีพียูจะเอ็กซิคิวต์คำสั่งTSLเพื่อล็อกไม่ให้ซีพียูอื่นใช้หน่วยความจำจนกว่างานนั้นจะเสร็จเรียบร้อยการใช้คำสั่ง TSL จะต้องแชร์ตัวแปร LOCK ในการใช้หน่วยความจำที่แชร์เมื่อแปรตัวแปรLOCKมีค่าเป็น0โปรเซสอื่นจะเซ็ตให้มีค่าเป็น 1 เพื่อจะใช้คำสั่งTSL แล้วจะทำการอ่านหรือเขียนหน่วยความจำที่แชร์นั้น เมื่อทำงานเสร็จแล้วโปรเซสนั้นจะเซ็ตกลับเป็น 0 เหมือนเดิมโดยใช้คำสั่ง MOVEเมื่อโ ) รเซสต้องการเข้า Critical Region จะเรียก enter_region แล้วเริ่มการทำงานโดยการก็อปปี้ค่าเดิมของ LOCK ไปเก็บที่รีจีสเตอร์ แล้วเซ็ตค่าLOCK เป็น 1 จากนั้นจะเปรียบเทียบค่าเดิมกับ0ถ้าไม่ไช่ค่า 0 ค่า LOCK ที่เซ้ตเป็น1จะกลับไปเริ่มต้นที่จุดเริ่มต้นเพื่อตรวจสอบอีกครั้ง จนกระทั่งเป็น 0 ( เมื่อโปรเซสที่กำลังอยู่ใน Critical Regionเสร็จเรียบร้อยแล้ว ) และรูทีนย่อยจะรีเทิร์นด้วยการเซ็ตค่า LOCK ส่วนการเคลียค่าก็เป็นเรื่องง่ายแค่การเก็บค่า 0 ไว้ใน LOCK เท่านั้น

ไม่มีความคิดเห็น: