שאלת מבחן במערכות הפעלה - האוניברסיטה הפתוחה 2016 - תהליכונים
הסבירו מה עושה התוכנית ורשמו מה יהיה הפלט שלה :
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 912016סמסטר א
★★★★★
תהליכוניםהחלפת הקשרתזמוןאותות
שימו לב כיצד האות
SIGALRM והמטפל שלו משמשים כמנגנון תזמון קדימותי המבצע החלפת הקשרים בין שני התהליכונים המדומים כל 3 שניות.התוכנית מדגימה מימוש של תזמון קדימותי (preemptive) עבור שני תהליכונים (threads) ברמת המשתמש. היא עושה זאת באמצעות שימוש במנגנון ההקשרים (contexts) של C (ספריית
1. אתחול ב-`main`: הפונקציה הראשית מגדירה שני הקשרים,
2. התחלת הריצה: התוכנית מפעילה שעון מעורר לשלוש שניות (
3. הפונקציה `f`: כל תהליכון מריץ את הפונקציה
4. מטפל האותות (`handler`): זהו המתזמן של המערכת. כל 3 שניות, שעון המעורר מצלצל והאות
פלט התוכנית:
התוכנית תרוץ בלולאה אינסופית ותיצור דפוס חוזר:
הפלט ייראה כך (התוכנית לעולם לא תסיים):
in thread 1
in thread 1
in thread 1
in signal handler: switching from 1 to 2
in thread 2
in thread 2
in thread 2
in signal handler: switching from 2 to 1
in thread 1
...
ucontext.h) ובאותות (signals).1. אתחול ב-`main`: הפונקציה הראשית מגדירה שני הקשרים,
uc[1] ו-uc[2]. כל הקשר מוגדר להריץ את הפונקציה f עם פרמטר אחר (1 ו-2, בהתאמה) ועם מחסנית נפרדת. בנוסף, היא מתקינה מטפל אותות (handler) עבור האות SIGALRM.2. התחלת הריצה: התוכנית מפעילה שעון מעורר לשלוש שניות (
alarm(3)) ומיד לאחר מכן מבצעת החלפת הקשר ראשונה באמצעות swapcontext(&uc[0], &uc[1]). פעולה זו שומרת את ההקשר של main ב-uc[0] ומתחילה להריץ את ההקשר uc[1], כלומר, מתחילה את ריצת תהליכון 1.3. הפונקציה `f`: כל תהליכון מריץ את הפונקציה
f בלולאה אינסופית. בכל איטרציה, הפונקציה מדפיסה את מספר התהליכון המזהה שלה ומשהה את ריצתו לשנייה אחת (sleep(1)).4. מטפל האותות (`handler`): זהו המתזמן של המערכת. כל 3 שניות, שעון המעורר מצלצל והאות
SIGALRM נשלח לתהליך. מערכת ההפעלה עוצרת את התהליכון הנוכחי ומריצה את הקוד של המטפל. המטפל קובע מחדש את שעון המעורר ל-3 שניות נוספות, מזהה איזה תהליכון רץ, מדפיס הודעת החלפה, ומבצע swapcontext כדי לעצור את התהליכון הנוכחי (ולשמור את מצבו) ולהמשיך את ריצת התהליכון השני מהנקודה בה עצר.פלט התוכנית:
התוכנית תרוץ בלולאה אינסופית ותיצור דפוס חוזר:
- תהליכון 1 ירוץ במשך כ-3 שניות ויספיק להדפיס את ההודעה "in thread 1" שלוש פעמים.
- לאחר 3 שניות, יופעל מטפל האותות, שידפיס הודעה על החלפה מ-1 ל-2.
- תהליכון 2 יתחיל לרוץ למשך כ-3 שניות וידפיס את ההודעה "in thread 2" שלוש פעמים.
- לאחר 3 שניות נוספות, יופעל שוב מטפל האותות, שידפיס הודעה על החלפה מ-2 ל-1.
- המחזור יחזור על עצמו.
הפלט ייראה כך (התוכנית לעולם לא תסיים):
in thread 1
in thread 1
in thread 1
in signal handler: switching from 1 to 2
in thread 2
in thread 2
in thread 2
in signal handler: switching from 2 to 1
in thread 1
...