מערכות הפעלה

‫מערכות הפעלה‬
‫תרגול ‪ – 7‬ניהול זכרון‬
‫מה בתכנית?‬
‫‪ ‬ניהול זכרון ב‪XINU-‬‬
‫‪ ‬דוגמא לשיטת ה‪Best Fit-‬‬
‫‪2‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫מנהל זיכרון ‪XINU -‬‬
‫‪ ‬מעקב אחרי שטחי זכרון פנויים‬
‫‪ ‬הקצאת זיכרון עבור מערכת ההפעלה‬
‫‪ ‬הקצעת זכרון עבור האפליקציות‬
‫‪ ‬שחרור המחסנית של התהליך שחדל להתקיים‬
‫‪ ‬אין מנגנוני הגנה או מנגנוני תמיכה בזיכרון‬
‫הוירטואלי‬
‫‪ ‬המימוש פשוט ומינימלי (מערכת הפעלה לימודית)‬
‫‪3‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫השטח הדינמי‬
‫השטח שבשימוש על ידי ‪XINU‬‬
‫סגמנט המידע‬
‫שטח שמור‬
‫שטח ש‪-‬‬
‫‪ XINU‬ויתר ‪maxaddr‬‬
‫עליו‬
‫‪4‬‬
‫שטח דינמי‬
‫השטח בשימוש של ‪XINU‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫שטח סטטי‬
‫שטח גלובלי‬
‫‪end‬‬
‫ינואר ‪17‬‬
‫רשימת הפנויים‬
‫‪ – memlist ‬רשימת הבלוקים הפנויים‬
‫‪ ‬רשימה מקושרת של בלוקים פנויים המוכנים‬
‫להקצאה‬
‫‪ ‬הראש נמצא בבלוק גלובלי‬
‫‪ ‬האיברים הם בלוקים פנויים עצמם‬
‫‪ ‬ממוינת לפי כתובת ההתחלה של בלוק (לצורך‬
‫מיזוג)‬
‫‪5‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫רשימת הפנויים‬
‫‪ ‬כל השטחים‪ ,‬המוקצים והפנויים‪ ,‬נמצאים בכתובות‬
‫שהן כפולות של ‪ 4‬ואורכם כפולות של ‪4‬‬
‫‪ ‬שטחים מוקצים לא יופיעו ברשימה‬
‫‪ ‬שני שטחים פנויים רצופים לא יופיעו ברשימה‬
‫‪ ‬כאשר מבקשים הקצאת שטח זכרון שאינו כפולה‬
‫של ‪ 4‬בתים‪ ,‬יוקצה השטח באורך של הכפולה‬
‫הבאה של ‪ 12( 4‬בתים במקום ‪)9‬‬
‫‪ ‬הרשימה מאותחלת על ידי בלוק אחד בגודל כל‬
‫שטח הזכרון להקצאה‬
‫‪6‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫רשימת הפנויים‬
‫‪memlist‬‬
‫‪7‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫מדיניות הקצאת זכרון‬
‫‪ ‬מדיניות ‪First Fit‬‬
‫‪ ‬ההקצאה מתבצעת אם קיים בלוק פנוי בגודל‬
‫המתאים‬
‫‪ ‬הבלוק המתאים הראשון ברשימה נבחר להקצאה‬
‫‪ ‬אינו מממש ‪ – Best Fit‬סריקה של כל הבלוקים‬
‫להתאמה טובה יותר‬
‫‪ ‬לא בודק האם יש הרעבה של תהליכים אחרים על‬
‫ידי תהליך מסויים בשימוש בזכרון‬
‫‪8‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫מבני נתונים – ‪mem.h‬‬
‫‪9‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫קריאות מערכת הפעלה‬
‫‪ ‬הקצאת זכרון‬
‫)‪char* getmem(int nbytes‬‬
‫‪ ‬שחרור זכרון‬
‫)‪freemem(char* block, int size‬‬
‫‪10‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫)(‪getmem.c – getmem‬‬
‫‪11‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫)(‪getmem.c – getmem‬‬
‫‪ ‬גודל הבלוק מחושב ככפולה של ‪4‬‬
‫‪ ‬השיגרה עוברת על רשימת הפנויים‬
‫‪ ‬אם גודל הבלוק הפנוי גדול או שווה לגודל הנדרש‬
‫הבלוק מוקצה‬
‫‪ ‬אם גודל הבלוק הפנוי עולה על הנדרש בלוק פנוי‬
‫חדש בגודל ההפרש נוצר ברשימת הפנויים‬
‫‪12‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫)(‪freemem.c – freemem‬‬
‫‪13‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫)(‪freemem.c – freemem‬‬
‫‪ ‬מעדכנים את גודל הבלוק ואת כתובת הבלוק להיות‬
‫כפולה של ‪4‬‬
‫‪ ‬בודקים את גבולות הזכרון המותר בסגמנט‬
‫‪maxaddr‬‬
‫שטח שמור‬
‫שטח דינמי‬
‫‪block > maxaddr‬‬
‫‪end‬‬
‫שטח סטטי‬
‫‪block < end‬‬
‫‪ ‬מחפשים מיקום מתאים לבלוק המשתחרר‬
‫ברשימת הפנויים על פי כתובת הבלוק‬
‫‪14‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫)(‪freemem.c – freemem‬‬
‫‪15‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫)(‪freemem.c – freemem‬‬
‫‪ ‬בודקים תקינות הבלוק‬
‫‪ ‬אם הבלוק לא תקין מחזירים שגיאה‬
‫‪ ‬מוסיפים בלוק פנוי לרשימה‬
‫‪ ‬מנסים לאחד את הבלוק החדש עם בלוקים פנויים‬
‫נוספים אם זה אפשרי‬
‫‪16‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫)(‪ – freemem‬בדיקת תקינות‬
‫‪p‬‬
‫‪top‬‬
‫‪q‬‬
‫‪q->mlen‬‬
‫‪block < q + q->mlen‬‬
‫‪17‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫)(‪ – freemem‬בדיקת תקינות‬
‫‪p‬‬
‫‪q‬‬
‫‪block + size > p‬‬
‫‪18‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫ – בדיקת שילוב‬freemem()
q
p
top
q->mlen
size
block
p
q
q->mlen
size
block
17 ‫ינואר‬
7 ‫ תרגול‬- ‫מערכות הפעלה‬
19
‫ – בדיקת שילוב‬freemem()
p
q
size
q->mlen
block
p
q
q->mlen
17 ‫ינואר‬
size
block
7 ‫ תרגול‬- ‫מערכות הפעלה‬
20
‫שברור פנימי –‬
‫‪Internal Fragmentation‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪21‬‬
‫מצב בו ישנם שטחי זכרון שהוצאו מרשימת הפנויים‬
‫כתוצאת ההקצאה אך בהכרח לא נמצאים בשימוש‬
‫ב‪ XINU-‬כל הקצאה היא כפולה של ‪ .4‬לכן התהליך‬
‫המבקש הקצאה של ‪ 9‬בתים אכן יקבל מצביע ויוכל‬
‫להשתמש ב‪ 9-‬בתים מהמקום שהוחזר לו‬
‫למעשה ההקצאה היתה בגודל של ‪ ,12‬ו‪ 3-‬הבתים‬
‫שהוקצו מעבר לדרישה אינם פנויים לשימוש‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫דוגמה‬
/* assume free memory is 4000 bytes */
for (i=0; i<400; i++) {
arr[i] = getmem(10);
if (arr[i] == NULL) break;
}
printf(“Only %d bytes out of 4000 allocated”, 10*i);
‫ בתים מתוך‬3300 ‫ הקצאות הלולאה תפסק (הוקצו רק‬333 ‫לאחר‬
)‫ בתים פנויים‬4000
)333 = 4000/12( 12 ‫ הקצאות של‬333 ‫בפועל היו‬
17 ‫ינואר‬
7 ‫ תרגול‬- ‫מערכות הפעלה‬
22


‫שברור פנימי –‬
‫‪Internal Fragmentation‬‬
‫בעית שברור קיימת לא רק ב‪ XINU-‬אלא גם‬
‫במערכות הפעלה אמיתיות!!!‬
‫‪23‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫דוגמה‬
‫‪ ‬שנה את מדיניות הקצאת הזיכרון מ‪ First Fit-‬ל‪-‬‬
‫‪Best Fit‬‬
‫‪ ‬שנה את )(‪ getmem‬כך שתתמוך במדיניות‬
‫החדשה‬
‫‪ ‬בדוק את המימוש על ידי סדרת פעולות הבאה‪:‬‬
‫‪ ‬הקצאה של ‪ 15000‬בתים לתוך מצביע ‪p‬‬
‫‪ ‬שחרור של ‪ 4000‬בתים עבור מצביע ‪p‬‬
‫‪ ‬שחרור של ‪ 2000‬בתים עבור מצביע ‪p+10000‬‬
‫‪ ‬הקצאה של ‪ 1500‬בתים לתוך מצביע ‪q‬‬
‫‪24‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫‪Best Fit – getmem.c‬‬
‫‪25‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫‪Best Fit – getmem.c‬‬
‫‪26‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫‪Best Fit – getmem.c‬‬
‫‪ ‬עוברים על כל האברים ברשימת הפנויים‬
‫‪ ‬אם מצאנו בלוק שגודלו שווה לגודל הבלוק הנדרש‬
‫לא ממשיכים לסרוק עד סוף הרשימה ועוברים‬
‫להקצאה מיד‬
‫‪ ‬אם מצאנו בלוק בגודל שמתאים טוב יותר לגודל‬
‫הבלוק הנדרש מעדכנים את נתוני ה‪best fit-‬‬
‫(‪ )best, best_size‬עם נתוני הבלוק שמצאנו‬
‫‪27‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫‪Best Fit – getmem.c‬‬
‫‪28‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫‪Best Fit – getmem.c‬‬
‫‪ ‬מבצעים הקצאה של בלוק חדש ועדכון של בלוק‬
‫פנוי‬
‫‪ ‬אין שינוי מהותי בחלק קוד זה‬
‫‪ ‬בודקים את הממימוש בעזרת תכנת בדיקה‬
‫‪memtest.c‬‬
‫‪29‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫‪Best Fit – memtest.c‬‬
‫‪30‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫‪Best Fit – memtest.c‬‬
‫‪31‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬