פונקציות הקשורות לסמפורים
פעולת wait:
o
משנה
את מצב התהליך הנוכחי ל-PRWAIT. לא ניתן להפעיל את הפונקציה על סמפור שלא אותחל או שכבר שוחרר. הקריאה ל-resched במהלך הפונקציה הכרחית, כי אחרי שהכנסנו את התהליך הנוכחי לתור המתנה, אין תהליך נוכחי במערכת.
פעולת signal:
לא ניתן להפעיל את הפונקציה על סמפור שלא אותחל או שכבר שוחרר. הקריאה ל-resched במהלך הפונקציה הכרחית, אולם המערכת תעבוד גם בלעדיה. ההכרחיות היא מכיוון שייתכן שלתהליך החדש עדיפות גבוהה יותר מזה של הנוכחי, ולכן אחרי שנעיר אותו, התהליך החדש הוא זה שצריך לרוץ. עם זאת, אם לא נעיר אותו, הוא יתעורר בעצמו בפעם הפעם ש-resched תיקרא, לכל המאוחר בפסיקת השעון הבאה. הפונקציות wait, signal מקיימות ומניחות את קיום השמורה הבאה: כשמונה הסמפורים איננו שלילי, תור הממתינים לסמפור ריק. כאשר המונה שלילי, הערך המוחלט שלו מציין את מספר הממתינים בתור. כדי לקיים את השמורה: בגלל ש-wait מקטינה את המונה, היא מוסיפה את התהליך הנוכחי לתור אם המונה שלילי. בגלל ש-signal מגדילה את המונה, היא מוציאה איבר מהתור במידה והתור איננו ריק.
פעולת screate:
פונקציה פנימית בעזרתה screate() מוצאת מציין סמפור פנוי. הפונקציה סורקת את טבלת הסמפורים ומוצאת תא פנוי, או מחזירה SYSERR אם אין כזה. כמו כן הפונקציה מסמנת את התא שנמצא כתפוס. הפונקציה מסתמכת על כך שבעת אתחול המערכת הוצב הקבוע SFREE לכל רשומות הסמפורים. הפונקציה מוגדרת כ-LOCAL, כלומר פונקציה פנימית של מנגנון הסמפורים, שלשאר חלקי מערכת ההפעלה אין גישה אליו. בגלל שהרבה יותר סביר שביטויים שגויים בתוכנית יהיו מתורגמים ל-0 או 1, הפונקציה newsem מתחילה להקצות סמפורים דווקא מסוף מערך הסמפורים, ומקטינה בכך את הסיכוי שתהליך יחכה על הסמפור הלא נכון.
פעולת sdelete:
בסוף לולאת ה-while המשחררת את כל התהליכים מבצעים resched, וכך יתכן שאחד מהתהליכים אלו יהפוך לפעיל. נשים לב כי מחיקת סמפור כאשר יש תהליכים המחכים לו היא פעולה מסוכנת. ישנן מערכות הפעלה בהם לא ניתן לשחרר סמפור אשר מחכים עליו תהליכים. מדוע דווקא אנו שמים את התהליכים בתור ה-ready אם מוחקים את הסמפור, ולא למשל מעבירים את התהליכים למצב PRSUSP? שתי סיבות עיקריות: ראשית, לא ידוע אם יהיה בעתיד תהליך שהולך להעיר את התהליך המושהים. שנית, בדרך כלל קוראים לפונקציה זו במקרים קיצוניים בלבד, שבמילא הולכים להרוג את מערכת ההפעלה ולשחרר משאבים, ולכן הבחירה איפה לשים את התהליכים איננה חשובה כל כך.
בפונקציה זו יש בעיה: scount מחזירה SYSERR במקרה של שגיאה, אולם SYSERR הוא ערך חוקי למונה סמפור, ולכן במקרה שהפונקציה מחזירה SYSERR, הקורא לפונקציה לא יכול לדעת אם זהו ערך חוקי או לא.
פעולת signaln:
תגיות המסמך: |
תוכן העניינים:
שיתוף: |
תודה
הסברתם את זה, כמו שאר הנושאים, באופן הכי ברור שיש.