בעייה במימוש של sleep

במידה והזמן אותו יש לחכות קטן מ-TICSN, תיקרא sleept פעם אחת בלבד. במידה והזמן ארוך יותר, יש לחלק אותו למספר חלקים. הפונקציה sleept תקרא מספר פעמים, זו אחר זו, כך שביחד נחכה את הזמן הרצוי.

כעקרון, במידה שבזמן t נקראת sleep לחכות זמן plot:$\Delta $ אזי התהליך צריך להתחדש בזמן plot:$t + \Delta $.

יתכן שיהיו תהליכים בעלי עדיפות גבוהה יותר, ולכן נצפה שתהליך יתחדש לא לפני זמן plot:$t + \Delta $.

במידה ובזמן plot:$t + \Delta $ אין תהליכים בעלי עדיפות גבוהה יותר או זהה לתהליך שחיכה, נרצה שהוא יחזור להתבצע. יותר מכך, אם בזמן זה ישנם תהליכים בעדיפות גבוהה יותר, נרצה שהוא יחזור להתבצע מיד כאשר אין תהליכים בעדיפות גבוהה יותר ממנו.

אולם, נביט במקרה הבא: תהליך א' מבקש לחכות 10000 שניות. 500 שניות אחר כך נוצר תהליך ב', בעל עדיפות גבוהה הפעולה 9000 שניות. נרצה לראות מתי תהליך א' יגמור לחכות.

התשובה: לאחר 18420 שניות!

הסבר: ב-sleep ישנה בעיה הנובעת מכך שהלולאה מתבצעת בעדיפות של התהליך הקורא.

ייתכן כי לאחר תחילת השינה ייכנס לריצה תהליך בעל עדיפות גבוהה יותר. במקרה זה, לא תתבצע הלולאה כל עוד התהליך עם העדיפות הגבוהה יותר רץ.

בדוגמא המוצגת, כאשר התהליך בעל העדיפות הגבוהה נכנס לפעולה הוא מעקב את ביצוע ה-sleept, ולכן בסיום פעולת תהליך ב', ישארו עדיין 8 איטרציות של הלולאה + 280 מחזורי שעון בהם יישן תהליך א'.

תגיות המסמך:

מאת: באסל

תודה

הסברתם את זה, כמו שאר הנושאים, באופן הכי ברור שיש.
שיתוף:
| עוד