Chapter 11 - Memory Management Shayke Bilu PhD
UNIX -מנהל זיכרון
מעקב אחרי שטחי זכרון פנויים
הקצאת זיכרון עבור מערכת ההפעלה
הקצעת זכרון עבור האפליקציות
שחרור המחסנית של התהליך שחדל להתקיים
אין מנגנוני הגנה או מנגנוני תמיכה בזיכרון
הוירטואלי
(מערכת הפעלה לימודית)המימוש פשוט ומינימלי
Chapter 11 - Memory Management Shayke Bilu PhD
השטח הדינמי
UNIXהשטח שבשימוש על ידי
סגמנט המידע
maxaddr end
UNIXהשטח בשימוש של UNIX-ששטח
ויתר עליו
שטח גלובלי
שטח שמור שטח דינמי שטח סטטי
Chapter 11 - Memory Management Shayke Bilu PhD
רשימת הפנויים
memlist – רשימת הבלוקים הפנויים
רשימה מקושרת של בלוקים פנויים המוכנים
להקצאה
הראש נמצא בבלוק גלובלי
האיברים הם בלוקים פנויים עצמם
לצורך )ממוינת לפי כתובת ההתחלה של בלוק
(מיזוג
Chapter 11 - Memory Management Shayke Bilu PhD
רשימת הפנויים
נמצאים בכתובות , המוקצים והפנויים, כל השטחים
4ואורכם כפולות של 4שהן כפולות של
שטחים מוקצים לא יופיעו ברשימה
שני שטחים פנויים רצופים לא יופיעו ברשימה
כאשר מבקשים הקצאת שטח זכרון שאינו כפולה
יוקצה השטח באורך של הכפולה , בתים 4של
(9בתים במקום 12) 4הבאה של
הרשימה מאותחלת על ידי בלוק אחד בגודל כל
שטח הזכרון להקצאה
Chapter 11 - Memory Management Shayke Bilu PhD
מדיניות הקצאת זכרון
מדיניותFirst Fit
ההקצאה מתבצעת אם קיים בלוק פנוי בגודל
המתאים
הבלוק המתאים הראשון ברשימה נבחר להקצאה
אינו מממשBest Fit – סריקה של כל הבלוקים
להתאמה טובה יותר
לא בודק האם יש הרעבה של תהליכים אחרים על
ידי תהליך מסויים בשימוש בזכרון
Chapter 11 - Memory Management Shayke Bilu PhD
קריאות מערכת הפעלה
הקצאת זכרון
char* getmem(int nbytes)
שחרור זכרון
freemem(char* block, int size)
Chapter 11 - Memory Management Shayke Bilu PhD
getmem() – getmem.c
4גודל הבלוק מחושב ככפולה של
השיגרה עוברת על רשימת הפנויים
אם גודל הבלוק הפנוי גדול או שווה לגודל הנדרש
הבלוק מוקצה
אם גודל הבלוק הפנוי עולה על הנדרש בלוק פנוי
חדש בגודל ההפרש נוצר ברשימת הפנויים
Chapter 11 - Memory Management Shayke Bilu PhD
freemem() – freemem.c
מעדכנים את גודל הבלוק ואת כתובת הבלוק להיות
4כפולה של
בודקים את גבולות הזכרון המותר בסגמנט
מחפשים מיקום מתאים לבלוק המשתחרר
ברשימת הפנויים על פי כתובת הבלוק
שטח שמור שטח דינמי שטח סטטי
block < end block > maxaddr
end maxaddr
Chapter 11 - Memory Management Shayke Bilu PhD
freemem() – freemem.c
בודקים תקינות הבלוק
אם הבלוק לא תקין מחזירים שגיאה
מוסיפים בלוק פנוי לרשימה
מנסים לאחד את הבלוק החדש עם בלוקים פנויים
נוספים אם זה אפשרי
Chapter 11 - Memory Management Shayke Bilu PhD
freemem() – בדיקת תקינות
q p
q->mlen
block < q + q->mlen
top
Chapter 11 - Memory Management Shayke Bilu PhD
freemem() – בדיקת שילוב
q p
block
top
q->mlen size
q p
block
q->mlen size
Chapter 11 - Memory Management Shayke Bilu PhD
freemem() – בדיקת שילוב
q p
block
q->mlen size
q p
block
q->mlen size
Chapter 11 - Memory Management Shayke Bilu PhD
–שברור פנימי
Internal Fragmentation
מצב בו ישנם שטחי זכרון שהוצאו מרשימת הפנויים
כתוצאת ההקצאה אך בהכרח לא נמצאים בשימוש
ב-XINU לכן התהליך . 4כל הקצאה היא כפולה של
בתים אכן יקבל מצביע ויוכל 9המבקש הקצאה של
בתים מהמקום שהוחזר לו 9-להשתמש ב
הבתים 3-ו, 12למעשה ההקצאה היתה בגודל של
שהוקצו מעבר לדרישה אינם פנויים לשימוש
Chapter 11 - Memory Management Shayke Bilu PhD
דוגמה
/* 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בפועל היו
Chapter 11 - Memory Management Shayke Bilu PhD
–שברור פנימי
Internal Fragmentation
אלא גם XINU-בעית שברור קיימת לא רק ב
!!!במערכות הפעלה אמיתיות
Chapter 11 - Memory Management Shayke Bilu PhD
דוגמה
שנה את מדיניות הקצאת הזיכרון מ-First Fit ל-
Best Fit
שנה אתgetmem() כך שתתמוך במדיניות
החדשה
בדוק את המימוש על ידי סדרת פעולות הבאה:
בתים לתוך מצביע 15000הקצאה שלp
בתים עבור מצביע 4000שחרור שלp
בתים עבור מצביע 2000שחרור שלp+10000
בתים לתוך מצביע 1500הקצאה שלq
Chapter 11 - Memory Management Shayke Bilu PhD
Best Fit – getmem.c
עוברים על כל האברים ברשימת הפנויים
אם מצאנו בלוק שגודלו שווה לגודל הבלוק הנדרש
לא ממשיכים לסרוק עד סוף הרשימה ועוברים
להקצאה מיד
אם מצאנו בלוק בגודל שמתאים טוב יותר לגודל
best fit-הבלוק הנדרש מעדכנים את נתוני ה
(best, best_size )עם נתוני הבלוק שמצאנו
Chapter 11 - Memory Management Shayke Bilu PhD
Best Fit – getmem.c
מבצעים הקצאה של בלוק חדש ועדכון של בלוק
פנוי
אין שינוי מהותי בחלק קוד זה
בודקים את הממימוש בעזרת תכנת בדיקה
memtest.c