לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

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



  #1  
ישן 17-10-2005, 18:37
  cyberia_2ooo cyberia_2ooo אינו מחובר  
 
חבר מתאריך: 17.12.01
הודעות: 1,604
ניהול זכרון

היי...

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

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

המימוש שלי כרגע הוא מאד פשוט. אני מגדיר את כל הpool כבלוק שאפשר להקצות ממנו
כל הקצאה מקצה מההתחלה שלו את הגודל שאני רוצה.
ובשחרור אני מחבר כל בלוק משוחרר לבלוקים הפנויים (אם יש) לפניו ואחריו וכל הקצאה אני עובר מההתחלה של הpool שלי עד שאני מוצא בלוק אשר ממנו אני יכול להקצות ומכיל מספיק מקום בשבילי להקצות ממנו....
_____________________________________
Subtle and insubstantial, the expert leaves no trace; divinely mysterious, he is inaudible.
Thus he is the master of his enemy's fate.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 17-10-2005, 20:00
צלמית המשתמש של scripter
  scripter scripter אינו מחובר  
 
חבר מתאריך: 04.08.02
הודעות: 4,468
..
בתגובה להודעה מספר 1 שנכתבה על ידי cyberia_2ooo שמתחילה ב "ניהול זכרון"

אמת, הקצאת הזיכרון/שחרור ב-kernel mode בתדירות גבוהה ייגרום לירידת ביצועים במערכת.
אחד הסיבות שחובה תמיד כשאפשר להשתמש מחדש בזיכרון שהוקצא ולא להקצאות מחדש.

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

איך הגעת למצב אבל, שאתה צריך להקצאות בלוקים קטנים בתדירות גבוה עם זמן מחיה קטן?
האם מדובר בזמני מחיה שווים? אם כן, כדאי לשקול לאחד את תהליך הקצאה של אותם בלוקים, ככה תוכל לשחרר אותם במכה אחת, ובכך למנוע קריאות מיותרות לפונקציה שחרור שלך, שאמנם היא אכן מבצעת דיפרג על הזיכרון, אבל גוזלת משאבים רבים (אולי פה יש מקום לשיפור?)
אולי לעשות שימוש חוזר בזיכרון? מדובר פה על בלוקים קטנים שאתה מקצא אותם בתדירות גבוה, האם שווה להשקיע לעשות דיפרג כל שחרור לעומת להחזיק איזור קבוע לאותם בלוקים?
_____________________________________
C pogrammers never die. They are just cast into void.


תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 17-10-2005, 20:20
  cyberia_2ooo cyberia_2ooo אינו מחובר  
 
חבר מתאריך: 17.12.01
הודעות: 1,604
אמממ
בתגובה להודעה מספר 2 שנכתבה על ידי scripter שמתחילה ב ".."

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

יש דרך שבהתחלה עשיתי שזה פשוט להגדיר 5 גדלים קבועים שאני יכול להקצות 4 8 16 32 64
ואז כל פעם שאני רוצה להקצות בלוק אני מקצה אותו בבלוק שהכי קרוב לגודל שלו... אבל רציתי בסוף לשחק קצת עם הקצאות הזכרון קצת יותר אז החלטתי לממש הקצאה מתוך pool משלי


פשוט עניין אותי אלו גישות אחרות ממה שאני חשבתי עליה יש לבעיה הזו....
_____________________________________
Subtle and insubstantial, the expert leaves no trace; divinely mysterious, he is inaudible.
Thus he is the master of his enemy's fate.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 19-10-2005, 07:58
  גל דיסקין גל דיסקין אינו מחובר  
 
חבר מתאריך: 01.08.02
הודעות: 8,959
שיפורים קטנים יכולים לעשות הבדלים גדולים
בתגובה להודעה מספר 1 שנכתבה על ידי cyberia_2ooo שמתחילה ב "ניהול זכרון"

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

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

עצות והמלצות:

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 01:18

הדף נוצר ב 0.06 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר