Sample exam 2015 - Elad Aigner

‫מערכות הפעלה ‪2015‬‬
‫סמסטר ב׳‬
‫מבחן דוגמא‬
‫אוניברסיטת אריאל‬
‫המחלקה למדעי המחשב ומתמטיקה‬
‫ד״ר אלעד חורב‬
‫הנחיות‪:‬‬
‫‪ .1‬המבחן הינו עם חומר סגור ובכתב יד ללא סיוע מחשבים‪.‬‬
‫‪ .2‬ניתן לרשום ״לא יודע‪/‬ת״ על סעיף ולזכות ב ‪ 20%‬מהנקודות המוקנות לסעיף הספציפי‪.‬‬
‫‪ .2.1‬במידה ולסעיף ניתנה תשובה ובנוסף נרשם לגבי הסעיף ״לא יודע‪/‬ת״ אזי הניקוד‬
‫שינתן לסעיף יהיה ‪ 0‬מבלי שהתשובה תיקרא‪.‬‬
‫‪ .3‬אם לא מצויינת השפה בה יש לרשום קוד אזי ניתן להשתמש בפסודו‪-‬קוד כפי שניתן‬
‫בהרצאות והתרגולים‪.‬‬
‫‪ .3.1‬אם מצויינת שפת תכנות אזי חובה לתת תשובה באמצעותה‪.‬‬
‫‪.3.2‬אם לא מצויינת שפה והתשובה ניתנת באמצעות שפת תכנות אין הדבר מקנה ניקוד‬
‫נוסף‪.‬‬
‫‪ .4‬אין להגדיר שום פעולות אטומיות על דעת עצמכם‪.‬‬
‫‪ .5‬ספקו הוכחה לאלגוריתם רק אם במפורש נכתב לספק אחת‪ ,‬אחרת אין צורך ולא ינתן‬
‫ניקוד נוסף במידה וכן תסופק‪.‬‬
‫‪ .6‬אין לכתוב בעיפרון‪.‬‬
‫‪ .7‬חובה לענות בדף התשובות המסופק עם המבחן‪ .‬תשובות‬
‫שלא בדף התשובות לא תיבדקנה‪.‬‬
‫‪1‬‬
‫שאלה ‪ 40) :1‬נקודות(‬
‫א‪ 10) .‬נקודות( מה ההבדל בין ‪ Event‬ל‪.Condition variable -‬‬
‫ב‪ 10) .‬נקודות( מהו אלגוריתם ‪ ?Round Robin‬ציינו חסרונות ויתרונות‪.‬‬
‫ג‪ 10) .‬נקודות( אובייקט ‪ Barrier‬יקרא ‪ reusable‬אם ניתן להשתמש באותו אובייקט שוב ושוב‬
‫לשם ביצוע ‪ .Barrier synchronisation‬כלומר‪ ,‬לאחר שכל התהליכים מגיעים לאותו אובייקט‬
‫‪ Barrier‬שיחרורם גורם ל״איפוס״ האובייקט אליו הגיעו ולכן ישנה היכולת להשתמש באותו‬
‫אובייקט שוב לביצוע ‪ .Barrier synchronisation‬ממש‪/‬י ‪ reusable barrier‬באמצעות משתנה‬
‫‪ integer‬יחיד ושני ‪ binary semaphores‬אשר יהיו משותפים לכל התהליכים‪ .‬עליך לכתוב‬
‫פרוצדורה בעלת השם והחתימה‪.void join_barrier() :‬‬
‫ד‪ 10) .‬נקודות( נניח כעת כי הפעולה‪ max(x_1,x_2,…,x_n)+1 :‬ניתנת לביצוע באופן‬
‫אטומי‪ .‬להלן קוד עבור אלגוריתם ל ‪ mutual exclusion‬עבור ‪ n‬תהליכים‪.‬‬
‫ד‪ 5) .1.‬נקודות( נכון או לא נכון‪ :‬האלגוריתם מספק ‪ .mutual exclusion‬אם תשובתכם הינה‬
‫כי הטענה נכונה רשמו רק ״נכון״ ללא הוכחה‪ .‬אחרת‪ ,‬יש לספק תרחיש שמראה‬
‫שהטענה לא נכונה‪.‬‬
‫ד‪ 5) .2.‬נקודות( נכון או לא נכון‪ :‬האלגוריתם הינו ‪ .starvation-free‬אם תשובתכם הינה כי‬
‫הטענה נכונה רשמו רק ״נכון״ ללא הוכחה‪ .‬אחרת‪ ,‬יש לספק תרחיש שמראה שהטענה‬
‫לא נכונה‪.‬‬
‫‪// n times‬‬
‫‪//shared:‬‬
‫;}‪int num[n] = {0‬‬
‫‪code for process i‬‬
‫‪//Entry code‬‬
‫!!‪num[i] = max(num[0],..., num[n-1])+1; //ATOMIC‬‬
‫{)‪for (k = 0 ;k < n; k++‬‬
‫;)]‪while(num[i] > num[k‬‬
‫}‬
‫>‪<CS‬‬
‫‪//Exit‬‬
‫;‪num[i]=0‬‬
‫‪2‬‬
‫שאלה ‪ 45) :2‬נקודות(‬
‫להלן הצעה למימוש של אלגוריתם ‪ Lamport‬למניעה הדדית עבור ‪ n‬תהליכים‪ .‬על מנת להיכנס‬
‫קטע הקריטי תהליך קורא לפרוצדורה )‪ Enter(i‬ועל מנת לעזוב את הקטע הקריטי קורא‬
‫לפרוצדורה )‪ Leave(i‬כאשר ‪ i‬הינו מספר הזהות הייחודי של התהליך‪.‬‬
‫‪//shared data:‬‬
‫;}‪int number[n] = {0‬‬
‫;]‪int flag[n‬‬
‫{)‪void Enter(int i‬‬
‫;‪flag[i] = true‬‬
‫;‪number[i] = max(number[0],…,number[n-1])+1‬‬
‫;‪flag[i] = false‬‬
‫{)‪for (k = 0; k< n; k++‬‬
‫;)‪while(flag[k] == true‬‬
‫;))‪while(number[k] != 0 && (number[k],k) < (number[i],i‬‬
‫}‬
‫}‬
‫{)‪void Leave(int i‬‬
‫;‪number[i] = 0‬‬
‫}‬
‫א‪ 15) .‬נקודות( הוכח או הפרך‪ :‬האלגוריתם מספק ‪.mutual exclusion‬‬
‫ב‪ 15) .‬נקודות( הוכח או הפרך‪ :‬האלגוריתם הינו ‪.deadlock-free‬‬
‫ג‪ 15) .‬נקודות( הוכח או הפרך‪ :‬האלגוריתם הינו ‪.starvation-free‬‬
‫‪3‬‬
‫שאלה ‪ 15) :3‬נקודות(‬
‫להלן הקוד של אלגוריתם ‪ Peterson‬כפי שזה הוצג בכתה‪.‬‬
‫‪Shared: bool inter[2] = {False}, turn_to_wait = Don’t care‬‬
‫‪Program for process 0‬‬
‫‪inter[0]:=true‬‬
‫‪1.‬‬
‫‪turn_to_wait:=0‬‬
‫‪2.‬‬
‫;)‪while (inter[1]=true and turn_to_wait=0‬‬
‫‪3.‬‬
‫>‪<CS‬‬
‫‪4.‬‬
‫‪inter[0]:=false‬‬
‫‪5.‬‬
‫‪Program for process 1‬‬
‫‪inter[1]:=true‬‬
‫‪1.‬‬
‫‪turn_to_wait:=1‬‬
‫‪2.‬‬
‫)‪while (inter[0]=true and turn_to_wait=1‬‬
‫‪3.‬‬
‫‪CS‬‬
‫‪4.‬‬
‫‪inter[1]:=false‬‬
‫‪5.‬‬
‫א‪ 5) .‬נקודות( השיבו נכון או לא נכון‪ :‬באלגוריתם של ‪ Peterson‬אם תהליך ‪ 0‬נכנס להמתנה‬
‫לפני ש ‪ 1‬נכנס ל ‪ Doorway‬אזי ‪ 0‬יכנס לפני ‪ 1‬ל ‪ ?CS‬הסבר‪/‬י תשובתך‪.‬‬
‫ב‪ 10) .‬נקודות( ישנם שלושה תהליכים ‪ .p,q,r‬הנכם נדרשים לתכנן עבור שלושתם אלגוריתם ל‬
‫‪ mutual exclusion‬שהינו ‪ .deadlock-free‬לרשותכם ארבעה מקטעי קוד המוגדרים באופן הבא‪:‬‬
‫נסמן ב )‪ Peterson_Enter_0(a,b‬את קוד הכניסה של אלגוריתם ‪ Peterson‬שבו ‪ a‬הינו‬
‫תהליך ‪ 0‬ו ‪ b‬הינו תהליך ‪ 1‬והמקטע הנ״ל הינו הקוד של ‪ .0‬באופן דומה מוגדר המקטע‬
‫)‪.Peterson_Enter_1(a,b‬‬
‫נסמן ב )‪ Peterson_Leave_0(a,b‬את קוד הכניסה היציאה של אלגוריתם ‪ Peterson‬שבו ‪a‬‬
‫הינו תהליך ‪ 0‬ו ‪ b‬הינו תהליך ‪ 1‬והמקטע הנ״ל הינו הקוד של ‪ .0‬באופן דומה מוגדר המקטע‬
‫)‪.Peterson_Leave_1(a,b‬‬
‫‪4‬‬
‫השמות ‪ p,q,r‬משותפים לכל התהליכים‪ .‬מעבר לכך הינכם יכולים להגדיר עוד משתנה אחד‬
‫בלבד שיהיה משותף לכל התהליכים שיכול לייצג תהליך‪.‬‬
‫השלימו את הקוד הבא עבור כל אחד מהתהליכים ‪ p,q,r‬על ידי הצבת המשתנה המשותף הנוסף‬
‫המותר לכם והמקטעים )‪ Peterson_Enter(a,b‬ו )‪ Peterson_Leave(a,b‬במקומות הנכונים עם‬
‫שמות התהליכים הנכונים במקום ‪ b‬ו ‪ .a‬זאת על מנת להשיג אלגוריתם ל ‪mutual exclusion‬‬
‫שהינו ‪ deadlock-free‬עבור שלושת התהליכים ובנוסף על כך נותן עדיפות כניסה ל ‪critical‬‬
‫‪ section‬לתהליך ‪ p‬באופן הבא‪:‬‬
‫אם ‪ p‬מתחיל להמתין למנעול לפני שהתהליך שכעת מחזיק במנעול מתחיל לבצע את קוד‬
‫היציאה שלו אזי ‪ p‬הינו התהליך הבא שיכנס ל ‪.critical section‬‬
‫העתיקו מקטעים אלו לתשובתכם והשלימו את החסר לפי הדרישות לעיל‪.‬‬
‫‪Algorithm for p:‬‬
‫‪Algorithm for r:‬‬
‫‪Algorithm for q:‬‬
‫‪//Entry code‬‬
‫‪1.‬‬
‫>‪<CS‬‬
‫‪//Exit code‬‬
‫‪1.‬‬
‫‪//Entry code‬‬
‫‪1.‬‬
‫‪2.‬‬
‫‪3.‬‬
‫>‪<CS‬‬
‫‪//Exit code‬‬
‫‪1.‬‬
‫‪2.‬‬
‫‪//Entry code‬‬
‫‪1.‬‬
‫‪2.‬‬
‫‪3.‬‬
‫>‪<CS‬‬
‫‪//Exit code‬‬
‫‪1.‬‬
‫‪2.‬‬
‫‪5‬‬