Logo

רד-בורד: ארכיון

ראשי > תיכנות > זיכרון התוכנית

10/05/2008 19:30:59 talikag
שלום. חקרתי אתמול קצת את עניין הזיכרון ושמתי לב למשהו מאד מוזר - שמתי לב שהמהדר שאני משתמש בו, ++DEV C, מקצה סתם זיכרון, ללא סיבה.
הרצתי תחילה את הקוד הבא:
קוד:
#include<stdio.h>

void func()
{
int x;
printf("%d", &x);
func();
}

int main()
{
func();
}

זאת בעצם רקורסיה אין-סופית שבכל קריאה אני מציג את כתובתו של המשתנה. התוצאה הייתה שכתובות המשתנה x הופיעו בהפרש של 32, ז"א שעבור כל קריאה לפונקציה func המהדר מקצה 32 בתים.
הרצתי אח"כ 2 הקודים הבאים:
קוד:
#include<stdio.h>

void func()
{
int x, y;
printf("%d", &x);
func();
}

int main()
{
func();
}

קוד:
#include<stdio.h>

void func()
{
int a, b, c, d;
printf("%d", &x);
func();
}

int main()
{
func();
}

בפעם הראשונה הוספתי משתנה אחד, כלומר הוספתי 4 בתים, ובפעם השניה הוספתי 3 משתנים, כלומר 12 בתים.
אבל להפתעתי, בהצגה של 2 התוכניות, ההפרש נשאר 32.

הסקתי מכאן שהמהדר מקצה 16 בתים נתונים על הפונקציה עצמה (כמו הערך המוחזר למשל), ובכפולות של 16 למשתנים שבה.
שאלתי היא אם כך: למה המהדר מקצה בתים בכפולות של 16 ולא בדיוק את כמות הזיכרון שדרושה?
10/05/2008 22:45:40 T4uSBaZ
יאללה HLL
תפציץ =]

אם זה יעזור,
גם אני שאלתי פעם את עצמי,
הוא נעה לי משו כזה:

HLLý (þPMý þ10:28)þ :
זה נקרא Alligment.
זה בעצם יישור של הכתובות לכפולה מסויימת (לפעמים 2 לפעמים 4, ולפעמים יותר) הדבר קיים בשביל להגביר את היעילות
לCPU שלך חוץ מאוגרים יש גם Chase/CASH/CACHE




ש כלמיני רמות וסוגים של קאש, לא ממש נכנסתי לזה אבל הרעיון הוא לשמור היסטוריה או עתיד של פקודות ו/או כתובות ו/או נתונים בשביל לגשת כמה שפחות לפסים החיצוניים למעבד.
HLLý (þPMý þ10:30)þ :
לפעמים הכתובת אכן נמצאת במאגר ולפעמים לא, הסיבה היא שיש את ה Aligment זה בגלל שהקאש מאכסן נתונים ספציפיים ו/או נתונים שמיושרים בצורה מסויימת (מתחלקים ב 2 4.....)
HLLý (þPMý þ10:31)þ :
זה בנוי ככה לא בכוונה כמובן, המעבד, אלא בשל שיקולי אלקטרוניקה, אתה לא יכול לדחוף את כל האופציות האפשריות למעבד... אז מסתדרים עם מה שיש ועל כן יש alligment : )

אבל תכתוב שוב הלל או כל מישהו אחר,בכדי
שנבין ת’עניין יותר טוב.
10/05/2008 23:09:08 talikag
ציטוט:יאללה HLL
תפציץ =]

אם זה יעזור,
גם אני שאלתי פעם את עצמי,
הוא נעה לי משו כזה:

HLLý (þPMý þ10:28)þ :
זה נקרא Alligment.
זה בעצם יישור של הכתובות לכפולה מסויימת (לפעמים 2 לפעמים 4, ולפעמים יותר) הדבר קיים בשביל להגביר את היעילות
לCPU שלך חוץ מאוגרים יש גם Chase/CASH/CACHE



ש כלמיני רמות וסוגים של קאש, לא ממש נכנסתי לזה אבל הרעיון הוא לשמור היסטוריה או עתיד של פקודות ו/או כתובות ו/או נתונים בשביל לגשת כמה שפחות לפסים החיצוניים למעבד.
HLLý (þPMý þ10:30)þ :
לפעמים הכתובת אכן נמצאת במאגר ולפעמים לא, הסיבה היא שיש את ה Aligment זה בגלל שהקאש מאכסן נתונים ספציפיים ו/או נתונים שמיושרים בצורה מסויימת (מתחלקים ב 2 4.....)
HLLý (þPMý þ10:31)þ :
זה בנוי ככה לא בכוונה כמובן, המעבד, אלא בשל שיקולי אלקטרוניקה, אתה לא יכול לדחוף את כל האופציות האפשריות למעבד... אז מסתדרים עם מה שיש ועל כן יש alligment : )

אבל תכתוב שוב הלל או כל מישהו אחר,בכדי
שנבין ת’עניין יותר טוב.

תודה על התגובה. אני אשמח לתגובה יותר מפורטת שתסביר למה בדיוק זה מגביר את יעילות התוכנית. רב מה שאמרת לא אומר לי הרבה
08/09/2008 19:35:17 HLL
שוב,
מנגנוני DMA ומנגנוני Cashing, עקב אילוצי חומרה יכולים לעבוד רק עם כתובות שהם Aligned לתחום מסויים,
לדוגמא
נניח בארכיטקטורת אינטל שאתה רוצה להשתמש בכתובת זיכרון נאמר x00000001
מנגנון ה Cash של המעבד בנוי בצורה כזו שהוא מכיל wordים (כאשר הכוונה ל word הוא כגודל האוגר הדיפולטיבי של המעבד)
המנגנון טוען ל Cash לדוגמא את בלוק הנתונים מ 0 - 8, נניח ואלו 2 מילים
בתא הראשון הוא מאכסן את 0-3 ובתא 2 הוא מאכסן את בתים .4-7
אין אפשרות לגשת למשהוא בגודל שהוא פחות מגודל מילה, באמצעות ה Cash, לכן המעבד יצטרך לשלוף את כל ה Word מה Cash, ולהזיז את הביטים ימינה(פעולה שלוקחת זמן)
באם הכתובת שאתה מעוניין לגשת עליה היא ב word boundry (כלומר, במעבד 32 ביט, מיושרת ל4 בתים - כלומר שכתובת האיבר מתחלקת ב 4) אזי לא יהיה צורך ב shifting הנ"ל בגלל שהנתון כבר נמצא במקום שהוא צריך להיות.

הסברתי את זה קצת עקופ, אבל השתדלתי לעשות את המירב :)
עמודים: 1