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

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



  #10  
ישן 27-01-2010, 19:02
  משתמש זכר hzhz hzhz אינו מחובר  
 
חבר מתאריך: 06.07.05
הודעות: 6,559
בתגובה להודעה מספר 9 שנכתבה על ידי Dark Knight שמתחילה ב "כן, זה ההסבר שכיוונתי אליו :-)"

ההסבר של אנדרו קינג כאן:
זהירות - ספויילר!


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

שתי שאלות:
1. ידוע שמערך צריך להיות "גוש" אחד של זיכרון. מי אמר שבקצב גדילה יותר קטן ניתן להשתמש בזיכרון שפונה? אולי בתאי זיכרון אחרי האיבר האחרון במערך יש מידע השייך לתוכנית אחרת? זה לא אומר שגידול של המערך ב-1.5 יגרום לדריסה של נתונים?
2. למה דווקא יחס הזהב?
_____________________________________
https://www.youtube.com/watch?v=0HRGczvZINQ&noembed

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 27-01-2010, 23:24
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 10 שנכתבה על ידי hzhz שמתחילה ב "ההסבר של אנדרו קינג כאן: ..."

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


נערך לאחרונה ע"י Dark Knight בתאריך 27-01-2010 בשעה 23:32.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #14  
ישן 28-01-2010, 08:43
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 13 שנכתבה על ידי פסטן שמתחילה ב "ועכשיו אני נותן לך חידה:"

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

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

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #15  
ישן 31-01-2010, 20:01
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 14 שנכתבה על ידי Dark Knight שמתחילה ב "שמע, אני לא ממש יודע למה, אבל..."

השגיאה המתמטית היא שאתה כולל את השטח שמכיל את הוקטור הקיים, השטח שעדיין
לא שוחרר, כחלק מהזיכרון החדש שאתה יכול להקצות. זה פשוט חישוב לא נכון. אם מקצים
תחילה [tex]t[/tex] מקום, ומכפילים כל פעם בקבוע [tex]k[/tex], אז בפעם השנייה יש לנו [tex]kt[/tex], בפעם השלישית
[tex]k^2t[/tex], ובאופן כללי בפעם ה-[tex]n[/tex] יש לנו [tex]k^{n-1}t[/tex].

ההקצאה השלישית לא יכולה להשתמש במקום של ההקצאה השנייה, כי הוא בשימוש כרגע,
ולכן יכולה להשתמש רק בזה של הראשונה. ההקצאה השלישית גם תשתמש במקום חדש.
עכשיו ההקצאה הרביעית יכולה להשתמש במקום של ההקצאה השנייה והראשונה (אבל לא
של השלישית, כי היא בשימוש כרגע). זה אומר שאנחנו רוצים שהקבוע [tex]t[/tex] יהיה כזה שסכום
שתי ההקצאות הראשונות יהיה שווה לרביעית: [tex]t+kt=k^3t[/tex], שהופך ל-[tex]1+k=k^3[/tex].

הפיתרון הממשי של המשוואה הזו לפי מחשבון אינטרנט אקראי שמצאתי בגוגל הוא:
[tex]k=1.3247179572447458[/tex]. אמנם לא מדובר בקבוע מפורסם כלשהו, בניגוד ל-[tex]\phi[/tex],
אבל זה הפיתרון הנכון.

עכשיו, ביצענו את ההקצאה הרביעית שתפסה את המקום של הראשונה והשנייה, ושחררנו
את ההקצאה השלישית. ביצענו הקצאה חמישית ושיחררנו את הרביעית. ההקצאה השישית
לא יכולה להשתמש בזו של החמישית (כי היא בשימוש כרגע), והשטח של ההקצאה הרביעית
בלבד לא יספיק (הוא שווה לראשונה ולשניה, והשטח של השלישית בחלקו בשימוש על-ידי
החמישית). אז ביצענו גם הקצאה שישית. עכשיו אנחנו אולי רוצים שהשטח של ההקצאה
השביעית יהיה כזה שייכנס לזיכרון שבא לפני תחילת ההקצאה השישית. כלומר: ההקצאה
הרביעית והחמישית: [tex]k^6t=k^3t+k^4t[/tex], ה-[tex]t[/tex] כמובן מצטמצם כמו קודם, וגם רוב ה-[tex]k[/tex]-ים,
ומתקבלת המשוואה המוכרת מלמעלה: [tex]1+k=k^3[/tex]. זו התוצאה הכללית של מצב שבו אנחנו
רוצים שכל הקצאה תוכל להשתמש בזיכרון של שתי ההקצאות הישנות יותר מהשלוש שבאו
לפניה ([tex]k^nt+k^{n+1}t=k{n+3}t = 1+k=k^3[/tex]). אם אתה רוצה "למחזר זיכרון" בכל
פעם חמישית, או באיזושהי צורה אחרת, תקבל משוואה אחרת וקבוע אחר, כמובן. [tex]\phi[/tex] נכון רק
בשאיפה לאינסוף, ולכן חסר כל משמעות פרקטית. כמו שהראתי, כדי לנצל את הזיכרון מחדש
מהר ככל האפשר, צריך ערך של 1.35 בקירוב, ו-1.5 אינו מספיק.

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

[tex]\phi[/tex] הוא הערך הקריטי שבו בשאיפה לאינסוף נצליח לנצל מחדש זיכרון. 1.5 הוא ערך שבו
נצליח לנצל מחדש זיכרון קודם בשלב כלשהו. 2 בתור מספר שגבוה מהערך הקריטי הוא
קבוע הגדלה שאיתו לעולם לא נצליח לנצל מחדש זיכרון. אבל השאלה הפרקטית היא האם
מדובר בבעיה אמיתית, שבגללה שווה לנו לבצע כל-כך הרבה הקצאות והעתקות. אם התשובה
היא לא, אז במקרים מסויימים אולי נעדיף קבועים גדולים, כמו 10 לדוגמה (לדוגמה: אם אנחנו
יודעים שברגע שהוקטור עבר את הערך שקבענו לו עם reserve, זה אומר שהולך להיכנס אליו
עוד המון מידע), ולא אכפת לנו שהם עוברים את [tex]\phi[/tex].

התשובה היא שהיום באמת לא אכפת לנו. הטיעון בנוי משני חלקים:

ראשית, עלינו להבין (כמו שאגב אפשר לראות בקישור שהבאתי ובגוגל בכלל) שגם בטיעון
המקורי דובר על "בזבוז, מול "מחזור" של טווחי כתובות, ולא של זיכרון. אם ניקח את
פלטפורמת Intel x86 כמקרה-בוחן נבין למה כך נראה הטיעון: ממילא תמיד משתמשים
במנגנון ה-paging והזיכרון הפיזי ממוחזר בבלוקים של 4K. הבעיה היא רק בזבוז טווח
הכתובות שניתן לתוכנה.

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

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

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

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

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

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



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

הדף נוצר ב 0.08 שניות עם 10 שאילתות

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

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