This question spans 3 stages — each part below is tagged with, and links to, the stage it belongs to.
הנחה: ללא קשר לתשובתך בשאלה הקודמת, בסעיפים שלמטה נניח שהאב נותר חי.
Full original question text (raw OCR)
נתון קטע הקוד הבא: 1 static int g_alarm = 0; 2 void alrm_handler(int signo) { 3 g_alarm = 1; 4 } 5 6 void son() { // assume executing as superuser 7 struct sched_param param; 8 param.sched_priority = 50; 9 sched_setscheduler(getpid(),SCHED_FIFO, ¶m); 10 11 kill(getppid(), SIG_ALRM); 12 sched_yield(); 13 14 printf("msg1\n"); 15 while(1) /*endless loop*/; 16 exit(0); 17 } 18 19 int main() { 20 signal(SIG_ALRM, alrm_handler); 21 int son_pid = fork(); 22 if(son_pid==0) 23 son(); 24 waitpid(son_pid); 25 printf("msg2\n"); 26 return 0; 27 } תזכורת: • sched_setscheduler מאפשרת לשנות את מדיניות הזימון של תהליכים ואת העדיפות שלהם. • כשתהליך בעל מדיניות זימון FIFO קורא ל- sched_yield, הוא מועבר לסוף תור העדיפות המתאים, ואז נקראת הפונקציה schedule. • קריאת המערכת ()waitpid ניתנת להפרעה ע"י סיגנלים (interruptible system call) הנחות: • במערכת קיימים רק שני תהליכים: האב והבן, לפי הקוד הנתון. • במערכת יש מעבד יחיד עם ליבה יחידה, אלא אם נאמר אחרת. סטודנטים קבלו את ההבהרה במבחן שתליך האב (כמו כל קוד אתם כותבים) מתחיל ריצתו עם עדיפות ברירת מחדל.
(4 נק') אם מוחקים את שורה 12 (sched_yield), אז הקוד שנוצר ידפיס את אותו הפלט ביחס לתוכנית המקורית. נכון / לא נכון . נימוק:
System call trap and kernel entryfork/exec address-space semanticslibc syscall wrapper caching pitfalls(4 נק') המחרוזת msg2 לא תודפס כי בשורה 11 (kill) תהליך הבן הורג את תהליך האב. נכון / לא נכון. נימוק:
System call trap and kernel entryfork/exec address-space semanticslibc syscall wrapper caching pitfalls(4 נק') יתכן שהמחרוזת msg2 תודפס לפני המחרוזת msg1. נכון / לא נכון . נימוק:
System call trap and kernel entryfork/exec address-space semanticslibc syscall wrapper caching pitfalls(5 נק') אם מוחקים את שורה 15 (לולאת ה-while), אז סדר ההדפסה הינו בהכרח: msg1 msg2 נכון / לא נכון . נימוק:
System call trap and kernel entryfork/exec address-space semanticslibc syscall wrapper caching pitfalls(4 נק') בהנחה שהמעבד מרובה ליבות, אז סדר ההדפסה של התוכנית המקורית (עם לולאת ה- while) הינו בהכרח: msg1 msg2 נכון / לא נכון . נימוק:
System call trap and kernel entryfork/exec address-space semanticslibc syscall wrapper caching pitfalls(4 נק') בהנחה שהמעבד מרובה ליבות, אם נוסיף לתוכנית המקורית את הטקסט הבא: g_alarm = 2; בשורה 13, אז יתכן race condition בהתייחס למשתנה g_alarm נכון / לא נכון. נימוק:
System call trap and kernel entryfork/exec address-space semanticslibc syscall wrapper caching pitfalls
The exam question — original PDF
pages 5, 6, 7Exactly as it appears on the exam paper.
Built from these components
Ordered basic → advanced. Master the earlier ones first.
Review the material
Read these before you answer — each verified slide teaches a component this question tests, and nothing from an unrelated topic is included. Tutorial slides show the actual slide image.
אחרי fork()parentint main() { int x = 0; pid_t p = fork(); if (p == 0) { x = 1; } else { x = 2; }}sonint main() { int x = 0; pid_t p = fork(); if (p == 0) { x = 1; } else { x = 2; }}מערכות הפעלה - תרגול 210
הדפסה מתואמת למסךשימוש ב-wait() יכול לפתור את הבעיה שראינו קודם כאשר מדפיסים למסך במקביל משני תהליכים:int main() { pid_t p = fork(); if (p > 0) { // parent waits for child wait(NULL); } printf(“hello”); return 0;}מערכות הפעלה - תרגול 215
קריאות המערכת getpid(), getppid()pid_t getpid();קריאת מערכת המחזירה לתהליך הקורא את ה-pid של עצמו.pid_t getppid();קריאת מערכת המחזירה את ה-PID של תהליך האב של התהליך הקורא.שאלה: מה המשמעות של getppid() == 1 עבור תהליך משתמש טיפוסי?תשובה: תהליך האב הוא init. קורה למשל אם תהליך הבן יתום.מערכות הפעלה - תרגול 222
אתחול תהליכים בלינוקסמשתמשים מתחברים לעבודה בלינוקס דרך מסופים (terminal).מסוף = מסך + מקלדת (מקומי או מרוחק).התהליך init יוצר תהליך בן עבור כל מסוף, אשר טוען ומבצע את המשימות הבאות לפי הסדר:איתחול של המסוף.התחברות של המשתמש עם שם משתמש וסיסמא באמצעות תכנית login.אם אושרה כניסת המשתמש: קריאה לתוכנית shell(כמו tcsh או bash) המאפשרת למשתמש להעביר פקודות למערכת ההפעלה.מערכות הפעלה - תרגול 225
מערכות הפעלה - תרגול 2281שאלה ממבחן
TL;DRזַמָּן התהליכים ((scheduler הוא הרכיב במערכת ההפעלה שאחראי על בחירת התהליך הבא שירוץ על המעבד.אנחנו נלמד, בתור דוגמה, את אלגוריתם הזימון של לינוקס.אבל לפני שנלמד דוגמה "אמיתית" ומורכבת, נרצה להבין את הגישות הבסיסיות בזימון תהליכים כדי לפתח אינטואיציה.מערכות הפעלה - תרגול 52זימון תהליכים בלינוקסCFS = completely fair schedulerאלגוריתם זימון של תהליכים רגיליםSCHED_FIFO, SCHED_RRאלגוריתם זימון של תהליכי זמן אמת
דוגמת FCFSaverageResponseTime = (10 + 20 + 30) / 3 = 20כעת נסיר את הנחה 1 ("כל התהליכים רצים למשך אותו זמן"). לכל תהליך זמן ריצה משלו.תוכלו לחשוב על דוגמה שבה FCFS אינו יעיל?מערכות הפעלה - תרגול 59כל התהליכים רצים למשך אותו זמן.כל התהליכים מגיעים באותו זמן (t=0).אם תהליך התחיל לרוץ, אז הוא ירוץ עד לסיומו ללא הפסקות.התהליכים משתמשים רק במעבד ולא מבצעים I/O.זמן הריצה של כל התהליכים ידוע מראש.
אפקט השיירה (convoy effect)averageResponseTime = (100 + 110 + 120) / 3 = 110אלגוריתם FCFS עלול לסבול מ"אפקט השיירה": מצב שבו תהליך אחד ארוך מעכב הרבה תהליכים קצרים. מערכות הפעלה - תרגול 510
אלגוריתם SRTFSRTF = shortest remaining time firstנקרא גם: STCF = shortest time to completion firstאופן פעולה: כמו SJF, אבל עם הפקעות.בכל פעם שתהליך חדש מגיע למערכת, SRTF מחשב למי מבין התהליכים (כולל התהליך החדש) נותר הכי פחות זמן לרוץ, ובוחר את התהליך הזה לריצה.תחת ההנחות החדשות, ניתן להוכיח כי SRTF אופטימלי במדד זמן התגובה הממוצע.בתוספת הנחה כי זמן החלפת הקשר הוא אפסי.מערכות הפעלה - תרגול 515כל התהליכים רצים למשך אותו זמן.כל התהליכים מגיעים באותו זמן (t=0).אם תהליך התחיל לרוץ, אז הוא ירוץ עד לסיומו ללא הפסקות.התהליכים משתמשים רק במעבד ולא מבצעים I/O.זמן הריצה של כל התהליכים ידוע מראש.
מדיניות זימון של תהליךלכל תהליך זמן-אמת יש מדיניות זימון (scheduling policy):SCHED_FIFO או SCHED_RR .נקבעת ע"י המשתמש באמצעות קריאות מערכת sched_setscheduler() .מדיניות הזימון – תשפיע על כמה זמן ריצה כל תהליך יקבל ואופן עבודת התור.מערכות הפעלה - תרגול 535
עדיפויותCFS מאפשר למשתמש להגדיר עדיפויות לתהליכים וכך לחלק את זמן המעבד בצורה שונה בין התהליכים.העדיפות של התהליך מיוצגת ע"י הערך -20 ≤ nice ≤ +19 .ברירת המחדל היא nice=0 .תהליך "נחמד" יותר יהיה בעדיפות נמוכה יותר.לכל עדיפות יש משקל:מערכות הפעלה - תרגול 550
קצת נוסחאותנניח שיש במערכת n תהליכים עם עדיפויות: P1, P2, …, Pnומשקלים: W1, W2, …, Wn .נניח כי W0 הוא המשקל המתאים לעדיפות nice=0.אז זמן הריצה הווירטואלי של התהליך ה-i מתקדם לפי:VRi += (W0 / Wi) ∙ ∆Tכאשר ∆T הוא זמן הריצה לפי שעון אמיתי.זמן הריצה הווירטואלי זהה לזמן הריצה האמיתי עבור ברירת המחדל nice=0.ניתן להוכיח כי הקוונטום של התהליך ה-i הוא:Qi = (Wi / ΣWi) ∙ sched_latencyמערכות הפעלה - תרגול 551
תרגול 8מנגנוני סנכרון: משתני תנאימנגנוני סנכרון: סמפוריםדוגמה: מימוש מנעול קוראים-כותביםסינכרון בגרעין לינוקס1מערכות הפעלה - תרגול 8
שחרור חוטים ממתיניםint pthread_cond_signal(pthread_cond_t *cond); משחררת את אחד החוטים הממתינים (הגינות לא מובטחת).int pthread_cond_broadcast(pthread_cond_t *cond);משחררת את כל החוטים הממתינים.כל החוטים מפסיקים להמתין על משתנה התנאי ועוברים להמתין על המנעול. החוטים יחזרו לפעילות בזה אחר זה (בסדר כלשהו, לאו דווקא הוגן) לאחר שינעלו מחדש את ה-mutex.שימו לב: אם אין אף חוט שממתין באותו רגע על משתנה התנאי cond, הפעולות חסרות השפעה (הסיגנל הולך לאיבוד ואינו נזכר הלאה).ערך מוחזר: הפונקציות תמיד מצליחות ומחזירות 0.מערכות הפעלה - תרגול 812
The exam text, the skills it tests, and the exact slides are already in context.