Reentrant code והימנעות מהחלפת תהליכים

נאמר שפונקציה היא reentrant אם מספר קריאות לפונקציה ממספר תהליכים יכולים לבצע את הקוד שלה בו זמנית. מערכות הפעלה המנהלות מספר תהליכים בו זמנית מלאות בפונקציות מסוג reentrant, למשל, ב-XINU resched היא פונקציה כזו. שגרות reentrant לרוב משתמשים במשתנים מקומיים המוקצים על מחסנית המשתמש. גישות למשתנים גלובליים נעשים על ידי פונקציות כאלו מתוך קטעים העטופים ב-disable/restore.

שגרות BIOS אינן reentrent. מכיוון שקריאות לשגרות BIOS לעיתים רבות מפעילות שוב את הפסיקות, הן אינן יכולות לסמוך על עצמן שהן יהיו מסוגלות להגן על המשתנים הגלובליים שלהן במידה ואותה פסיקה תתרחש ממספר תהליכים. ב-XINU פונקציה אחת בלבד אחראית על החלפת התהליכים - resched. הדרך היחידה ש-resched יכולה להיקרא מתוך שיגרת BIOS היא עקב פסיקות. כמו כן, ב-XINU הפונקציה intcom מקצה מחסנית מקומית בה שגרת ה-BIOS שומרות את הנתונים שלהן.

לפיכך - אסור להחליף תהליכים כאשר אנו בזמן פסיקות BIOS.

המשתנה pcxflag משמש כעוצר החלפת התהליכים. כאשר הדגל קבוע ל-0, החלפת התהליכים של XINU מבוטלת. כאשר המשתנה הוא 1, החלפת התהליכים נעשית כרגיל.

לפיכך intcom קובעת דגל זה ל-0 כאשר המחסנית המקומית משמשת פסיקת BIOS.

תגיות המסמך:

מאת: באסל

תודה

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