קריאות מערכת ההפעלה הקשורות לתהליכים

כאשר משתמש רוצה לקבל מידע על התהליכים במערכת ההפעלה, עליו להשתמש בקריאות המערכת הבאות:

  • getpid – מחזירה את המציין של התהליך הנוכחי (ערכו של המשתנה currpid).
  • getprio – מקבלת pid ומחזירה את העדיפות של התהליך הרצוי.
  • chprio – משנה את העדיפות של תהליך.
  • getprio():– מקבלת id של תהליך, ומחזירה את עדיפותו. בודקת האם קיים בכלל תהליך בעל ה-id הזה. אם אין תהליך כזה, מבצעים restore() ולאחר מכן מחזירים SYSERR. מתעוררת בעייה, כי ראשית עשינו restore, ולכן מותרות כעת פסיקות. יתכן מצב בו פתאום נוצר תהליך ב-id הנתון וכשחוזרים מ-getprio היא עדיין תחזיר SYSERR.

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

אולם, ישנה בעייה נוספת: יתכן שאחרי פקודת ה-restore נכנס תהליך אחר, ומת התליך בעל ה-id הנ"ל, ורק אז אנו מחזירים את עדיפותו. זוהי שגיאה, כי אם התהליך מת, אין לנו גישה לנתונים אלו לגביו.

כדי לתקן את הבאג, יש לשמור את העדיפות במשתנה מקומי לפני ה-restore, ואז להחזיר את ערך המשתנה המקומי. למשל:

retValue = pptr->pprio;

restore(ps);

return retValue;

בפונקציה chprio באג זה נפתר.

chprio():

בפונקציה זו ישנם שני באגים. הראשון: אמורה להיות בפונקציה זו קריאה ל-resched, ובפועל אין כזו.

השני: לא שינינו את המקום של התהליך בתור ה-ready.

פתרון אפשרי לבאגים: לפני הפקודה restore(ps), נוסיף את הקוד הבא:

if (pptr->pstate == PRREADY)

{

       dequeue(pid);

       ready(pid);

}

resched();

proc.h

  • NULLPROC – תהליך התמיד מוכן לריצה – בעדיפות מינימלית.
  • currpid – משתנה גלובלי שהוא ה-id של התהליך הנוכחי.
  • numproc – משתנה גלובלי שהוא מספר התהליכים הרצים כעת.

תגיות המסמך:

מאת: באסל

תודה

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