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

1.5 Semaphore

ในปี ค.ศ. 1965 ไดจก์สตรา ได้แนะนำให้ใช้ตัวแปรจำนวนเต็มเพื่อนับจำนวน Wakeup ที่อาจจะนำไปใช้ในอนาคตเรียกว่า Semaphoreปฏิบัติการ Down ใน semaphore จะตรวจสอบค่าตัวแปร ถ้าค่ามากกว่า 0 จะลดค่าแล้วดำเนินต่อไป แต่ถ้าค่าเป็น 0 โปรเซสจะเป็น sleep ตัวเองโดยไม่จำเป็นต้องให้ปฏิบัติการ down เสร็จสมบูรณ์ก่อน การตรวจสอบเปลี่ยนแปลงจนนำไปสู่การ sleep เป็นขั้นตอนเดียวโดยอัตโนมัติ จึงอาจเรียกได้ว่าเป็นindivisibleautomatic actionเป็นการยืนยันได้ว่า ปฏิบัติการของ semaphore เพียงปฏิบัติการเดียว ที่เริ่มต้น ทำให้โปรเซสอื่นไม่สามารถแอ็กเซส semaphore ได้จนกว่าปฏิบัติการจะเสร็จสมบูรณ์หรือมีการบล็อกความเป็นอัตโนมัตินี้เองเป็นสิ่งสำคัญในการแก้ปํญหาซินโคไนซ์ และหลีกเลี่ยงการ race condition คำสั่งปฏิบัติการ down อาจเขียนได้เป็น

IF Semaphore >0
THEN
Decrement Semaphore
( ลดค่า Semaphore ลง 1 )
ELSE
Wait UNTIL semaphore=0
Sleep()
สำหรับปฏิบัติการ Up จะเพิ่มค่าของ แอ๊ดเดรส ถ้ามีโปรเซสตั้งแต่1โปรเซสขึ้นไป sleep บน semaphore นั้นจะไม่สามาสรถทำให้ปฏิบัติการ down ก่อนหน้านั้นเสร็จสิ้นลงไปได้แต่ระบบจะปิดบางตัวและยอมให้เสร็จสิ้นได้ทำให้เกิดปฏิบัติการ up บน semaphore ที่สุ่มนั้นทำให้เพิ่มค่า semaphore ขึ้น อีก 1 ทำให้ wakeup ได้ และเช่นเดียวกับปฏิบัติการ downที่ในระหว่างดำเนินตามปฏิบัติการทั้งสอง จะไม่สามารถอินเทอร์รัพต์นอกจากจะใช้ disable interrupt เข้าช่วย เช่น ในโพรซีเดอร์ down อาจเขียนได้เป็น
{Disable interrupt
If semaphore>0then
Decrement semaphore
Continue
Else
Wait until semaphore
Able interrupt}
สำหรับระบบที่มีซีพียูมากกว่า1ตัวจะใช้ Disable interrupt ไม่ได้ อาจจะต้องใช้ STL เข้าช่วยได้ ส่วนรูปแบบของ semaphore จากไดจก์สตรา เสนอในตอนต้นนั้น เขาใช้ p,v เนื่องจากเป็นภาษาดัทช์pคือการตรวจสอบ ส่วน v คือการค่า เราใช้แทน down และ up แทน p และ v ตามลำดับ
นอกจากปัญหา Producer-consumer ที่ผ่านมาเราสามารถใช้ semnaphore ช่วยแก้ไขได้ ตามรูป #define N 100 /* จำนวนสล็อตในบัฟเฟอร์*//
Tyopedef int semaphore; /* กำหนหดประเภทตัวแปรเป็น int*/

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