עבור לתוכן

האלגוריתם של MALLOC

Featured Replies

פורסם

אממ חשבתי על איך MALLOC בC מקצה את הזיכרון בקריאה ואיך יודעים שקטע מסויים פנוי למשל במקרה כזה:

לX מקצים 64B

לYמקצים 256B

עושים FREE לX

ואז רוצים להקצות Z 64 איך MALLOC יודע למצא את ה64 בטים בהתחלה אם בכלל.

תודה..

פורסם

אני לא בטוח, אבל נדמה לי שהקצאות זיכרון ב- heap נעשות ע"י מערכת ההפעלה, ולא ע"י התוכנית (לפחות ב- protected mode).

פורסם
  • מחבר

אני לא בטוח, אבל נדמה לי שהקצאות זיכרון ב- heap נעשות ע"י מערכת ההפעלה, ולא ע"י התוכנית (לפחות ב- protected mode).

אמממ זה לא מה ששאלתי שאלתי , על איך פועל האלגוריתם של ההקצאה בקווים כליים אפילו , לא מי עושה אותו .

ז"א איך מתבצע החיפוש וההקצאה עצמה.

פורסם

יש מספר שיטות.

אחת מהן היא שיטת ה"חברים":

מחלקים את הסגמנט שלך לחלקים, כל פעם ל- 2. אם אתה צריך, למשל 60B ויש לך גודל סגמנט של 256B, זה יראה ככה:

| 128 | 64 | 64 |

ותתן את ה64 הימיניים. ה64 נקראים "חברים" ורק אותם אתה יכול לאחד כדי לקבל שטח גדול יותר.

לא ניתן לחבר 2 חלקים שהם לא חברים.

אם למשל יש את המצב הבא, כאשר כל אחד מה- 64 מוקצים(יתכן שיש פחות במציאות כמו ה- 60 מקודם).

| 64 | 64 | 64 | 64 |

ועושים FREE ל2 האמצעים, הם לא יתחברו מכיוון שהם לא חברים.

שים לב שיש המון חסרונות לשיטה הזו.

תאר לך שאתה צריך 129B - יוקצו כל ה256. מצב כזה נקרא INTERNAL FRAGMENTATION.

פורסם
  • מחבר

יש מספר שיטות.

אחת מהן היא שיטת ה"חברים":

מחלקים את הסגמנט שלך לחלקים, כל פעם ל- 2. אם אתה צריך, למשל 60B ויש לך גודל סגמנט של 256B, זה יראה ככה:

| 128 | 64 | 64 |

ותתן את ה64 הימיניים. ה64 נקראים "חברים" ורק אותם אתה יכול לאחד כדי לקבל שטח גדול יותר.

לא ניתן לחבר 2 חלקים שהם לא חברים.

אם למשל יש את המצב הבא, כאשר כל אחד מה- 64 מוקצים(יתכן שיש פחות במציאות כמו ה- 60 מקודם).

| 64 | 64 | 64 | 64 |

ועושים FREE ל2 האמצעים, הם לא יתחברו מכיוון שהם לא חברים.

שים לב שיש המון חסרונות לשיטה הזו.

תאר לך שאתה צריך 129B - יוקצו כל ה256. מצב כזה נקרא INTERNAL FRAGMENTATION.

איך נקבעים החברים מלחתחילה ניסיתי לקרא קצת בWIKI אבל לא הבנתי עד הסוף אתה יכול להסביר בצורה פשוטה?

פורסם

כאלה שמשלימים אחד את השני לחזקה של 2. חברים זה יחס בינארי(רק בין 2 איברים כאלה).

פורסם
  • מחבר

כאלה שמשלימים אחד את השני לחזקה של 2. חברים זה יחס בינארי(רק בין 2 איברים כאלה).

אבל בדוגמא שהבאת אמרת שאם נעשה FREE ל2 האמצעים הם לא יתחברו אבל ביחד הם 128 והוא חזקה של 2 איך זה ?

פורסם

כי הם צריכים גם להיות במקומות מסויימים(תנאי ששכחתי להגדיר אותו בהודעה הקודמת).

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים