שאלת מבחן במערכות הפעלה - האוניברסיטה הפתוחה 2018 - אותות

מתי הכרחי לחסום סיגנלים (signals)? תזכורת: חסימת סיגנלים מתבצעת על ידי עדכון של מסכת סיגנלים חסומים (blocked signals mask) והעברתה ל-sigaction.

א. כאשר תהליך עומד לגשת למבנה נתונים שגם אחד או יותר מה-signal handlers בתוכנית ניגשים אליו.
ב. כאשר תהליך שמטרתו לפגוע במערכת (וירוס, למשל) רוצה למנוע מתהליכים אחרים לשלוח לו סיגנלים שיגרמו למותו (כגון SIGKILL).

ג. כאשר תהליך נמצא בשליטת debugger ורוצה להשתחרר ממנו על ידי חסימת סיגנל SIGSTOP.

ד. כאשר תהליך נמצא בכניסה לשגרת טיפול בפסיקה.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 852018סמסטר א
אותותסנכרוןקטע קריטיתנאי מרוץ
חשבו על ההשלכות של קבלת סיגנל בדיוק באמצע פעולה מורכבת על מבנה נתונים משותף. מה יקרה אם שגרת הטיפול בסיגנל (signal handler) ניגשת גם היא לאותו מבנה נתונים?
התשובה הנכונה היא א'.

סיגנל יכול להגיע לתהליך באופן אסינכרוני בכל רגע נתון, ולהפסיק את רצף הפקודות הרגיל שלו כדי להריץ את שגרת הטיפול בסיגנל (signal handler) שהוגדרה עבורו.

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

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

כדי למנוע זאת, יש להגדיר קטע קריטי (critical section) סביב הגישה למשאב המשותף (מבנה הנתונים). לפני הכניסה לקטע הקריטי, התהליך חייב לחסום את הסיגנל הרלוונטי. לאחר היציאה מהקטע הקריטי, הוא יכול להסיר את החסימה. פעולה זו מבטיחה שהפעולות על מבנה הנתונים יהיו אטומיות ביחס לשגרת הטיפול בסיגנל.

מדוע התשובות האחרות שגויות?
  • ב' ו-ג': מערכת ההפעלה מונעת מתהליכים לחסום, להתעלם או ללכוד את הסיגנלים SIGKILL ו-SIGSTOP. זוהי תכונת בטיחות חיונית המבטיחה שתמיד ניתן לסיים (להרוג) או לעצור תהליך, גם אם הוא תוקפני או תקוע. לכן, הפעולות המתוארות בסעיפים אלו אינן אפשריות.
  • ד': סעיף זה מבלבל בין סיגנלים (מנגנון תוכנה) לפסיקות חומרה (hardware interrupts). שגרת טיפול בפסיקה (Interrupt Service Routine - ISR) היא קוד ברמת הליבה שמטפל באירועי חומרה. בזמן ריצת ISR, הליבה אכן דואגת לחסום פסיקות אחרות (לפחות מאותו סוג או בעדיפות נמוכה יותר), אך זהו מנגנון פנימי של הליבה ואינו קשור לחסימת סיגנלים על ידי תהליך במרחב המשתמש (user space) באמצעות קריאות מערכת כמו sigaction.