ภาวะอดอยากของทรัพยากร (Resource Starvation) คืออะไร? สาเหตุและวิธีแก้ไข
สรุปใจความสำคัญ
- ภาวะอดอยาก (Resource Starvation) คือการที่โปรเซสถูกปฏิเสธทรัพยากรที่จำเป็นอย่างต่อเนื่องจนทำงานไม่ได้
- การใช้เทคนิค Aging สามารถแก้ไขปัญหาภาวะอดอยากได้โดยการเพิ่มลำดับความสำคัญให้งานที่รอนาน
- Priority Inversion คือสถานการณ์ที่งานสำคัญที่สุดในระบบต้องรอการทำงานของงานที่มีลำดับความสำคัญต่ำกว่า
ในโลกของการคำนวณแบบขนาน (Concurrent Computing) ภาวะอดอยากของทรัพยากร (Resource Starvation) คือสถานการณ์ที่โปรเซส (Process) หรือเธรด (Thread) ถูกปฏิเสธการเข้าถึงทรัพยากรที่จำเป็นในการทำงานอย่างต่อเนื่อง จนไม่สามารถดำเนินงานต่อไปได้ แม้ว่าทรัพยากรนั้นจะมีอยู่จริง แต่ระบบจัดการทรัพยากรกลับเลือกให้โปรเซสอื่นเข้าใช้งานก่อนเสมอ
สาเหตุของการเกิดภาวะอดอยาก
ภาวะอดอยากมักเกิดจากข้อผิดพลาดในการออกแบบอัลกอริทึมการจัดตารางเวลา (Scheduling Algorithm) หรืออัลกอริทึมการกีดกันซึ่งกันและกัน (Mutual Exclusion Algorithm) นอกจากนี้ยังอาจเกิดจากสาเหตุอื่นๆ ดังนี้:
- ข้อผิดพลาดในการจัดตารางเวลา: เมื่อระบบเลือกให้งานบางอย่างทำงานก่อนเสมอจนงานอื่นถูกละเลย
- การรั่วไหลของทรัพยากร (Resource Leaks): เมื่อทรัพยากรถูกจองไว้แต่ไม่ถูกคืนสู่ระบบ ทำให้ทรัพยากรมีไม่เพียงพอสำหรับโปรเซสอื่น
- การโจมตีแบบ Denial-of-Service (DoS): เช่น การใช้ Fork Bomb เพื่อสร้างโปรเซสจำนวนมหาศาลจนทรัพยากรระบบหมดสิ้น
การจัดตารางเวลาและลำดับความสำคัญ
ปัญหาภาวะอดอยากมักเกิดขึ้นในระบบที่มีการกำหนด ลำดับความสำคัญ (Priority) หากระบบออกแบบมาให้โปรเซสที่มีลำดับความสำคัญสูงทำงานก่อนเสมอ และมีโปรเซสลำดับความสำคัญสูงเข้ามาในระบบอย่างต่อเนื่อง โปรเซสที่มีลำดับความสำคัญต่ำจะไม่มีโอกาสได้ทำงานเลย ซึ่งนำไปสู่ภาวะอดอยาก
Priority Inversion (การสลับลำดับความสำคัญ)
ในบางกรณี อาจเกิดปรากฏการณ์ที่เรียกว่า Priority Inversion ซึ่งเกิดขึ้นเมื่อโปรเซสที่มีลำดับความสำคัญสูงสุด (X) ต้องรอผลลัพธ์จากโปรเซสที่มีลำดับความสำคัญต่ำสุด (B) แต่โปรเซส B กลับถูกขัดขวางโดยโปรเซสที่มีลำดับความสำคัญปานกลาง (A) ทำให้โปรเซส X ไม่สามารถทำงานเสร็จสิ้นได้ แม้จะเป็นงานที่สำคัญที่สุดในระบบก็ตาม
ความแตกต่างระหว่าง Starvation และ Deadlock
| หัวข้อ | ภาวะอดอยาก (Starvation) | ภาวะชะงักงัน (Deadlock) |
|---|---|---|
| ลักษณะ | รอทรัพยากรที่ถูกส่งต่อให้โปรเซสอื่นอย่างต่อเนื่อง | โปรเซสสองตัวหรือมากกว่าต่างรอทรัพยากรที่อีกฝ่ายถือครองอยู่ |
| สถานะ | โปรเซสยังคงทำงานได้หากทรัพยากรว่างลง | ระบบหยุดชะงักโดยสมบูรณ์ ไม่สามารถขยับเขยื้อนได้ |
| การแก้ไข | ปรับปรุงอัลกอริทึมการจัดตารางเวลา | ต้องมีการตรวจจับและทำลายวงจรการรอ (Cycle) |
วิธีแก้ไขและป้องกัน
แนวทางในการป้องกันภาวะอดอยากคือการทำให้ระบบเป็น Starvation-free หรือมี Finite Bypass ซึ่งหมายความว่าไม่มีโปรเซสใดถูกข้ามการทำงานเกินจำนวนครั้งที่กำหนด
- Aging Technique (เทคนิคการเพิ่มอายุ): เป็นวิธีที่ได้รับความนิยมสูงสุด โดยการค่อยๆ เพิ่มลำดับความสำคัญของโปรเซสที่รออยู่ในระบบเป็นเวลานาน ยิ่งรอนานเท่าไหร่ ลำดับความสำคัญจะยิ่งสูงขึ้น จนในที่สุดโปรเซสจะได้รับทรัพยากรและได้ทำงาน
- การจัดสรรทรัพยากรอย่างเป็นธรรม (Fair Scheduling): การใช้อัลกอริทึมที่รับประกันว่าทุกโปรเซสจะได้รับเวลา CPU หรือทรัพยากรขั้นต่ำที่จำเป็น
คำถามที่พบบ่อย
Resource Starvation ต่างจาก Deadlock อย่างไร?
Starvation คือการที่โปรเซสรอทรัพยากรที่ถูกมอบให้คนอื่นตลอดเวลา แต่ Deadlock คือการที่โปรเซสต่างรอทรัพยากรของกันและกันจนไม่มีใครทำงานได้เลย
เทคนิค Aging ช่วยแก้ปัญหา Starvation ได้อย่างไร?
Aging จะค่อยๆ เพิ่มลำดับความสำคัญ (Priority) ให้กับโปรเซสที่รออยู่ในคิวเป็นเวลานาน ทำให้ในที่สุดโปรเซสที่มีลำดับความสำคัญต่ำจะมีความสำคัญสูงพอที่จะได้รับทรัพยากร
อะไรคือสาเหตุหลักที่ทำให้เกิด Resource Starvation?
สาเหตุหลักมักเกิดจากอัลกอริทึมการจัดตารางเวลาที่ออกแบบมาไม่ดี หรือการให้ความสำคัญกับโปรเซสลำดับความสำคัญสูงมากเกินไปจนละเลยโปรเซสลำดับความสำคัญต่ำ
