מקטעי זיכרון

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

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

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

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


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

Stack



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

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

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

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

ה-data segment מורכב משלושה חלקים:

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

מחסנית (Stack)[עריכת קוד מקור | עריכה]

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

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

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