זיכרון להקצאה דינמית
- בלוק הזיכרון הפנוי במערכת איננו
בהכרח רציף. אם הקצנו בלוקים, ולאחר מכן שחררנו חלק מהם, יתכנו "חורים" בזיכרון הפנוי.
- כדי להקצות שטח זיכרון חדש עלינו
לדעת היכן השטחים הפנויים.
לשם כך אנו
מחזירים רשימה מקושרת שלהם.
על ראש
הרשימה מצביעה הרשומה memlist.
נדגיש כי memlist הוא משתנה המצביע אל תחילת
הזיכרון הפנוי, ואיננו חלק מהזיכרון הפנוי.
- בכל שטח פנוי אנו מחזיקים את גודלו
ואת המצביע את השטח הפנוי הבא,
לפי המבנה mblock.
mblock הוא מבנה
המכיל שני שדות: next, mlen. גודלו של מבנה זה הוא ארבעה בתים. מכאן:
- נלקחים 4 בתים מכל שטח פנוי לניהול הרשימה.
- כל שטח פנוי צריך להיות בגודל של
לפחות 4 בתים.
- כל הקצאה צריכה להיות לפחות בגודל
4 בתים, וזאת על מנת שכשנפנה את הבלוק, יהיו לפחות 4 בתים בהם נשתמש לרשימה המקושרת.
המבנה:
typedef struct mblock
{
struct mblock *mnext;
word mlen;
} MBLOCK;
- משיקולי נוחות, נבחר ב-XINU שכל ההקצאות יהיו בכפולות של 4 בתים
שכתובתם היא כפולה של 4.
כאשר מבקשים
הקצאת שטח זיכרון שאינו כפולה של 4
בתים, יוקצה שטח זכרון בגודל של הכפולה
הבאה של 4 בתים.
- כל השטחים הפנויים מוצבעים על ידי
רשימת הפנויים, בסדר מונוטוני לפי מיקומם
בזיכרון. שטחים מוקצים לא יופיעו
ברשימה.
- לא יופיעו ברשימה שני שטחים פנויים
רצופים. במקרה כזה ניתן לאחד אותם
לשטח גדול יותר.
|
|
תודה
הסברתם את זה, כמו שאר הנושאים, באופן הכי ברור שיש.