לדלג לתוכן

מקטעי זיכרון

מתוך ויקיפדיה, האנציקלופדיה החופשית

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

מקטעי הזיכרון של תהליך

[עריכת קוד מקור | עריכה]
חלוקת הזיכרון של תהליך למקטעים:


כתובות גבוהות

Stack



Heap
bss
Data
Code segment
כתובות נמוכות

ישנם ארבעה חלקים בזיכרון של תהליך[1]:

מקטעי זיכרון

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

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

מקטע המידע

[עריכת קוד מקור | עריכה]

מקטע המידע (data segment) מורכב משני חלקים:

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

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

מחסנית (Stack)

[עריכת קוד מקור | עריכה]
ערך מורחב – מחסנית קריאות

במקטע המחסנית נמצאים המשתנים המקומיים. מקטע זה מנוהל בצורה של מחסנית: שפת המכונה של המעבד תומכת בפקודות הכנסה למחסנית והוצאה ממנה. המעבד שומר את הכתובת של ראש המחסנית באוגר הנקרא stack pointer. אוגר זה מתעדכן בכל פעם שמתבצעת פקודת הכנסה או הוצאה מהמחסנית. קבוצת הכתובות במחסנית שבה נמצאים ערכים שהוכנסו על ידי אותה שגרה נקרא stack frame. את הכתובת במחסנית של תחילת ה־stack frame של השגרה המבוצעת כעת שומר המעבד באוגר frame pointer. כאשר מתבצעת קריאה לשגרה אחרת, תוכנו של אוגר זה נדחף למחסנית ולאחר מכן האוגר מקבל ערך חדש השווה לזה של אוגר כתובת ראש המחסנית (SP – stack pointer). בעת ביצוע חזרה משגרה מתבצעות פעולות הפוכות: אם שגרה א' קראה לשגרה ב', לאחר סיום שגרה ב' אוגר ראש המחסנית מקבל את ערכו של אוגר ראש השגרה ובכך למעשה מרוקן את המחסנית מכל הנתונים שהוכנסו על ידי שגרה ב'. לאחר מכן מתבצעת פקודת הוצאה מהמחסנית המוציאה את הכתובת של ראש שגרה א' שהוכנסה למחסנית לפני ביצוע הקריאה לשגרה ב'. הכתובת מוכנסת לאוגר ראש השגרה ובכך מסתיימת החזרה לשגרה א'.

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

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

הערות שוליים

[עריכת קוד מקור | עריכה]