שברור - Fragmentation
שברור הוא מצב בו
יש זיכרון פנוי במערכת, אך לא ניתן להשתמש בו מסיבות
שונות - לרוב מפני שהוא נמצא בזיכרון
בצורה שאינה רציפה - כחתיכות קטנות ורבות של זיכרון.
נחלק את השברורים
לשני סוגים: שברור פנימי ושברור חיצוני.
שברור חיצוני: מצב בו ישנם שטחי זיכרון פנוי, אולם הם קטנים מדי להקצאה.
התוכנית הבאה
תדגים שברור חיצוני. נניח שהזיכרון הפנוי הוא בגודל 4000 בתים.
for (i = 0; i < 1000; ++i) arr[i] = getmem(4);
for (i = 0; i < 500; ++i) freemem(arr[i*2], 4);
p = getmem(12);
ההקצאה getmem(12) תיכשל. למרות
שבשלב זה ישנם 2000 בתים פנויים, ההקצאה בגודל 12 לא יכולה להצליח עקב שברור חיצוני.
שברור פנימי: מצב בו ישנם שטחי זיכרון שהוצאו מרשימת
הפנויים כתוצאה מהקצאה, אך בהכרח לא נמצאים בשימוש. נשים לב שב-XINU כל הקצאה היא בכפולות של 4,
לכן תהליך המבקש, למשל, הקצאה
של 9 בתים, יקבל מצביע אל הזיכרון המוקצה, ויוכל להשתמש ב-9 בתים מהמקום שהוחזר לו. למעשה, ההקצאה
הייתה בגודל 12, ושלושת הבתים שהוקצו מעבר
לדרישה אינם פנויים לשימוש אף אחד מהתהליכים.
התוכנית הבאה
תדגים שברור פנימי. נניח כי הזיכרון הפנוי הוא
בגודל 4000 בתים.
for (i = 0; i < 400; ++i)
{
arr[i] = getmem(10);
if (arr[i] == NULL) break;
}
printf("Only %d bytes out of 4000 allocated\n",
10 * i);
לאחר 333 הקצאות הלולאה תיפסק, וזאת כי בפעול ההקצאות היו בגודל של 12 בתים, ולכן
רק 333 הקצאות יכולות להצליח בפועל.
עבור המבקש הוקצו
רק 3330 מתוך 4000 בתים שביקש (שהיו פנויים).
תודה
הסברתם את זה, כמו שאר הנושאים, באופן הכי ברור שיש.