ABA


"שאלה שפעם ידעתי את התשובה לה ועכשיו אנלא זוכר.."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15712 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15712
פאביו ג'וניור

   17:25   08.02.10   
אל הפורום  
  שאלה שפעם ידעתי את התשובה לה ועכשיו אנלא זוכר..  
 
   למה free (ב C..) לא צריכה לדעת כמה זכרון לשחרר..
הכי שאתה מקצה (גם מערך) אתה שולח גודל של זיכרון בשביל שmalloc ידע כמה להקצות מהheap.. למה free לא צריך לקבל גודל? איך free יודע כמה לשחרר?

בעע שאלו אותי לפני שנה אנלא זוכר כבר איפה.. וידעתי את התשובה.. ועכשיו לא :\


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  כי הפונקציה FREE לא יכולה לנחש כמה להקצות לך ronen333  08.02.10 18:27 1
     _malloca מקצה על הSTACK... פאביו ג'וניור 08.02.10 19:26 2
         אממ שמשון פישטונה 08.02.10 19:39 3
             אתה מעביר לה מצביע... פאביו ג'וניור 08.02.10 19:43 4
             אתה טועה יוחאי ronen333  08.02.10 20:38 9
                 char * זה 4 בתים, כמו כל מצביע ב32 ביט DLN 12.02.10 12:54 42
                     דיברתי על תו לא על מצביע לתו. ronen333  12.02.10 23:32 59
     sizeof מחושב בזמן קומפילציה DLN 12.02.10 12:53 40
  כי מערכת ההפעלה מטפלת בזה כבר. יש לכל דף ldan192  08.02.10 20:08 5
     כן זה מה שהפריע לי במה שהם אמרו עם הsizeof.. פאביו ג'וניור 08.02.10 20:13 6
         התשובה נכונה לגבי לינוקס. אני מאמין שבווינדוז התשובה ldan192  08.02.10 20:23 7
             אממ פאביו ג'וניור 08.02.10 20:37 8
                 בגדול, לכל תהליך, אבל יש כל מיני אופטימיזציות (תלוי ldan192  08.02.10 20:41 10
                     המטרה לא לשנן :P פאביו ג'וניור 08.02.10 20:52 12
                         בהחלט. אלה דברים שחובה לדעת. אתה מודע לזה ldan192  08.02.10 20:58 13
                             מסכים איתך ב100% :) ד''א לשם אני מכוון כרגע :P פאביו ג'וניור 08.02.10 21:05 14
     מכתב ronen333  08.02.10 20:46 11
     זה לא קשור לדפים DLN 08.02.10 22:26 15
         אני לא רואה איך התשובה שלך שונה משלי. ldan192  08.02.10 22:39 16
             שונה בהמון DLN 08.02.10 22:44 17
                 הם לא מאלקצים שום דבר, אם המסגרת לא קיימת ldan192  08.02.10 22:47 18
                     מחכה לזה :) ותודה לשניכם! ד''א אם תוכלו לתת הסבר פאביו ג'וניור 08.02.10 22:56 19
                         זה מנגנון מסובך בטירוף ואני לא מוצא עליו כלום כרגע DLN 08.02.10 23:07 21
                     מה? מה הקשר? DLN 08.02.10 22:58 20
                         אני מבין עכשיו למה אתה מתכוון, אתה מדבר על ldan192  08.02.10 23:09 22
                             למדתי הרבה מהדיון הזה :) תודה לשניכם.. פאביו ג'וניור 08.02.10 23:15 23
                             שמע עידן אתה אומר פה דברים לא נכונים בעליל DLN 09.02.10 00:03 24
                                 אני מסכים עם אלון ... Deuce  09.02.10 00:40 25
                                     מסכים עם אהובי שמשון פישטונה 09.02.10 00:41 26
                                     שוב, כי אתם מדברים על רמת מנגנון השפה ולא על רמת ldan192  09.02.10 09:07 27
                                         מה? Deuce  09.02.10 14:58 28
                                             וואו, סטית מהנושא בטירוף. השאלה הייתה איך free ldan192  09.02.10 15:07 29
                                                 אנחנו עשינו פה סלט? DLN 09.02.10 23:08 30
                                                     עכשיו אני מבין מאיפה הערבוביה, כי אני מדבר על ldan192  10.02.10 10:08 32
                                                         חח תהיה בריא :\ Deuce  10.02.10 15:25 33
                                                         kfree וkmalloc זה די טריוויאלי שמשון פישטונה 11.02.10 17:23 34
                                                             זה ממש לא טרוויאלי, ולא, לא טעיתי כי התשובה שלי עדיין ldan192  11.02.10 18:46 35
                                                                 עידןןןןןןןן חח זה לגמרי טריוויאלי שמשון פישטונה 11.02.10 19:32 36
                                                                 מבזבז ת'זמן שלך בלהגיד שטויות אולי DLN 12.02.10 12:13 37
                                                                     אה, כן, אז המאלוק שלי מקולקל ldan192  12.02.10 12:42 38
                                                                         טוב חלאס עידן אין לי כוח DLN 12.02.10 12:51 39
                                                                             כי מה נראה לך אמין בדיוק במקורות שנתת? ldan192  12.02.10 12:53 41
                                                                                 חחח אתה מוזר עידן:) שמשון פישטונה 12.02.10 13:08 43
                                                                                 לפחות אני מביא מקורות DLN 12.02.10 13:14 44
                                                                                     אוקיי. ממש סיכמת את האשכול אלון. ldan192  12.02.10 13:32 45
                                                                                         ורק כדי לסגור את הויכוח הזה עם קצת הגיון DLN 12.02.10 17:45 46
                                                                                             חחח אתה רואה? אבל אתה בדיוק לא סותר את מה שאני ldan192  12.02.10 18:03 47
                                                                                                 חח עיגלת פינות? רשמת דברים סותרים לגמרי DLN 12.02.10 18:37 48
                                                                                                     ולמה לא נראה לך שה-heap יגמר? ה-heap סופי ldan192  12.02.10 18:48 49
                                                                                                         אז בוא ותרשום איפה סתרתי את עצמי DLN 12.02.10 18:52 50
                                                                                                             תקרא את תגובה 22 (חוץ מהקטע של free שרלוונטי ldan192  12.02.10 19:00 51
                                                                                                                 חחח DLN 12.02.10 19:14 52
                                                                                                                     קרא על kfree ו-kmalloc ותחזור לפה אז :) ldan192  12.02.10 19:18 53
                                                                                                                         חחחח אז מה אם דיברת על kfree?! DLN 12.02.10 19:32 54
                                                                                                                             בסדר אלון, זזתי לקרוא על write. סיימנו אז את הדיון. ldan192  12.02.10 19:33 55
                                                                                                                                 אני חייב להגיד שהמשך הויכוח שלכם סידר לי הכל :) פאביו ג'וניור 12.02.10 20:49 56
                                                                                                                                     מכתב DLN 12.02.10 21:46 57
                                                                                                                                         זה כבר הרבה יותר נכון. רק תיקון קטן - מסגרות, לא דפים. ldan192  12.02.10 22:18 58
                                                                                                                                         לא, ברור שיש הפרדה.. פאביו ג'וניור 13.02.10 01:25 60
  באמת הרבה סלט באשכול אחד Net_Boy  09.02.10 23:40 31

       
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   18:27   08.02.10   
אל הפורום  
  1. כי הפונקציה FREE לא יכולה לנחש כמה להקצות לך  
בתגובה להודעה מספר 0
 
   לעומת זאת לדעת כמה לשחרר זה לא בעיה...
sizeof(arr)

ד"א MALLOC מקצה בSTACK אם אינני טועה (בC)
:|


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   19:26   08.02.10   
אל הפורום  
  2. _malloca מקצה על הSTACK...  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 08.02.10 בשעה 19:40 בברכה, פאביו ג'וניור
 
לגביי malloc כתוב בmsdn ככה:
"malloc allocates a zero-length item in the heap and returns a valid pointer to that item."
ככה שזה על הHEAP..

ובקשר לsizeof.. שמע sizeof מחזיר את הגודל של הסוג.. לדוגמא:


WCHAR* _FolderPath = (WCHAR*)calloc(MaxPathSize, sizeof(WCHAR));
if (_FolderPath == NULL)
throw "Allocation faild";
_tprintf(TEXT("allocated: %d\n"), sizeof(_FolderPath));

מחזיר לי 4 (גודל של פויינטר) מוזר כי לפי הmsdn אתה צודק..

עריכה: ברגע שאתה מגדיר את המערך סטטי (ככה):


char arr(1024)

(לא עובד לכתוב פה בתוך סוגריים מרובעים... מעריך של char בגודל 1024)
אם תעשה לזה sizeof אתה מקבל 1024...

בכל מקרה sizeof מחושב בזמן קומפילציה עד כמה שאני זוכר, ככה שזה הגיוני שהוא מתנהג ככה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שמשון פישטונה

   19:39   08.02.10   
אל הפורום  
  3. אממ  
בתגובה להודעה מספר 2
 
   sizeof על מערך יחזיר לך את מספר האיברים בו, כדי למצוא את הגודל שהוא תופס בזיכרון תצטרך לעשות משהו בסגנון של


sizeof(arr) * sizeof(char)

חוץ מזה שלא ממש הבנתי את השאלה שלך, מה הבעיה של free לדעת כמה לשחרר, אתה הרי מעביר לה ארגומנט לא?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   19:43   08.02.10   
אל הפורום  
  4. אתה מעביר לה מצביע...  
בתגובה להודעה מספר 3
 
   המצביע הזה מצביע למערך באורך נניח 1024... איך היא תידע מה האורך?
בקשר לsizeof שים לב שאם אתה שולח לה פויינטר היא מחזירה גודל של פויינטר..
אם אני שולח לה משתנה שמוגדר כמערך (סטטי) היא תחזיר לי את הגודל שלו..
אפילו אם אני מגדיר מערך סטטי ואז נותן לפויינטר להצביע אליו ועושה לפויינטר sizeof זה יחזיר לי 4 (הגודל של הפויינטר..)

אם אני עושה ככה:


char testingIt<1024>;
char* testst = testingIt;
_tprintf(TEXT("allocated: %d\n"), sizeof(testst));

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

אם אני עושה ככה:


char testingIt<1024>;
char* testst = testingIt;
_tprintf(TEXT("allocated: %d\n"), sizeof(testingIt));

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

(לשם הבהרה sizeof(char) זה 1 כמובן..)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:38   08.02.10   
אל הפורום  
  9. אתה טועה יוחאי  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 08.02.10 בשעה 20:42 בברכה, ronen333
 
SIZEOF מחזיר לך את מספר הבתים.
ככה שאם אתה רוצה את גודל המערך אתה צריך לחלק בגודל הטיפוס.

עזוב את זה שCHAR הוא בית אחד (תמיד) אז לעשות פעולת כפל/חילוק בדוגמה שהצגת חסרת משמעות חחח..

;)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   12:54   12.02.10   
אל הפורום  
  42. char * זה 4 בתים, כמו כל מצביע ב32 ביט  
בתגובה להודעה מספר 9
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   23:32   12.02.10   
אל הפורום  
  59. דיברתי על תו לא על מצביע לתו.  
בתגובה להודעה מספר 42
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   12:53   12.02.10   
אל הפורום  
  40. sizeof מחושב בזמן קומפילציה  
בתגובה להודעה מספר 1
 
   זה אופרטור, לא פונקציה
הוא מחזיר גודל של אלמנט אחד, לא של המערך


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:08   08.02.10   
אל הפורום  
  5. כי מערכת ההפעלה מטפלת בזה כבר. יש לכל דף  
בתגובה להודעה מספר 0
 
הפניה בטבלת האש שמחזיקה גם אצבעה כרשימה המקושרת לשאר הזכרון "הרציף" שהוקצה (שאר הדפים, בהנחה שדף במערכת הפעלה ממוצעת הוא בגודל 4k).
ברגע שאתה מבצע free הוא משחרר את כל הדפים במבנה הנתונים שקשורים בו.

שים לב ש-free בכלל מקבלת void*.
אין לו אפשרות לדעת מה ה-sizeof של מבנה הנתונים כי אין לך שום מידע דינמי לאובייקט ב-C.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   20:13   08.02.10   
אל הפורום  
  6. כן זה מה שהפריע לי במה שהם אמרו עם הsizeof..  
בתגובה להודעה מספר 5
 
   זה וזה שהוא מחושב בזמן קומפילציה ככה שהוא לא יעבוד לערכים דינמים בכל מקרה..

סבבה זכרתי איזה משהו עם זה
ד"א זה עובד אותו הדבר בווינדוס ובלינוקס? או שאחרת? סה"כ זה כבר תלוי מערכת הפעלה...

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

בעע אני כבר לא זוכר את כל הקורס הזה טרי כמו פעם :\


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:23   08.02.10   
אל הפורום  
  7. התשובה נכונה לגבי לינוקס. אני מאמין שבווינדוז התשובה  
בתגובה להודעה מספר 6
 
לא שונה בהרבה (אבל זה לא קוד פתוח - אז אני לא יכול להתחייב על כלום) וב-MAC בוודאות התשובה זהה.

זה לא מדוייק מה שרשמת.
במערכת 32 ביט כל תהליך מקבל 4GB זכרון.
כמובן שבמחשב אין לך כל-כך הרבה זכרון RAM, ולכן מערכת ההפעלה מדפדפת קטעי זכרון שפחות משתמשים בהם לדיסק הקשיח.
בדר"כ הוא מקצה אחוז מסויים של זכרון לתהליך ובמידת הצורת שואב עוד או מקצץ כשהשימוש יורד.
הטבלה הזו שקופה למשתמש (כלומר, לתהליך) והיא נמצאת בגרעין מערכת ההפעלה (ה-1GB התחתון שלא מדופדף לדיסק).
מה שקורה זה שהתוכנית שלך שולחת system call ל-free (או ליתר דיוק, ל-sys_free) על כתובת הזכרון שבקישת, היא ניגשת דרך הה-hash_table לטבלה שנראת ככה:


וככה היא יודעת לאילו דפים לפנות ואילו לפנות (בדר"כ, היא פשוט מסמנת אותו בביט מסויים שאומר שאפשר לכתוב עליהם מחדש במקום לפנות אותם פיזית).


האמת היא שגם דיי רימיתי בהסבר שלי, אבל זה נובע בגלל שהפתרון האמיתי מאחורי הקלעים יותר מסובך מאשר לכתוב בכמה שורות על גבי הפורום, והוא גם קשור במסגרות ואלגוריתמים חולניים בשביל לחשב לאיזה תא ב-hash table לגשת (זה לא ממש hash table פשוט של מודולו )


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   20:37   08.02.10   
אל הפורום  
  8. אממ  
בתגובה להודעה מספר 7
 
   כן רוב מוקצה על ההארדיסק ובכל פעם שהוא לא מוצא את הדף בCACHE נזרק PAGE FAULT למערכת הפעלה שתחפש בזיכרון.. ואם גם שם לא נמצא נזרקת שוב הודעה שתחפש בהארדיסק ותטען את זה לזכרון ואם היא חייבת לעלות על זכרון קיים אז היא צריכה לשמור את זה על ההארדיסק וכו' וכו'..
וגם יש את הALU (או משהו עם שם דומה..) ששומר ערכים שחיפשת בזמן האחרון...
כן אני זוכר את כל זה..
הטבלה הזאת נוצרת לכל PROCCESS? או שיש טבלה אחת כזאת גדולה לכל מערכת ההפעלה? אם זה לפי תהליך אז סבבה אבל אם זה אחת לכל המערכת הפעלה אז הטבלה צריכה לקודד איכשהו גם לפי הPID וגם לפי הPAGE NUMBER..

טוב מחר נעשה חזרה על מערכות הפעלה... הייתי ספצ בזה וזה אחד הדברים השימושיים לדעת דווקא

אם יש לך עוד מידע להוסיף או לתקן את מה שאמרתי (אני קצת חלוד..) אני ישמח

ד"א אם תוכל להעלות את המצגת / המצגות של השקופית שהבאת אני ישמח :P

עכשיו עוד שאלה לא קשורה שאף פעם לא התעמקתי בה..
מה היתרונות או החסרונות של להקצות על הHEAP? או במילים אחרות: למה קיימת פונקציה להקצות דינמית על הSTACK?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:41   08.02.10   
אל הפורום  
  10. בגדול, לכל תהליך, אבל יש כל מיני אופטימיזציות (תלוי  
בתגובה להודעה מספר 8
 
בגירסאת הגרעין) ככה שזה קצת גמיש.
אלו 4 השקפים על זכרון וירטואלי:
http://webcourse.cs.technion.ac.il/234123/Spring2009/ho/WCFiles/r12_virtmem.pdf
http://webcourse.cs.technion.ac.il/234123/Spring2009/ho/WCFiles/r13_virtmem1.pdf
http://webcourse.cs.technion.ac.il/234123/Spring2009/ho/WCFiles/r14_virtmem2.pdf
http://webcourse.cs.technion.ac.il/234123/Spring2009/ho/WCFiles/r14_filesystem.pdf

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

בהצלחה, בכל מקרה


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   20:52   08.02.10   
אל הפורום  
  12. המטרה לא לשנן :P  
בתגובה להודעה מספר 10
 
   אני פשוט אוהב את כל הדברים האלה... אני אוהב לדעת איך הדברים עובדים בLOW LEVEL..
ברגע שאתה יודע איך דברים עובדים מלמטה אתה מתכנת מלמעלה הרבה יותר טוב כי אתה מבין מה עומד מאחורי כל דבר..
בגלל זה אני גם אוהב לתכנת בC/C++ יותר מאשר בJAVA/C#.. כי אני מרגיש יותר בשליטה שם על מה שקורה ^^

תודה רבה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:58   08.02.10   
אל הפורום  
  13. בהחלט. אלה דברים שחובה לדעת. אתה מודע לזה  
בתגובה להודעה מספר 12
 
שיש מתכנתים שלא יודעים בכלל שבין תהליכים אין שום קשר בין כתובות הזכרון.
כלומר, אתה אתה מוצא מתהליך 1 כתובת א' (נגיד מדפיס על המסך)
ואז אומר לתהליך ב' לכתוב על הכתובת הנ"ל
מן הסתם שלא יקרה כלום כי כל אחד מקבל מרחב זכרון משל עצמו.

ועוד המון דברים פיקנטיים ומעניינים שחשוב שכל מתכנת ידע (בעיקר דברים שקשורים ביעילות)


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   21:05   08.02.10   
אל הפורום  
  14. מסכים איתך ב100% :) ד''א לשם אני מכוון כרגע :P  
בתגובה להודעה מספר 13
 
   לCODE INJECTION ולMEMORY INJECTION
זה בדיוק עכשיו התחום שאני רוצה להתקרב אליו :P לפי דעתי זה אחד הדברים היותר מעניינים שיש

אז אני לומד קצת WINAPI ככה בשביל להשתפשף עם ווינדוס (סה"כ עד עכשיו כל התיכנותים ש"קשורים למערכת הפעלה" שעשיתי היו בלינוקס.. הרבה יותר נוח שם ת'אמת :P )
אחרי שקצת השתפשפתי עם OLLYDBG ככה בקטנה..

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:46   08.02.10   
אל הפורום  
  11. מכתב  
בתגובה להודעה מספר 5
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   22:26   08.02.10   
אל הפורום  
  15. זה לא קשור לדפים  
בתגובה להודעה מספר 5
 
   מן הסתם שמערכת ההפעלה לא מאלקצת לך דפים שלמים רק בשביל מבנה נתונים אחד בגודל שרירותי שיכול להיות גם 10 בתים...
שאתה מאלקץ עם VirtualAlloc (לא מכיר איך זה בלינוקס, אני מניח שיש משהו מקביל) אז אתה מאלקץ דפים שלמים, אבל זה לא המקרה בכל מה שנוגע לmalloc וfree בC. זה כבר הRuntime מנהל.
לכל צ'אנק שאלקצת בזכרון יש מבנה נתונים (זה לא רציף, משמע שכל אחד כזה נמצא ליד הHeap Chunk הספציפי שאולקץ) שמתאר בין היתר גם את הגודל שלו,
ואז שאתה עושה Free אין צורך לדעת את הגודל.
ברוב המקרים זה גם רק משנה את הFlagים ומסמן שהChunk הזה פנוי, למקרה שמישהו יצטרך צ'אנק בגודל כזה בהמשך.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:39   08.02.10   
אל הפורום  
  16. אני לא רואה איך התשובה שלך שונה משלי.  
בתגובה להודעה מספר 15
 
וכן, דפים זו תופעת לוואי. מסגרות זו התשובה המדוייקת (וציינתי את זה גם כהערת אגב אם פספסת).
אבל לא רציתי לסבך אותו ביותר מדיי מושגים במכה.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   22:44   08.02.10   
אל הפורום  
  17. שונה בהמון  
בתגובה להודעה מספר 16
 
   אפשר להכניס HEAP שלם של תוכנה ממוצעת בדף אחד.

free וmalloc לא משחררים או מאלקצים דפים... אין להם את היכולת או הסיבה לעשות את זה.
זה גם לא נכון כלפי המנגנון. מערכת ניהול הHeap של הC Runtime ומערכת ניהול הזכרון הוירטואלי של וינדוס זה עולמות אחרים לחלוטין


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:47   08.02.10   
אל הפורום  
  18. הם לא מאלקצים שום דבר, אם המסגרת לא קיימת  
בתגובה להודעה מספר 17
 
ערכתי לאחרונה בתאריך 08.02.10 בשעה 22:59 בברכה, ldan192
 
הם מעלים page fault שגורם למערכת לדפדפף דף למסגרת כשצריך.

ושוב, זה בדיוק מה שאני רשמתי.
מערכת ההפעלה היא זו שאחראית להקצת זכרון ולשחרורו "בזמנה החופשי" (תהליך ה-idle בעיקר אחראי על זה).
אתה יכול לקרוא לקריאת מערכת והיא תכניס את זה לתור בקשות.
אני עדיין לא רואה איך התשובה שלך שונה משלי.
או שאתה לא הבנת אותי, או שאתה לא הבנת את החומר נכון


בהזדמנות, כשיהיה לי זמן לנשום, אני אעלה את קטעי הקוד מגרעין מ-red hat 8 שאחראים על האלוקציה והשחרור של זכרון.
אני מאמין שיהיה לי הרבה יותר קל להסביר כשיש לי קוד להציג.


בכל מקרה, אני כבר עף למיטה.
אז לילה טוב.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   22:56   08.02.10   
אל הפורום  
  19. מחכה לזה :) ותודה לשניכם! ד''א אם תוכלו לתת הסבר  
בתגובה להודעה מספר 18
 
   או רפרנס איפה לקרוא על מנגנון ניהול הHEAP של C אני ישמח


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   23:07   08.02.10   
אל הפורום  
  21. זה מנגנון מסובך בטירוף ואני לא מוצא עליו כלום כרגע  
בתגובה להודעה מספר 19
 
   גוגל מאכזב, אבל אני אכתוב על זה מתישהו שיהיה לי כוח


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   22:58   08.02.10   
אל הפורום  
  20. מה? מה הקשר?  
בתגובה להודעה מספר 18
 
   לC Runtime יש כמות כלשהי של דפים שבהם הוא מאחסן ומנהל Heap משלו.
המשמעות של אלקוץ ושחרור במובן של malloc וfree זה אלקוץ ושחרור בלוקים בתוך מרחב הזכרון הקבוע הזה, לא במנגנון הVirtual Memory.
רק במידה והמקום בכמות הדפים הזאת נגמר, יש פניה למערכת ההפעלה בשביל להגדיל את הHeap.

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

המערכת הפעלה אכן אחראית לאלקוץ זכרון בשביל תהליכים, אבל זה נושא אחר לחלוטין שקשור לזכרון וירטואלי בכלל, לא לHeap של הC Runtime.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:09   08.02.10   
אל הפורום  
  22. אני מבין עכשיו למה אתה מתכוון, אתה מדבר על  
בתגובה להודעה מספר 20
 
מחסנית מתאר התהליך שבגרעין.
שוב, נהיה פה קצת סלט בגלל שאני דיי רשמתי הכל ב-2 מילים.
אז בשביל לסדר את האוזן נסדר את המושג מחדש:
יש דף (קטע זכרון שיושב על הדיסק הקשיח), יש מגירה (אחראי למסגרת הזכרון ה-RAM או לסקטור בדיסק בו נמצא הבלוק) ויש מסגרת שזה בעצם מקום הזכרון הפיזי ב-RAM.

ועדיין, זה לא קשור לענייננו.
נכון שכשעולה התוכנית, מוקצה בשבילה זכרון מסויים מעבר למה שדורש ה-STACK וה-HEAP,
ונכון שהדפים לא מדופדפים כל-כך מהר לדיסק,
ונכון, שמסגרות יש לך בהתחלה כמרחב זכרון בסיסי (כי COW זו פעולה יקרה),

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

אבל שום, את כל הדברים האלה רשמתי.
הבעיה היא שאתה מסתכל על זה מנקודת מבט יותר מדיי גבוהה, אני מסתכל על זה מנקודת מבט גרעין מערכת ההפעלה.

בסה"כ, כל תהליך, מקבל מרחב מסגרות שלא מיודע לשאר מערכת ההפעלה ובטוח שיש לו 4GB זכרון (במערך 32 ביט).

אני מקווה שעשיתי קצת סדר, ואם לא, תעברו על השקפים שצרפתי ואני אשמח לחזור על שאלות או להבהיר דברים שלא ברור.
(אגב, לינוקס, ווינדוז, בתחום הזה הנושאים כמעט חופפים 1:1,
אולי בווינדוז יש עוד כמה כלים המבטיחים יציבות בזמן נפילות, אבל הבסיס זהה בכולם).

לילה טוב שוב


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   23:15   08.02.10   
אל הפורום  
  23. למדתי הרבה מהדיון הזה :) תודה לשניכם..  
בתגובה להודעה מספר 22
 
   נעשה מחר גוגל ונקרא את המצגות שהבאת...
כנראה מה שחשבתי שהסיבה היא לא הסיבה כי אנלא זוכר שזה היה משהו כ"כ מסובך חח
כן צריך לחזור קצת על מערכות הפעלה להיזכר בדברים המעניינים :P משם נעבור למצגות ומשם לגוגל

לילט לשניכם ותודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   00:03   09.02.10   
אל הפורום  
  24. שמע עידן אתה אומר פה דברים לא נכונים בעליל  
בתגובה להודעה מספר 22
 
   הפונקציה free ב99 אחוז מהקריאות לא תגרום אפילו לשימוש בWinAPI. למעשה, זה אפילו לא יעבור לקוד קרנלי.
free לצ'אנק של 4 בתים מן הסתם לא יסמן פייג' שלם, שהוא 4096 בתים כ"משוחרר". המרכאות כי המונח "משוחרר" במובן של פייג'ים בכלל לא רלוונטי...
והDirty Flag בכלל מסמן האם שונה משהו בPage, כדי לדעת אם לכתוב אותו בחזרה לדיסק, לא קשור בעליל למנגנון Heap, לא של וינדוס ולא של הC Runtime.

אתה מערבב פה בין 2 נושאים לא רלוונטים וזה סתם מטעה...

המנגנון Heap שמוכר למתכנתים דרך ממשקי malloc וfree הוא מנגנון Heap פרטי, יוזר-מודי של הC Runtime.
הHeapים שאתה מדבר עליהם הם Heapים של מערכת ההפעלה, שבוינדוס נגישים דרך HeapAlloc וVirtualAlloc (ההבדל הוא בגרנולריות ובמאפיינים).
שאתה עושה malloc וfree, המבנים היחידים שמשונים הם המבנים הפרטיים של הC Runtime בפרוסס הזה. רק שנגמר המקום בHeap הפרטי הזה, הRuntime פונה לHeapAlloc כדי להגדיל את הHeap שלו.
malloc וfree *לא* מתייחסים לפייג'ים. זה לא פונקציות מערכת, גם אם הם היו רוצות, הן *לא* יכולות.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   00:40   09.02.10   
אל הפורום  
  25. אני מסכים עם אלון ...  
בתגובה להודעה מספר 24
 
אפשר לדבר לא מעט על המנגנון של page fault ועל MMU ועל virtual memory. אפשר גם לדבר בפרט לא מעט על ה-FS של לינוקס לרבות ext1,2,3,4 אבל באמת שאין ממש קשר.

ל-Process שמורץ יש זכרון שמוקצה משלו שמנוהל על ידי מנגנון פרטי של שפת C. במהלך הידור של תוכנית C לכל פקודה יש כתובת אבסולוטית. במהלך הרצה, בשילוב עם ה-MMU נקבעת לכל פקודה כתובת עם היסט כלשהו למקום המתאים בזכרון. בצורה הזאת C יכולה לנהל את הזכרון בעצמה, ולמעשה לא צריכה להתעסק יותר מידי עם ה-MMU, בטח שלא ב-WINDOWS.

עוד דברים -
קודם כל, malloc זאת הקצאה דינמית. אין שום ספק בכלל שהיא מוקצית על ה-heap. הקצאה דינמית אף פעם לא תוקצה על ה-STACK !
sizeof - זאת פונקציה עם חתימה פשוטה. היא מחזירה את מספר הבתים של הטיפוס/struct אותו היא מקבלת.
malloc/free עובדים יחדיו בעזרת מבנה נתונים פנימי שדואג לנהל את ההצבעות בעזרת העובדה שניתנות לכל הפקודות כתובות אבסולוטיות ובעת ההרצה, הם מקבלים כתובות אמיתיות (היסט של PC ושל ה-BS עבור ה-STACK למשל). בעת free כל מה שנעשה הוא חיפוש אחר המשתנה במבנה הנתונים ומחיקתו מהזכרון של ה-PROCESS.

זה באופן כללי.







                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שמשון פישטונה

   00:41   09.02.10   
אל הפורום  
  26. מסכים עם אהובי  
בתגובה להודעה מספר 25
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   09:07   09.02.10   
אל הפורום  
  27. שוב, כי אתם מדברים על רמת מנגנון השפה ולא על רמת  
בתגובה להודעה מספר 25
 
מנגנון מערכת ההפעלה.
אוקיי, ברור שיש מבנה נתונים פנימי שגם ה-C עצמו מנהל,
אבל באילו שירותים אתם חושבים בדיוק שהוא משתמש
נכון, של מערכת ההפעלה, ומבנה הנתונים בו הוא משתמש יחודיים לכל מערכת הפעלה.
ואני אומר את זה בוודאות ב-100%, הבעיה היא שאתם מסתכלים על זה מנקודת מבט לא נכונה (של איך תאורטית נקרא המנגנון ולא איך הוא פועל פרקטית).


כמו שאמרתי, כשיהיה לי זמן אני אציג בפניכם את קבצי ה-C בהם ה-gcc משתמש שקשורים ל-malloc ו-free.
תראו ש-90% מהעבודה שלו זו קריאה ל-sys_free ו-sys_alloc.
פשוט ממש אין לי זמן להתעסק עם זה עכשיו כי זה יותר מדיי חפירות.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   14:58   09.02.10   
אל הפורום  
  28. מה?  
בתגובה להודעה מספר 27
 
ערכתי לאחרונה בתאריך 09.02.10 בשעה 15:03 בברכה, Deuce
 
אני למדתי יחסית לעומק על ה-gcc ועל C בסביבת לינוקס. במהלך ההקצאה הוא משתמש ב-brk() ועושה מיפוי, אבל אין פה את כל הקטע של ניהול PAGE FAULT וכו'. זה בסה"כ פרוסס שתופס זכרון קטן.

במערכת לינוקס יש קריאות ל-MMAP, MPROTECT ול-brk(), אני לא אמשיך לרמת הקרנל שבסוף קוראת ל-FS; בכל מקרה זה לא קשור לשפת C. לכל PROCESS יש בלוק זכרון ו-C עושה עליו הקצאות בסיסיות, אם תעשה strace על תכנית קצרה של הקצאה לא תקבל קוד מפוצץ.

השאלה הייתה איך malloc עובד והתשובה היא שזה מנגנון של שפת C שקורא לפונקציות בסיסיות להקצאה על ה-HEAP ושומר הצבעות במבנה נתונים. להגיע עד ה-MMU זה מוגזם ולא קשור לנושא, בידיוק כמו שיכולנו לרדת עד האסמבלי ולדבר על פקודות store,lw,sw - בסופו של דבר זה מגיע לשם ול-ALU.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   15:07   09.02.10   
אל הפורום  
  29. וואו, סטית מהנושא בטירוף. השאלה הייתה איך free  
בתגובה להודעה מספר 28
 
עובד, זה קודם כל
והפונקציות לא כאלה בסיסיות, זה שנית כל,
הפונקציות כן קוראות לקריאות מערכת הפעלה בשביל להקצות מגירות כשצריך.
לא רשמתי בשום שלב שהוא עצמו מנהל את ה-PF. אני בעצמי רשמתי שזו קריאת מערכת הפעלה, אני בטוח שאתה יודע מה הפירוש של זה
והיא, לכן, כמובן תלויית קומפיילר ומערכת הפעלה.

האדם שאל איך free יודעת בדיוק איזה מרחב זכרון לנקות.
אז כן, התשובה עדיין רלוונטית, נכון ש-C עצמה משתמש במבני נתונים כאלו ואחרים השומרים מידע בסיסי על ההקצאה, אבל בשורה התחתונה היא קוראת לקריאות מערכת שמשחררות את הבלוקים האלה (בין אם הם על הדיסק או בזכרון באמצעות טבלת המסגרות, כמו שהזכרת, mmap, צרפתי באחת התגובות למעלה את המבנה ש-mmap מוסיף את עצמו אליו),

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   23:08   09.02.10   
אל הפורום  
  30. אנחנו עשינו פה סלט?  
בתגובה להודעה מספר 29
 
   עם כל הכבוד עידן, אתה רשמת פה דברים שהם חד וחלק לא נכונים או לא רלוונטיים.
בשורה התחתונה, הC RTL לא מתייחסת בכלל לPageים עד שהיא חייבת.
הבנאדם שאל שאלה פשוטה, למה שקוראים לmalloc צריך לציין גודל, ושקוראים לfree לא צריך.
אתה התחלת לדבר על נושא של Virtual Memory בכלל, שזה קשור באופן קלוש ביותר לשאלה. אין שום קשר לpage table, או לmmap או לpage file.
התשובה לשאלה שלו היא שמכיוון שהמידע הזה מאוחסן ע"י הC RTL ליד הצ'אנק שהיא הקצתה (בזכרון שכבר הוקצה לה ע"י המערכת).
ואם זה באמת מעניין אותך לדייק עוד יותר, הגודל (חלקי 8) מאוחסן ב2 בתים שנמצאים 6 בתים מאחורי תחילת הכתובת שאתה מקבל מmalloc.
אין *שום* קשר לPageים, ובטח שלא לdirty bit בpage table...
שעושים free הבאפר סה"כ מסומן כלא בשימוש והוא ינתן שוב פעם במידה ותרצה לאלקץ גודל זהה שוב.
מגיעים לנושא של syscallים (שאם כבר זה יהיה sbrk ולא sys_alloc) הרבה מאוד בהמשך, וזה ממש לא רלוונטי לשאלה שלו.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   10:08   10.02.10   
אל הפורום  
  32. עכשיו אני מבין מאיפה הערבוביה, כי אני מדבר על  
בתגובה להודעה מספר 30
 
kfree ו-kmalloc.

בכל מקרה, כמו שאמרתי, תשאירו את האשכול הזה פתוח.
אני הבטחתי שאביא קוד בעתיד הלא רחוק שיבהיר את הנושא יותר.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   15:25   10.02.10   
אל הפורום  
  33. חח תהיה בריא :\  
בתגובה להודעה מספר 32
 
בקושי אפשר בכלל לעשות אגב trace כמו שצריך ל-kfree ו-kmalloc (אני פעם ידעתי, אבל שכחתי - יש איזה דיבאגר לקרנל). בכל מקרה, אפשר לפתוח בשביל זה דיון חדש.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שמשון פישטונה

   17:23   11.02.10   
אל הפורום  
  34. kfree וkmalloc זה די טריוויאלי  
בתגובה להודעה מספר 32
 
   שהם עובדות מול הזיכרון של מערכת ההפעלה, ואני משער שהרמה של פותח האשכול(בלי להעליב) היא לא מספיק גבוהה כדי שהוא יידבר על kfree וkmalloc.

פשוט תגיד טעיתי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:46   11.02.10   
אל הפורום  
  35. זה ממש לא טרוויאלי, ולא, לא טעיתי כי התשובה שלי עדיין  
בתגובה להודעה מספר 34
 
נכונה. אוקיי, יש אופטימיזציות כאלה ואחרות שרשמתי כבר בהתחלה שלא ציינתי בשביל לא להלאות את פותח האשכול.

ואתה מוזמן לעיין בקוד הבא שממש את malloc ו-free במציאות:
https://rotter.name/User_files/nor/4b7433f6368c8bc7.txt


ופה לא מדובר ב-kmalloc ו-kfree (ששם הסיפור מסובך כפליים).
יש פה כן משחק עם mmap וקריאות מערכת כאלו ואחרות (בין היתר sys_alloc, כמו שציינתי) באופן שותף בשביל להבטיח שהתוכנית מנצלת כמות זכרון אופטימלית,
וחבל שאני בכלל מבזבז את הזמן שלי בשביל להתווכח אתכם כאשר אני יודע מה התשובה בוודאות ואתם רק מסתמכים על ידע בנקודת מבט כללית ולא המימוש הפרקטי בתאכלס.



בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שמשון פישטונה

   19:32   11.02.10   
אל הפורום  
  36. עידןןןןןןןן חח זה לגמרי טריוויאלי  
בתגובה להודעה מספר 35
 
   Name
kmalloc -- allocate memory
Description
kmalloc is the normal method of allocating memory in the kernel.

זה לגמרי טריוויאלי, הקצאת זיכרון בשביל הקרנל, אני לא יודע איך אתה אומר שזה לא טריוויאלי.

ד"א אין לי מושג בC אני מדי פעם מדבר עם אייל על זה והוא מסביר לי דברים שקשורים קצת לlow level.

אבל אתה כול שניה סותר את עצמך, מקודם אמרת שחשבת שהם התכוונו לkfree וkmalloc ועכשיו אתה שוב אומר שהתשובה שלך עדיין נכונה.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   12:13   12.02.10   
אל הפורום  
  37. מבזבז ת'זמן שלך בלהגיד שטויות אולי  
בתגובה להודעה מספר 35
 
   לא יודע מאיפה המימוש שאתה הבאת של malloc, אבל הנה להנאתך המימוש הסטנדרטי של GNU.
https://rotter.name/User_files/nor/4b75253d571c99e8.txt

ולא יודע אם בכלל הסתכלת על מה שהבאת, אבל הוא מממש שם את sys_alloc בעזרת קריאות מערכת, ואז קורא לו. זאת לא קריאת מערכת אפילו לפי המקורות שלך.
אני לא מבין הרבה בלינוקס ולכן לא התווכחתי איתך על זה קודם, אבל כל מי ששאלתי אותו על sys_alloc אמר שזה הנפצה, אין דבר כזה, ושmalloc משתמש בBRK בלבד כדי להגדיל את הHeap הפרטי, היוזר-מודי שלו.
והנה עוד כמה מקורות לעובדה שsys_alloc זה לא קריאת מערכת בכלל
http://bluemaster.iu.hio.no/edu/oca/lin-asm/syscalls.html
http://www.kernel.org/doc/man-pages/online/dir_section_2.html
http://www.digilife.be/quickreferences/QRC/LINUX%20System%20Call%20Quick%20Reference.pdf

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   12:42   12.02.10   
אל הפורום  
  38. אה, כן, אז המאלוק שלי מקולקל  
בתגובה להודעה מספר 37
 

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   12:51   12.02.10   
אל הפורום  
  39. טוב חלאס עידן אין לי כוח  
בתגובה להודעה מספר 38
 
   נתתי לך את המימוש של GNU,
נתתי לך הוכחה ניצחת מהמקורות הרשמיים שאין כזה דבר בכלל sys_alloc,
אתה בעצמך נתת הוכחה שsys_alloc זה בכלל מעטפת לmmap
Net_Boy נתן לך בלינק האחרון הסבר איך malloc ממומש בלינוקס,
אני נתתי הסבר איך הוא ממומש בוינדוס,
מה עוד אתה רוצה?
ת'סורסים של הCRT? מה?
פתח gdb ותעשה Trace לmalloc, תראה איך הוא עובד, מה אתה חופר לנו עם הבולשיט שלך?
מסכן הפותח של האשכול, שאל שאלה פשוטה והטעת לו ת'אמאמא, למה?
סיג לחוכמה שתיקה



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   12:53   12.02.10   
אל הפורום  
  41. כי מה נראה לך אמין בדיוק במקורות שנתת?  
בתגובה להודעה מספר 39
 
אני דיי בטוח שאני אמרתי את שלי.
אתם רוצים להתווכח ולומר שטויות ודברים לא נכונים במערכות התקפות להיום? תמשיכו לדבר.
חופשי, תשרשרו תגובות עד מחר
ואתה מוזמן להריץ את כל הבדיקות שצריך ולחזור עם התשובות (הנכונות, הפעם).


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שמשון פישטונה

   13:08   12.02.10   
אל הפורום  
  43. חחח אתה מוזר עידן:)  
בתגובה להודעה מספר 41
 
   היו פה בשיחה הזאת
1 תוכניתן בפרוייקט מאוד איכותי בצה"ל
1 אקדמאי שנה שלישית למדעי המחשב + מתמטיקה
1 בוגר ממרמ שהוא שפיץ על בכול מה שקשור לC וC++


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

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

אבל סתרת את עצמך 30000 פעם באשכול אחד.

קיצר עזוב שטויות, מי שייקרא את האשכול הזה כבר יבין איפה התשובה הנכונה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   13:14   12.02.10   
אל הפורום  
  44. לפחות אני מביא מקורות  
בתגובה להודעה מספר 41
 
   ואתה שואל מה אמין בkernel.org?
אתה פשוט בדיחה באמת...
אני ממש מקווה שאתה לא הפנים של הטכניון


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   13:32   12.02.10   
אל הפורום  
  45. אוקיי. ממש סיכמת את האשכול אלון.  
בתגובה להודעה מספר 44
 
כמו שהבטחתי, כשיהיה לי זמן אביא את הנתונים וההוכחות ואסביר בדיוק איפה טעיתם בתפיסה שלכם.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   17:45   12.02.10   
אל הפורום  
  46. ורק כדי לסגור את הויכוח הזה עם קצת הגיון  
בתגובה להודעה מספר 45
 
   נלך על השיטה של אייל
הנה קצת קוד שכתבתי וקימפלתי בGCC סטנדרטי על Ubuntu 8.04, קרנל 2.6.24-19-generic
לא גרסא מיושנת, לא איזה הפצה מונפצת, לא משהו מחורטט



#include <stdlib.h>
#include <stdio.h>

int main(void)
{
char * blah = 0;
char * blah2 = 0;
int i = 0;

blah = malloc(30);
printf("first malloc address %08x\n", blah);
free(blah);
blah = malloc(30);
printf("second malloc address %08x\n", blah);
free(blah);
blah2 = malloc(300);
printf("third malloc address %08x\n", blah2);
free(blah2);

for ( i = 0 ; i < 30 ; ++i ) {
blah2 = malloc(i);
printf("third malloc address %08x\n", blah2);
}

return 0;
}

והנה האאוטפוט של strace (כלי לtracing של קריאות מערכת).



execve("./malloc_test", , ) = 0
brk(0) = 0x804a000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fb9000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=49632, ...}) = 0
mmap2(NULL, 49632, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fac000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260e\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1364388, ...}) = 0
mmap2(NULL, 1369712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e5d000
mmap2(0xb7fa6000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x149) = 0xb7fa6000
mmap2(0xb7fa9000, 9840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fa9000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e5c000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e5c6b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7fa6000, 4096, PROT_READ) = 0
munmap(0xb7fac000, 49632) = 0
brk(0) = 0x804a000
brk(0x806b000) = 0x806b000
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fb8000
write(1, "first malloc address 0804a008\n", 30first malloc address 0804a008
) = 30
write(1, "second malloc address 0804a008\n", 31second malloc address 0804a008
) = 31
write(1, "third malloc address 0804a030\n", 30third malloc address 0804a030
) = 30
write(1, "third malloc address 0804a008\n", 30third malloc address 0804a008
) = 30
write(1, "third malloc address 0804a018\n", 30third malloc address 0804a018
) = 30
write(1, "third malloc address 0804a028\n", 30third malloc address 0804a028
) = 30
write(1, "third malloc address 0804a038\n", 30third malloc address 0804a038
) = 30
write(1, "third malloc address 0804a048\n", 30third malloc address 0804a048
) = 30
write(1, "third malloc address 0804a058\n", 30third malloc address 0804a058
) = 30
write(1, "third malloc address 0804a068\n", 30third malloc address 0804a068
) = 30
write(1, "third malloc address 0804a078\n", 30third malloc address 0804a078
) = 30
write(1, "third malloc address 0804a088\n", 30third malloc address 0804a088
) = 30
write(1, "third malloc address 0804a098\n", 30third malloc address 0804a098
) = 30
write(1, "third malloc address 0804a0a8\n", 30third malloc address 0804a0a8
) = 30
write(1, "third malloc address 0804a0b8\n", 30third malloc address 0804a0b8
) = 30
write(1, "third malloc address 0804a0c8\n", 30third malloc address 0804a0c8
) = 30
write(1, "third malloc address 0804a0d8\n", 30third malloc address 0804a0d8
) = 30
write(1, "third malloc address 0804a0f0\n", 30third malloc address 0804a0f0
) = 30
write(1, "third malloc address 0804a108\n", 30third malloc address 0804a108
) = 30
write(1, "third malloc address 0804a120\n", 30third malloc address 0804a120
) = 30
write(1, "third malloc address 0804a138\n", 30third malloc address 0804a138
) = 30
write(1, "third malloc address 0804a150\n", 30third malloc address 0804a150
) = 30
write(1, "third malloc address 0804a168\n", 30third malloc address 0804a168
) = 30
write(1, "third malloc address 0804a180\n", 30third malloc address 0804a180
) = 30
write(1, "third malloc address 0804a198\n", 30third malloc address 0804a198
) = 30
write(1, "third malloc address 0804a1b8\n", 30third malloc address 0804a1b8
) = 30
write(1, "third malloc address 0804a1d8\n", 30third malloc address 0804a1d8
) = 30
write(1, "third malloc address 0804a1f8\n", 30third malloc address 0804a1f8
) = 30
write(1, "third malloc address 0804a218\n", 30third malloc address 0804a218
) = 30
write(1, "third malloc address 0804a238\n", 30third malloc address 0804a238
) = 30
write(1, "third malloc address 0804a258\n", 30third malloc address 0804a258
) = 30
write(1, "third malloc address 0804a278\n", 30third malloc address 0804a278
) = 30
write(1, "third malloc address 0804a298\n", 30third malloc address 0804a298
) = 30
exit_group(0) = ?

מאוד בפשטות - אחרי הmalloc הראשון יש כמות נכבדה של קריאות לmmapים וbrk וכו' כדי לאתחל את הHeap של התוכנית.
ואחרי זה, כל ה31 mallocים רצים בלי קריאת מערכת אחת.
ובטח שבלי הsys_alloc המונפץ שלך


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:03   12.02.10   
אל הפורום  
  47. חחח אתה רואה? אבל אתה בדיוק לא סותר את מה שאני  
בתגובה להודעה מספר 46
 
רשמתי.
אוקיי, sys_alloc באמת לא קריאת מערכת אלא פונקציית עזר שקוראת לקריאות מערכת (זו טעות שלי שלא זכרתי נכון), אבל זה לא רלוונטי.
ובגלל זה, בגרעין אחד פונקציית העזר נקראת בשם אחד ובגרעין אחר בשם אחר (על זה אין לי ויכוח שזה לא גלובאלי לכל הגרעינים).

כל ההקצאות, כן דורשות הקצאה באמצעות mmap ו-brk,
בדיוק כמו שציינתי עוד מההתחלה (השמות השונים זה לא רלוונטי)
תקצה זכרון יותר גדול, תוכנית מעט יותר מורכב שדורשת יותר הקצאות ושחרורים ואתה מוזמן לראות בדיוק מה קורה.
כן, בדיוק מה שאמרתי מההתחלה.

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


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

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

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   18:37   12.02.10   
אל הפורום  
  48. חח עיגלת פינות? רשמת דברים סותרים לגמרי  
בתגובה להודעה מספר 47
 
   אין שום קשר לאופטימיזציות של קומפיילר.
ככה זה עובד, הקצאה של זכרון לheap בפעם הראשונה שמאלקצים, ושימוש בו עד שהוא נגמר בעזרת המנגונים הפרטיים של הCRT.
ואתה יכול להקצות לא-דטרמיניסטית עד מחר, קריאה לBRK או MMAP תקרה רק שיגמר לך המקום בHEAP הנוכחי.

לך עכשיו תשווה את זה לשטויות שאמרת במהלך האשכול הזה.
שמערכת ההפעלה מטפלת בfree? זה לא נכון בשום מצב.
"מה שקורה זה שהתוכנית שלך שולחת system call ל-free (או ליתר דיוק, ל-sys_free) על כתובת הזכרון שבקישת, היא ניגשת דרך הה-hash_table לטבלה שנראת ככה:" - לא נכון גם על פי אמות המידה שלך
"(בדר"כ, היא פשוט מסמנת אותו בביט מסויים שאומר שאפשר לכתוב עליהם מחדש במקום לפנות אותם פיזית)." - קשור לPaging בכלל, איך הגעת לזה
"הם לא מאלקצים שום דבר, אם המסגרת לא קיימת הם מעלים page fault שגורם למערכת לדפדפף דף למסגרת כשצריך." - הא?
"בנוסף, ה-free כן מסמן את הבלוקים שאתה רוצה למחוק (pg_dirty)." - ללא ספק האמירה הכי שגויה באשכול הזה, pg_dirty זה בכלל הדגל בpage header שמסמן אם הpage שונה וצריך לכתוב אותו לדיסק שוב
"תראו ש-90% מהעבודה שלו זו קריאה ל-sys_free ו-sys_alloc." - עוד אמירה מנצחת, גם אין כזה דבר sys_alloc וגם בערך אחוז מהעבודה של malloc זה קריאות מערכת.

ברצינות, אתה לא רוצה להודות שטעית, אל תודה, אבל למה אתה ממשיך?



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:48   12.02.10   
אל הפורום  
  49. ולמה לא נראה לך שה-heap יגמר? ה-heap סופי  
בתגובה להודעה מספר 48
 
אתה יודע, כשמדברים במושגים של מערכת ההפעלה.
והם מאותחלים בהתחלה בצורה שכן קשורה באופטימזיציות של הקומפיילר (אם זה מחדש לך משהו)

בנוגע ל-free, אני כבר רשמתי ממקודם שדיברתי על kfree ושם זה באמת לא מתאים לשאלת פותח האשכול.
ה-malloc? עדיין רלוונטי לחלוטין ונכון לחלוטין.
ואתה מוזמן להמשיך להתווכח בנושא עד שנה הבאה.
אתה זה שלא מודה שהתשובה שלך גם לא הייתה מדוייקת ומלאת סתירות.
בעצם, סתרת את עצמך כמה וכמה פעמים, אם הרבה מהדברים שציינת באמת היו נכונים (או לא לא מדוייקים, כפי שציינת) - הזכרון של מערכת ההפעלה הייה נגמרת בתוך 10 דקות.
אני באמת לא מבין מה אתה רוצה, אלון.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   18:52   12.02.10   
אל הפורום  
  50. אז בוא ותרשום איפה סתרתי את עצמי  
בתגובה להודעה מספר 49
 
   ואיפה החוסר דיוקים ואני מבטיח לך שאני אגיב עליהם בכנות, לעומת כל ההתחמקויות והגלגולים שאתה דופק פה בקצב מסחרר.
נתתי לך איזה 5 דוגמאות בתגובה האחרונה שלי, למה אתה לא מגיב על כולם?
ואני אמרתי שהHeap לא יגמר? כשהוא יגמר, קריאה לbrk תטפל בזה, עד אז, הHeap של התכנית ישאר יוזר-מודי לחלוטין.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:00   12.02.10   
אל הפורום  
  51. תקרא את תגובה 22 (חוץ מהקטע של free שרלוונטי  
בתגובה להודעה מספר 50
 
רק ל-kfree) ואתה מוזמן לומר איפה התגובה הנ"ל שונה מהתגובה האחרונה שנתתי ושנראה שהסכמת איתה.

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

"אתה התחלת לדבר על נושא של Virtual Memory בכלל, שזה קשור באופן קלוש ביותר לשאלה"
* שיעול שיעול *


הכל מתחיל ומתסיים בזכרון וירטואלי, נקודה!
אם זה לא היה מתחיל ומסתיים שם, מערכת ההפעלה הייתה מפוצצת את כל הזכרון במחשב שלך בתוך 10 דק'.
כל פרוסס לא יכול להחליט כמה זכרון פיזי שהוא רוצה לקחת באופן שרירותי (אחרת לא היו מתאמצים כל-כך לעבוד על מנגנונים מתוחכמים כמו של טבלת המסגרות, שלא להזכיר את החלק של ההגנה).
מערכת ההפעלה חייבת לנהל את זה באופן שותף (נעשה ע"י הוספת הנתונים לטבלת המסגרות באמצעות ה-mmap ותהליך ה-idle שאחראי לנהל את הטבלה הזו באופן שותף).
התשובה שלך הייתה נכונה במקרה ואתה מדבר על ה-DOS (לא MS-DOS) הקדום והמיושן, ששם כל תוכנית בהחלט מדברת כמעט וישירות עם זכרון המחשב.

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   19:14   12.02.10   
אל הפורום  
  52. חחח  
בתגובה להודעה מספר 51
 
   נתחיל בציטוט השני - אתה צודק ואני אתקן את עצמי.
נושא הVirtual Memory לא קשור בכלל לשאלה. אפילו לא קצת.
הוא שאל למה free לא דורש גודל. בגלל שהגודל כבר מאוחסן בHeap chunk header. אין קשר לVirtual Memory, נקודה.

ונעבור לציטוט הראשון שנכון במאה אחוז, ואמנם malloc יכול לגרום לקריאה לbrk או HeapAlloc/VirtualAlloc בוינדוס, free לא יקרא לאף קריאת מערכת.
אולי אולי אולי אולי בשביל הקטנת הHeap ועניינים של פרגמנטציה.
בטח לא בשביל לסמן pg_dirty
זאת בדיחה חבר

ואל תרצה לי על Virtual Memory בבקשה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:18   12.02.10   
אל הפורום  
  53. קרא על kfree ו-kmalloc ותחזור לפה אז :)  
בתגובה להודעה מספר 52
 
ואתה מוזמן להמשיך להתפלצף ולעוות את התגלגלות העניינים עד מחר. זה לא יהפוך את הדברים שאתה טוען - לנכונים.
זה בסדר, מותר לך לטעות.
אני כבר אמרתי שהסברתי על kfree במקום free.
כשתפנים את זה תחזור


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   19:32   12.02.10   
אל הפורום  
  54. חחחח אז מה אם דיברת על kfree?!  
בתגובה להודעה מספר 53
 
   זה הופך את זה לרלוונטי?
יופי אז אני אגיד שfree כותב למסך. נראה לך שאני טועה?
תקרא על write ותחזור לפה אז


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:33   12.02.10   
אל הפורום  
  55. בסדר אלון, זזתי לקרוא על write. סיימנו אז את הדיון.  
בתגובה להודעה מספר 54
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   20:49   12.02.10   
אל הפורום  
  56. אני חייב להגיד שהמשך הויכוח שלכם סידר לי הכל :)  
בתגובה להודעה מספר 55
 
   ערכתי לאחרונה בתאריך 12.02.10 בשעה 21:01 בברכה, פאביו ג'וניור
 
באמת!
כאילו אני הבנתי רק לקראת הסוף על מה אתם רבים והכל הסתדר לי עם כל מה שאני יודע וכל מה ששחכתי ועכשיו נזכרתי :P

תודה

שורה תחתונה free לא עושה שום syscall? אז בתאכלס אם תקצה גודל ענקי (4כמעט גיגה.. אנערף) ואז תשחרר אותו (בעזרת free) בסופו של דבר המערכת הפעלה תשים את הדפים שלו על הHD או שהיא גם תידע לשחרר את אותו הזכרון לגמריי? ואז בזמן הMALLOC הבא יהיה PAGEFAULT (כי לפי מה שהבנתי ממכם CRT נשאר "אחראי" על הזכרון ולא "משחרר אותו למערכת הפעלה"..) ואז מן הסתם המערכת הפעלה תטען את אותם הדפים ויוקצה עליהם הזכרון החדש שאתה צריך? (כאילו הCRT יחליט ש-כתובות מפה עד לפה עכשיו יהיו שייכות ל... אחרי שהמערכת הפעלה תחזיר את הדפים לזכרון אחרי הPAGE FAULT)
לא יודע נשמע לי קצת הזוי שברגע שאתה עושה free אתה לא מסמן כלום למערכת הפעלה שתידע שאם היא באמת צריכה את הזכרון הזה היא יכולה לקחת...?

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   21:46   12.02.10   
אל הפורום  
  57. מכתב  
בתגובה להודעה מספר 56
 
   שמע אני יודע שהאשכול הזה מבלבל אבל תעשה הפרדה בין אלקוץ ושחרור זכרון לבין מנגנון הPaging, בניגוד למה שעידן אומר ברוב הזמן הם מתקיימים לגמרי בנפרד (אך במקביל).
אם תאלקץ כמות גדולה של זכרון ותשחרר אותה, הזכרון הזה פשוט יסומן כfree, בלי שום קשר לדפים.
במידה והCRT יחליט שהוא רוצה, הוא יחזיר ת'זכרון הזה למערכת ההפעלה והיא תוכל להוריד את המיפוי של הPageים השלמים שיוחזרו.
במידה ולא, הזכרון הזה ישאר ממומפה לאותו הפרוסס, ופעם הבאה שתאלקץ זכרון בגודל זהה לזה, תקבל את אותה הכתובת.
חשוב שתזכור שהמנגנון שמממש את malloc וfree הוא יוזר מודי לחלוטין.
הוא לא מודע לPaging. הוא רק יודע שיש לו אזור זכרון (הHeap) שהוא יכול לעשות איתו מה שבא לו, ושנגמר לו המקום הוא יכול לבקש עוד מקום בשבילו ממערכת ההפעלה.
Page faultים קורים כל הזמן בלי קשר לזה, פרוססים ות'רדים מוחלפים עשרות פעמים בשניה ומנגנון הPaging עובד קשה כדי לדאוג שהדפים של כולם יהיו במקום.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:18   12.02.10   
אל הפורום  
  58. זה כבר הרבה יותר נכון. רק תיקון קטן - מסגרות, לא דפים.  
בתגובה להודעה מספר 57
 
ואני שמח שפותח האשכול מרוצה והגיע להבנה


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   01:25   13.02.10   
אל הפורום  
  60. לא, ברור שיש הפרדה..  
בתגובה להודעה מספר 57
 
   לא זאת הייתה הכוונה שלי..
אבל בהסבר שלך כן ענית על השאלה :P
תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:40   09.02.10   
אל הפורום  
  31. באמת הרבה סלט באשכול אחד  
בתגובה להודעה מספר 0
 
   כמו שנאמר כאן, ה CRT מנהל את כל נושא ההקצאה והשחרור ולא מערכת ההפעלה ישירות.
בסופו של דבר בכל מימוש כזה או אחר של Malloc חייבת להיות אינטרקציה עם המערכת הפעלה.

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

למי שבאמת רוצה להרחיב בנושא כדאי להכנס ללינק הבא:
http://www.ibm.com/developerworks/linux/library/l-memory/

(אני אישית לא קראתי מחוסר זמן אבל זה נראה מאד מקיף)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net