מערכות הפעלה 2015 סמסטר ב׳ פתרון מבחן דוגמא אוניברסיטת אריאל המחלקה למדעי המחשב ומתמטיקה ד״ר אלעד חורב שאלה :1 א Event .הינו מקרה פרטי של Condition variableוניתן לדמותו באמצעות .condition variable אכן לא כל השפות מבחינות בין שני המנגנונים .ההבדל המרכזי הוא בשימוש של שניהם .על מנת להשהות תהליך או Threadעד אשר אירוע כלשהוא יתרחש מבלי זה יכנס ל critical sectionנשתמש ב .Eventב condition variablesנשתמש אם לאחר האירוע נרצה להיכנס ל .critical section ב .אלגוריתם Round Robinהינו אלגוריתם לתזמון תהליכים .האלגוריתם מתחזק רשימה של תהליכים להרצה .הפעולה הבסיסית היא להעניק qיחידות זמן ריצה לתהליך שבראש הרשימה .לאחר qיחידות זמן אלו אם התהליך שרץ זה עתה סיים אזי זה מפונה מן הרשימה .אחרת מוסף לסוף הרשימה .תהליכים חדשים מוספים בסוף הרשימה. היתרון המרכזי הינו שהאלגוריתם הינו preemptiveובעל היכולת לספק הבטחה לכל תהליך כי זה לא ירעב לקבלת .CPUהחסרון המרכזי הינו הצורך לקבוע את qבאופן שזה לא גדול מדי מכדי להשפיע לרעה על פרמטרים כגון turnaround time, waiting timeוכיו״ב ,ומצד שני לא קרוב מדי לזמן הדרוש לביצוע switchבין תהליכים מה שיוביל לחוסר ניצול של ה .CPU 1 : להלן הצעה לפתרון.ג Shared binarySemaphores arrival:=1, departure:=0 Shared integer counter:=0 void join_barrier() { down(arrival) counter=counter+1 if (counter<n): up(arrival) else: up(departure) down(departure) counter=counter-1 if (counter > 0): up(departure) else: up(arrival) } :להלן התשובות . נכון.1.ד :n = 2 להלן תרחיש אפשרי עבור. לא נכון.2.ד .while(num[A] > num[B]) תקוע בA ותהליךCS בתוך הB ( תהליך1 .num[A]>num[B] עדיין מתקיים.num[B] =0 וקובעCS יוצא מן הB ( תהליך2 . לנצחremainder code נשאר בB ( תהליך3 .num[A] > num[B] = 0 ( לנצח מתקיים4 2 .ד שאלה :2 סעיף א: טענה :האלגוריתם המוצע מספק .mutual exclusion הוכחה :נניח בשלילה כי הטענה איננה נכונה וכי קיימים זוג תהליכים Aו Bאשר נמצאים ב CSבאותו הזמן .יהיו num_Aו num_Bהמספרים שאלו מחזיקים בהם בעת כניסתם ל .CS בלי הגבלת הכלליות נניח כי: ).(*) (num_A,A) < (num_B,B נשקול את תהליך .Bתהליך זה הצליח להיכנס ל CSהיות והתרחשו האירועים הבאים: .1 Bקרא flag[A] = falseב whileהראשון. .2 אחד משני האירועים הבאים התרחש: B .2.1קרא num[A] = 0ב whileשני ,או B .2.2קרא num[A] != 0וגם ).(num[A],A) <= (num[B],B אירוע 2.2נוגד את )*( .אם כך האירועים הבאים התרחשו לפי הסדר הבא: )num_B is set -> read_B(flag[A] = false )-> read_B(num[A] = 0 -> num_A is set סתירה ל )*(. סעיף ב: טענה :האלגוריתם המוצע הינו .deadlock-free הוכחה :נניח בשלילה כי האלגוריתם איננו deadlock-freeכלומר קיימת קבוצה לא ריקה X אשר כל חבריה תקועים ב Entry Codeשלהם לנצח. .1נראה תחילה כי עבור כל kלא יתכן שאף חבר ב Xתקוע לנצח ב ) .while(flag[k] == trueנקבע את kונניח בשלילה כי תהליך xהשייך ל xתקוע לנצח ב ) while(flag[k] == trueלנצח .לפי הקוד הנחה זו מחייבת מצב שבו תהליך kהינו זריז יותר מ xבכניסה ויציאה מה CSולכן בכל פעם ש 3 xמקבל זמן ריצה הוא קורא .flag[k] = trueאולם ,עניין זה מחייב ש בשלב מסויים > ]num[k ] num[xואזי תהליך kימתין ב whileשני ובשלב זה .flag[k] = false .2לפי מקרה 1ניתן להניח שכל התהליכים ב Xתקועים ב whileהשני .נשים לב כי היות וישנו תמיד תהליך xהעל ערך ) (num[x],xייחודי קטן ביותר מבין כל התהליכים התקועים לכאורה יצליח תהליך זה להיכנס ל .CS סעיף ג: טענה :האלגוריתם המוצע הינו .starvation-free הוכחה :נניח בשלילה שהטענה לא נכונה וכי קיים תהליך Aאשר תקוע ב Entry codeשלו לנצח .היות והאלגוריתם הינו deadlock-freeלא קיים תהליך נוסף אשר תקוע גם הוא ב Entry codeשלו גם כן .בנוסף ,לפי מקרה 1של הטענה הקודמת Aב whileהשני .נותרו המקרים הבאים לשקילה: .1 קיימים תהליכים אשר זריזים יותר מ Aבכניסה ויציאה מן ה .CSזה לא יתכן שכן בשלב מסויים ] num[Aיהיה מינימאלי ו Aיצליח להכנס ל CSלפניהם. .2 כל התהליכים שערך ה numשלהם קטן או שווה לשל Aתקועים לנצח ב Remainder ) codeהתהליכים עם ערך numגדול יותר לא חוסמים את .(Aנשים לב שבעת יציאתם האחרונה כל אלו קובעים .num = 0ואזי התנאי שעליו Aממתין לא מחזיק לנצח. 4 :3 שאלה כבר ממתין0 לאחר שDoorway נכנס ל1 אם.turn_to_wait = 0 נכנס להמתנה0 כאשר. נכון.א .0 כבר ממתין ובכך ישחרר את0 לאחר שturn_to_wait =1 אזי יקבע Winner נוסיף משתנה משותף.ב Algorithm for q: //Entry code 1. Peterson_Enter_0(q,r) 2. Winner = q 3. Peterson_Enter_1(p,Winner) <CS> //Exit code 1. Peterson_Leave_1(p,Winner) 2. Peterson_Leave_0(q,r) Algorithm for p: //Entry code 1. Peterson_Enter_0(p,Winner) <CS> //Exit code 1. Peterson_Leave_0(p,Winner) Algorithm for r: //Entry code 1. Peterson_Enter_1(q,r) 2. Winner = r 3. Peterson_Enter_1(p, Winner) <CS> //Exit code 1. Peterson_Leave_1(p,Winner) 2. Peterson_Leave_1(q,r) :(הסבר )לא נדרש כחלק מן התשובה עבור שני תהליכיםPeterson נמצא תקוע בקוד הכניסה שלr אזי.CS בתוך הq נניח כעת כי .r מנסה להיכנס אזי זה יכנס לפניp אם בשלב זה.r ״ניצח״ אתq אלו שכן מוגנים וכי בכל רגע נתון לr וq המבוצעים על ידיWinner שימו לב כי השינויים למשתנה .Peterson תמיד מבצע אתp ישנה זהות ייחודית אשר כנגדהWInner . ישנה עדיפותp נבדוק כעת תרחיש להבהרה מדוע ל 5 .1 .2 .3 .4 .5 .6 .7 qבתוך ה .CS pמתחיל לבצע ) .Peterson_Enter_0(p,Winnerכעת p .Winner = qנכנס ל .busy wait qיוצא על ידי ביצוע ) .Peterson_Leave_1(p,Winnerבשלב זה בפעם הבאה ש pירוץ זה יכנס ל .CS נראה מה קורה כאשר אנו מנסים לגרום ל rלהשיג את .p נניח אם כן כי pלא מקבל זמן ריצה וכי qמבצע ) Peterson_Leave_0(q,rולאחר מכן r מבצע ) Peterson_Enter_1(q,rומנצח וקובע .Winner = r rמבצע ).Peterson_Enter_1(p,Winner זהו הזמן להיזכר בסעיף א׳ לשאלה זו :כעת אנו במצב בו pהתחיל המתנה ב Petersonלפני ש Winnerהתחיל את ה Doorwayשלו .ולכן pיכנס קודם ל .CS 6
© Copyright 2024