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

1.4 Sleep and Wakeup

ทั่งวิธีการของปีเตอร์สันและการใช้คำสั่ง TSL เป็นวิธีการที่ถถูกต้องกว่าวคือ ถ้าโปรเซสใดต้องการเข้า Critical Region แต่ยังไม่ได้รับอนุญาตก็วนรอบรอจนกว่าโปรเซสที่กำลังอยู่ใน Critical Region เสร็จออกมา และได้รับอนุญาตไม่เพียงการเสียเวลารอจากวิธีการทั้งสองเท่านั้น ในบางครั้งสิทธิ์ในการเข้าใช้งานมีไม่เท่ากัน จะทำให้โปรเซสที่มีสิทธิ์สูงกว่าได้เข้าก่อน ถึงเเม้โปรเซสที่มาก่อนแต่มีสิทธิ์ต่ำกว่าก็ยังเข้าไม่ได้ แทนที่จะหยุดรอตามวิธีทั้งสองทำไมไม่ใช้วิธีการบล็อกแทนการหยุดรอเพื่อเข้า Critical Region ซึ่งวิธีการบล็อกที่ง่ายที่สุดก็คือ Sleep and WakeupSleep เป็น system call เพื่อบล็อกให้โปรเซสหยุดทำงาน (เนื่องจากเข้าCriticalRegion ไม่ได้ ) จนกว่าจะมีโปรเซสอื่นมาปลุกให้ทำงานต่อ ส่วน Rakeup เป็น system call ที่ปลุกให้โปรเซสทำงานต่อ เนื่องจาก Sleep และ Wakeup จะทำงานสลับกันดังนั้นจึงต้องมีการใช้พารามิเตอร์และแอ็ดเดรสของหน่วยความจำที่สัมพันธ์กัน
- The porducer-consumer problem
ตัวอย่าง sleep and wakeup ที่ง่ายที่สุดคือปัญญา Producer-Consumer ทั้ง 2 ส่วนจะใช้บัฟเฟอร์ที่แชร์ร่วมกันในขนาดที่คงที่ ปกติแล้วเราสามารถประยุกต์ให้มี Producer ได้ m ตัว และ Consumer ได้ n ตัว แต่ในที่นี้เราจะกำหนดให้มี Producer และ Consumer ได้เพียงอย่างละ 1 ตัวเท่านั้น โดยการทำงาจะเป็นดังนี้
- Producer จะทำหน้ที่ผลิตข้อมูลแล้วนำไปเก็บไว้ในบัเฟอร์แล้วจะหยุดการผลิตเมื่อบัฟเฟอร์เต็ม
- Consumer จะนำข้อมูลจากบัฟเฟอร์ไปใช้ ( ต้องมีอย่างน้อย 1 ชิ้น ) แล้วจะหยุดเมื่อบัฟเฟอร์ว่าง
อาจกล่าวในลักษณะ Sleep and Wakeup ได้ดังนี้
- Producer จะ Sleep ตัวเองเมื่อบัฟเฟอร์เต็ม และจะ Wakeup ให้ Consumer นำข้อมูลไปใช้เมื่อมีข้อมูลอย่างน้อย 1 ชุดในบัฟเฟอร์
- Consumer จะ Sleep ตัวอย่างเมื่อบยัฟเฟอร์ว่างและจะมี Wakeup ให้ Producer ผลิตข้อมูลเมื่อนำข้อมูลอกไปใช้ 1 ชุดหรือมากกว่า
โดยที่
- Sleep จะเป็นการเปลี่ยนสถานะจาก Running blocked
- Wakeup จะเป็นการเปลี่ยนสถานะจาก Blocked Ready ในการกำหนดขนาดของบัฟเฟอร์จะต้องมีการกำหนดตัวแปร count เพื่อกำหนดว่าบัฟเฟอร์สามารถเก็บข้อมูลได้กี่ชุด สามารถว่ากำหนดเป็น n แสดงว่บัฟเฟอร์นั้นสามารถเก็บข้อมูลได้ n ชุดโดยก่อนที่ producerจะผลิตก็จะทำการตรวจสอบก่อนว่าตัวแปร count มีค่าเป็น n หรือไม่ ถ้าเป็น n อยู่ก็จะ sleep ตัวเอง แต่ถ้ายังน้อยกว่าnก็จะผลิตข้อมูลเพิ่มในบัฟเฟอร็ต่อไปแล้วเพิ่มค่าตัวแปร count ส่วนโค๊ดใน consumer ก็มีลักษณะคล้ายกับproducer กล่าวคือเมื่อ consumer จะนำข้อมูลไปใช้จะมีตรวจสอบว่า count เป็น 0 หรือไม่ถ้าเป็น0(แสดงบัฟเฟอร์ ว่าง ) ก็จะ sleep ตัวเอบง แต่ถ้าไม่ไช่ 0 ก็จะเริ่มนำข้อมูลออกใช้ แล้ลดค่าตัวแปรcountนอกจากนี้ในแต่ละโปรเซสจะตรวจสอบโปรเซสอื่นด้วย ถ้าโปรเซสอื่น sleep อยู่ก็จะ wakeup ให้ด้วยสำหรับโค๊ดของ producer และ consumer จะมีดังนี้

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