אוניברסיטת בן-גוריון בנגב, המחלקה למדעי המחשב מועד א' במערכות הפעלה מרצים: איתי דינור, דני הנדלר ומרינה קוגן-סדצקי. מתרגלים: אור דינרי, מתן דרורי, סימיון נוביקוב, צחי ספורטה, עמית פורטנוי וירין קופר. ענו על כל השאלות: סה"כ 100 נקודות. תאריך הבחינה: 24 ביוני, 2019 שם הקורס: מערכות הפעלה מספר הקורס: 20213031 שנה: 2019, סמסטר: ב', מועד: משך הבחינה: שלוש שעות חומר עזר: אסור א' 1. מערכות קבצים )25 נקודות( )10 נק'( שלומציונה טוענת שהרצת התוכנית המוצגת להלן תגרום ל-.run-time error לעומתה, זרובבל טוען שהתוכנית תסתיים באופן תקין. מי מהם צודק ומה יהיה תוכנו של הקובץ a.txt אחרי סיום הריצה? נמקו במדויק ובקצרה. א. FILE *fptr; int main() { fptr=fopen( a.txt, w ); if(fork()==0) { fprintf(fptr, 123 ); fclose(fptr); else { wait(); fprintf(fptr, abc ); fclose(fptr); return 0; )15 נק'( תכנית קוראת קובץ בשם /usr/tmp/file.txt במערכת קבצים של.Unix גודל הקובץ הוא 10.5K. bytes הניחו שגודלו של כל בלוק במערכת הקבצים הוא 1K bytes ושבתחילת ריצת התוכנית מבני הנתונים היחידים של מערכת הקבצים שנמצאים בזיכרון ה- RAM הינם ה- root directory וה- inode שלו. הניחו גם שכל inode נמצא בשלמותו בבלוק יחיד של הדיסק ושגם כל תיקיה (directory) נמצאת בשלמותה בבלוק יחיד של הדיסק. הניחו בנוסף שה- buffer cache גדול וכל בלוק המובא ל- RAM במהלך הריצה נשאר בו עד סוף הריצה ושבכל inode יש 10 שדות של.direct block numbers i. )5 נק'( כמה בלוקים תצטרך התוכנית לקרוא מן הדיסק על מנת להביא את כל תוכנו של הקובץ /usr/tmp/file.txt ל- RAM? פרטו את אופן החישוב. ב. )5 נק'( נניח כי לקובץ הנ"ל )/usr/tmp/file.txt( קיים קישור סימבולי link) (soft בשם /usr/tmp/x וכי לאחר קריאת הקובץ ישירות דרך /usr/tmp/file.txt התוכנית קוראת את הקובץ בהצלחה גם דרך קישור סימבולי זה. כמה בלוקים נוספים תצטרך התוכנית לקרוא מן הדיסק על מנת להביא את כל תוכנו של הקובץ /usr/tmp/file.txt באמצעות הקישור הסימבולי? פרטו את אופן החישוב. עמ' 1 מתוך 6
)5 נק'( ענו על אותה שאלה של סעיף ii כאשר הפעם /usr/tmp/x הינו hard link לקובץ./usr/tmp/file.txt פרטו את אופן החישוב. i מערכת ההפעלה Xv6 )25 נקודות(.2 בסוף הבחינה מופיע נספח עם קוד של Xv6 בו תוכלו להסתייע כדי לפתור שאלה זו. א. )10 נק'( להלן קוד של user program אותה מריצים מעל.Xv6 )5 נק'( נתון כי במערכת מעבד יחיד. יהא n מספר השורות בהן כתוב hello המופיעות בקובץ hello.txt לאחר סיום הדפסת המחרוזת. done מהם הערכים האפשריים של n? הסבירו תשובתכם במדויק. ניתן להיעזר בקוד של הפונקציה,trap הנתון בסוף הבחינה. )5 נק'( ענו על אותה שאלה בהינתן כי המערכת מרובת מעבדים. הסבירו תשובתכם במדויק. #include "types.h" #include "user.h" #include "fcntl.h" 1. int main() { 2. int fd = open("hello.txt", O_CREATE O_WRONLY); 3. int pid = fork(); 4. if(pid > 0) { 5. sleep(100); 6. kill(pid); 7. write(fd, "done\n", 5); 8. wait(); 9. 10. 11. while(1) { write(fd, "hello\n", 6); 12. )8 נק'( בעת יצירת תהליך חדש באמצעות הקריאה ל-,fork ה- trapframes והתהליך הבן זהים, למעט הבדל יחיד. הסבירו בקצרה מהו ההבדל. ב. של התהליך האב בעבודה 2 התבקשתם לממש את הפונקציה: int kthread_create(void (*start_func)(), void *stack). ג. )7 נק'( אילו השמות (assignments) יש לבצע ל- trapframe של החוט החדש שנוצר ע"י הקריאה לפונקציה על מנת שיוכל לרוץ כהלכה? הסבירו תשובתכם בקצרה. עמ' 2 מתוך 6
3. סינכרוניזציה )25 נקודות( )13 נק'( בכל חלקי הסעיף, כדי להוכיח שתכונה אינה מתקיימת, כתבו תסריט מדויק המדגים זאת. כדי להוכיח שתכונה מתקיימת, כתבו נימוק קצר ומדויק )אין צורך בהוכחות פורמליות(. להזכירכם, הפעולה האטומית swap(addr,v) כותבת ערך v לכתובת addr ומחזירה את הערך הקודם. הפעולה האטומית compare-and-swap(addr,old,new) משווה את הערך ב- addr ל- old. אם הערכים שווים, היא כותבת את הערך new ל- addr ומחזירה ;true אחרת היא אינה משנה את ערך addr ומחזירה.false א. שלומציונהערכה שינויים באלגוריתם ה- MCS למניעה הדדית וקיבלה את האלגוריתם הבא: Program for process i (1,,n) Qnode: structure {bit locked, Qnode *next shared Qnode mynodei, Qnode *tail initially null local succeesor 1 mynodei.next := null 2 pred := swap(tail, &mynodei) 3 if (pred null) { 4 mynodei.locked := true 5 pred->next := &mynodei 6 await mynodei.locked = false 7 CS 8 if mynodei.next null { 9 successor := mynodei.next 10 successor->locked := false 11 else 12 compare-and-swap(tail, &mynodei, null) האם האלגוריתם החדש מקיים מניעה הדדית? האם האלגוריתם החדש מקיים חופש מקיפאון freedom)?(deadlock האם האלגוריתם מקיים את תכונת (FIFO)?first-in- first out )4 נק'( )5 נק'( )4 נק'( i )12 נק'( בכל החלקים של סעיף זה יש לנמק במדויק ובקצרה. נתון קטע הקוד הבא אותו מבצעים 0<n תהליכים. הקוד משתמש בסמאפור הוגן )first-in- first-out( S ובמונה C התומך בפעולה אטומית של fetch-and-inc המאותחל ל- 0. פעולת fetch-and-inc מגדילה את ערך המונה ב- 1 ומחזירה את ערכו הקודם של המונה. הניחו כי n זוגי. קטע האיתחול )הלולאה בשורה 1( מבוצע פעם אחת בלבד לפני תחילת ריצת התהליכים. shared semaphore S initially 0 shared counter C initially 0 Initialization code 1 for (i=0; i < n/2; i++) S.up Program for process `` i (1,,n) 2 S.down 3 S.down 4 C.fetch-and-inc( ) 5 S.up ב. עמ' 3 מתוך 6
תהא E קבוצת כל הריצות האפשריות בהן כל אחד מ- n התהליכים מבצע את קטע הקוד שלמעלה פעם אחת בדיוק, עד אשר הוא מסיים אותו או נתקע בפעולת down לנצח. עבור ריצה כזו,E E נסמן ב- E. בסוף הריצה C את הערך אליו מגיע המונה C(E) )4 נק'( בהנחה שהסמאפור הינו מסוג,counting semaphore מהו הערך המקסימלי של כאשר המקסימום נלקח על פני כל הריצות ב- E?,C(E) )4 נק'( בהנחה שהסמאפור הינו מסוג,counting semaphore מהו הערך המינימלי של,C(E) כאשר המינימום נלקח על פני כל הריצות ב- E? )4 נק'( בהנחה שהסמאפור הינו מסוג,binary semaphore מהו הערך המקסימלי של,C(E) כאשר המקסימום נלקח על פני כל הריצות ב- E? i 4. ניהול זיכרון )25 נקודות( א. )15 נק') )5 נק') הסבירו בקצרה מדוע בעת החלפת תהליכים switch) (process context צריך לבצע ל- TLB. flush )5 נק') במערכת הפעלה דמיונית I-UNIX הוחלט שבכל החלפת תהליכים, לפני הביצוע של ה- flush ל- TLB, תוכן ה- TLB ישמר ב- PCB של התהליך המוחלף. מצד שני, כאשר תהליך שהוחלף חוזר לרוץ, ערכי ה- TLB אשר נשמרו עבורו ב- PCB ייטענו מחדש ל- TLB. הסבירו בקצרה מה עשוי להיות היתרון במימוש השינוי הנ"ל על פני המערכת המקורית )שרק ביצעה flush ל- TLB בעת החלפת תהליכים(. )5 נק') לאחר מימוש השינוי בסעיף הקודם, התברר שלפעמים, תוכניות שרצו בצורה תקינה על מערכת ה- I-UNIX המקורית הוציאו פלט שגוי ואף התרסקו. הסבירו בקצרה מה עשוי להיות הגורם לתקלה. i ב. )10 נק') )5 נק') במערכת,UNIX נתונים שני תהליכים שאין ביניהם יחס )ישיר או עקיף( של תהליך אב ותהליך בן. האם יתכן מצב שבו מערכת ההפעלה תמפה שני דפים של קוד בזיכרון הוירטואלי של שני התהליכים )דף אחד עבור כל תהליך( לאותו דף פיסי? אם כן, תארו תרחיש בו מיפוי כזה יתרחש. אם לא, נמקו בקצרה. )5 נק') במערכת,UNIX האם יתכן שמערכת ההפעלה תמפה שני דפים של נתונים בזיכרון הוירטואלי של שני תהליכים )דף אחד עבור כל תהליך( לאותו דף פיסי, והמיפויים יישארו תקפים גם כאשר אחד התהליכים יכתוב לדף? אם כן, תארו תרחיש בו מיפוי כזה יתרחש. אם לא, נמקו בקצרה. ב ה צ ל ח ה! עמ' 4 מתוך 6
נספח קוד Xv6 void trap(struct trapframe *tf) { if(tf->trapno == T_SYSCALL){ if(myproc()->killed) myproc()->tf = tf; syscall(); if(myproc()->killed) return; switch(tf->trapno) { /* Irrelevant */ // Force process exit if it has been killed and is in user space. // (If it is still executing in the kernel, let it keep running // until it gets to the regular system call return.) if(myproc() && myproc()->killed && (tf->cs&3) == DPL_USER) // Force process to give up CPU on clock tick. // If interrupts were on while locks held, would need to check nlock. if(myproc() && myproc()->state == RUNNING && tf->trapno == T_IRQ0+IRQ_TIMER) yield(); // Check if the process has been killed since we yielded if(myproc() && myproc()->killed && (tf->cs&3) == DPL_USER) // Layout of the trap frame built on the stack by the // hardware and by trapasm.s, and passed to trap(). struct trapframe { // registers as pushed by pusha uint edi; uint esi; uint ebp; uint oesp; // useless & ignored uint ebx; uint edx; uint ecx; uint eax; עמ' 5 מתוך 6
// rest of trap frame ushort gs; ushort padding1; ushort fs; ushort padding2; ushort es; ushort padding3; ushort ds; ushort padding4; uint trapno; // below here defined by x86 hardware uint err; uint eip; ushort cs; ushort padding5; uint eflags; // below here only when crossing rings, such as from user to kernel uint esp; ushort ss; ushort padding6; ; עמ' 6 מתוך 6