← กลับไปยังบทความทั้งหมด

ภาวะอดอยากของทรัพยากร (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?

สาเหตุหลักมักเกิดจากอัลกอริทึมการจัดตารางเวลาที่ออกแบบมาไม่ดี หรือการให้ความสำคัญกับโปรเซสลำดับความสำคัญสูงมากเกินไปจนละเลยโปรเซสลำดับความสำคัญต่ำ