שאלה קשה מאוד...

yair24

Member
שאלה קשה מאוד...

זאת שאלה שנגזרת משאלה שחבר שלי עשה בראיון עבודה בחברת JUNGO לפני שנה ולא עבר את הראיון בגלל שהשאלה כל כך קשה...
int *p; p=(int *)malloc(sizeof(40)); BLA BLA BLA . . . free(p)​
איך יודע המחשב שעליו לשחרר מערך של 40 בתים? איפה זה רשום לו?
 

yair24

Member
סליחה טעות

הנה התיקון...
p=(int*)malloc(40*sizeof(int));​
טעות שלי...
 

TZURYOAV

New member
ב........P! התא הראשון בזכרון

המוקצה שומר את גודל הזכרון המוקצה,כמובן ש MALLOC 40 בעצם עושה MALLOC 41 במקרה הזה.על מנת לשמור עוד תא שגודלו 4 בתים ששם יאוחסן הגודל
 

חובבן

New member
זה מימוש אפשרי אך לא יחיד

ובל מקרה תלוי בקוצפיילר וב OS
 

אלדד26

New member
שתי הערות

קודם כל, זה תלוי במימוש של הקומפיילר. יש קומפיילרים שמחזיקים טבלאות דינמיות של מצביעים עם הגודל שלהם, ויש קומפיילרים שמקצים שטח מיוחד בזיכרון, לפני הבלוק עצמו. דבר שני, זה לא 40 בתים. ב - INTEL PC לפחות, זה 160 בתים.
 

yair24

Member
למה? בגלל שאתה בWINDOWS?

בדוס אינטג´ר שווה ל2 בתים וLONG שווה ל4 בתים גם בINTEL PC.
 

אלדד26

New member
סליחה, טעות - אתה צודק

נכון, מילה ב - INTEL PC היא 2 מילים, וב - WIN32, משתנה int מוגדר כ-4 בתים. צודק
 

voguemaster

New member
הלו, קומפיילרים ???????????

ממתי הקומפיילר אחראי על שמירת גודל דף (או יותר) שמוקצה דינמית בזמן ריצת התוכנית ?? אלי
 

אלדד26

New member
אין קשר לגודל הדף.

ה - PAGES מתוחזקים על ידי ה - OS, אבל הקומפיילר מממש את malloc. קוד האסמבלי שיושב מאחור צריך לדאוג לאפשר גם את ה - free שיבוא בסוף.
 

voguemaster

New member
לא על זה אני מדבר

אני מדבר על "דפים" מוקצים. לא על הדפים האמיתיים שמערכת ההפעלה מנהלת. אולי דפים זה לא המונח הנכון אבל עד כמה שידוע לי אין מונח טוב יותר כדי לתאר את ה"בלוקים" המוקצים ע"י malloc בכל קריאה. וד"א הקומפיילר לא מממש את ה-malloc ולא נעליים ידידי, על מה אתה מדבר ?? כן, פעם קימפלו את ספריית ה-malloc בעזרת קומפיילר, אבל לא הקומפיילר הוא זה שמתחזק את הקצאות הזיכרון. הקוד של הספריה אחראי לשמור טבלאות שמכילות נתונים מדויקים על כל הקצאת זיכרון ע"י הספריה, פשוטו כמשמעו. כשאתה בא לשחרר זיכרון, הקוד של הספריה הוא זה שבודק את הטבלאות ומבצע את השחרור כנגד ה-OS. איך הקומפיילר משתלב פה בדיוק ??? זה כמו שתגיד שאם יש לי קוד שגורם ל-REBOOT של המערכת אז הקומפיילר הוא זה שאחראי לאתחל את המערכת. מאיפה הבאתם את זה ??? להגיד שהקומפיילר הוא זה שאחראי ?? בחייכם. הכל תלוי באיך כתבו את הספריה של ה-malloc שאתה משתמש בה. כל ספריה והצורה שלה לשמור את המידע הנ"ל עבור כל הקצאת זיכרון. שוב, אין קשר לקומפיילר. אלי
 

אלדד26

New member
הלו, הלו, אלי

לא להתרגש. אני חושב שכל מי שדיבר פה על קומפיילר - וזה כולל אותי - התכוון לסביבה כולה, כולל ה - lib - ים של ה - RTL של C. אז נכון שהם כבר מקומפלים, ושהלינקר פשוט לוקח אותם ומלנקג´ אותם עם האובג´קט הבסיסי של הקוד, אבל זה ה "קומפיילר", או יותר מדויק - סביבת העבודה שכוללת בין השאר את ה - RTL של C.
 

voguemaster

New member
מי מתרגש ../images/Emo13.gif

אני פשוט חושב שצריך להפריד בין הקומפיילר לספריות. לדוגמא בחלונות יש פונקציות API להקצאת זיכרון. אלו מבקשות מה-KERNEL הקצאה של דפים ומחזירות מצביע (או ID, במקרה והוא לא קבוע). בכל מקרה, המודל שונה מב-UNIX, בגלל שאותן ספריות באות כבר עם מע´ ההפעלה, כלומר בעצם זה חלק משירותי ה-KERNEL עבור פרוססים שמבקשים זיכרון, ואין קשר לקומפיילר. בכל מקרה, הבנת את הכוונה שלי, וברור לי למה אתה התכוונת
אלי
 

אלדד26

New member
אתה צודק במאה אחוז,

פשוט לא חשבתי לעומק על מה שכתבתי כשכתבתי "קומפיילר"
 

אלדד26

New member
ועוד דבר -

יש הבדל גדול בין REBOOT (שזה בסה"כ הרצה של int אחד) לבין malloc, שבו הספרייה (RTL) צריכה לנהל את הקצאות הזיכרון.
 

voguemaster

New member
אתה יודע, תשובה יותר עניינית

תהיה: "קודם כל, זה תלוי במימוש של הקומפיילר..." לא קשור למציאות. המימוש הוא של ספריית ה-malloc, תודה רבה. "יש קומפיילרים שמחזיקים טבלאות דינמיות של מצביעים עם הגודל שלהם, ויש קומפיילרים שמקצים שטח מיוחד בזיכרון, לפני הבלוק עצמו.." הקומפיילר לא מחזיק כלום בזמן ריצה, ואת זה אתה יודע טוב מאוד אלדד! שוב, הספריה היא זו שמנהלת את מבני הזיכרון בצורה פנימית. אני מצפה ממך לקצת יותר בנאדם... אלי
 

yair24

Member
הטעות הזאת נפוצה...

מי שבאמת אחראי על ניהול הזיכרון זאת מערכת ההפעלה...
 

אלדד26

New member
לא נכון.

מערכת ההפעלה אחראית על ניהול הזיכרון ברמה של PAGES. מי שאחראי על הקצאת הבלוקים בתוך ה - PAGES זו התוכנית עצמה. ליתר דיוק, המימוש עצמו של malloc כמו שתיקן אותי אלי. כמו שכתבתי קודם, התייחסתי ל - "קומפיילר" בתור סביבת העבודה כולה, בין אם זה הקומפיילר, הלינקר והספריות שאיתן הוא מלנקג´ את ה-object.
 

yair24

Member
איך ממומש MALLOC?

ואיך הוא יכול לקבוע איפה בזיכרון ישבו המשתנים?
 

אלדד26

New member
אז ככה

קודם כל, אין תשובה חד משמעית לשאלה "איך ממומש malloc", כי זה תלוי מימוש, מן הסתם, וגם תלוי מחשב. אבל תחשוב ככה - מערכת ההפעלה, באמצעות interrupts, מספקת לך דפי זיכרון. נניח שאתה רוצה מערך של 100 בתים, ותקרא לו X. מערכת ההפעלה סיפקה לך דף בגודל 1024 בתים, ואתה מחזיר למשתמש מצביע לאיזור של 100 בתים. עכשיו הוא ביקש עוד 100 בתים, ויש לך מקום פנוי בדף, אז אתה מחזיר לו את המצביע החדש, וכן הלאה. עכשיו הוא מבקש למחוק את השטח הראשון - אז איך תדע מה הגודל שהוא פינה? אה? אה?
אז אפשר לממש את זה עם טבלאות דינמיות, ואפשר לממש את זה עם 4 בתים לפני הבלוק, שמכילים את גודל הבלוק. לא התעמקתי ביתרונות ובחסרונות...
 

ihovav

New member
יש לכם בעיה בהבנת המערכת

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