Smart-World Surf

יחידה 6: ניהול זיכרון פיזי

שיטות שונות להקצאת זיכרון ראשי לתהליכים.
זיכרון רציףדפדוף (Paging)פילוח (Segmentation)טבלת עמודיםטבלת פלחים

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

מבוא לניהול זיכרון פיזי

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

זיכרון לוגי (Logical Address Space): מרחב הכתובות שהתהליך "רואה" ומייצר. הוא מתחיל בדרך כלל מ-0 וגדל ככל שהתהליך דורש יותר זיכרון.
זיכרון פיזי (Physical Address Space): מרחב הכתובות האמיתי של תאי הזיכרון ב-RAM.

שיטות הקצאת זיכרון רציף

הקצאה רציפה (Contiguous Allocation)

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

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

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

דפדוף (Paging): פתרון לפרגמנטציה

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

עמוד (Page): יחידת זיכרון לוגית בגודל קבוע (לרוב כוח של 2, למשל 4KB).
מסגרת (Frame): יחידת זיכרון פיזית בגודל קבוע, זהה לגודל עמוד.

טבלת עמודים (Page Table)

כל תהליך מחזיק בטבלת עמודים משלו, הממפה את העמודים הלוגיים שלו למסגרות פיזיות. כאשר ה-CPU מייצר כתובת לוגית (המורכבת ממספר עמוד והיסט בתוך העמוד), ה-MMU (Memory Management Unit) משתמש בטבלת העמודים כדי למצוא את מספר המסגרת הפיזית המתאימה, ומשלב אותה עם ההיסט כדי ליצור את הכתובת הפיזית.

טבלת עמודים (Page Table): מבנה נתונים, לרוב מערך, הממוקם בזיכרון הראשי. כל כניסה בטבלה (PTE - Page Table Entry) מכילה את מספר המסגרת הפיזית אליה ממופה העמוד הלוגי, וכן ביטי הגנה (קריאה/כתיבה/ביצוע) וביט תקינות (Valid/Invalid).

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

פילוח (Segmentation): מבט מונחה-משתמש

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

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

טבלת פלחים (Segment Table)

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

טבלת פלחים (Segment Table): מבנה נתונים המכיל עבור כל פלח את כתובת הבסיס הפיזית שלו בזיכרון הראשי ואת גודלו (Limit).

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

דפדוף מול פילוח: הבדלים קריטיים ושיקולי תכנון.

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

השוואה בין דפדוף לפילוח

דפדוף (Paging)

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

פילוח (Segmentation)

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

שאלות לדיון

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

נקודות לתשובת מודל

  • פרגמנטציה: הגדרת פרגמנטציה פנימית (בתוך בלוק שהוקצה, אופייני לדפדוף) וחיצונית (שטח פנוי מפוזר, אופייני להקצאה רציפה ולפילוח).
  • דפדוף: הסבר על חלוקה לעמודים/מסגרות, תהליך תרגום כתובת (מספר עמוד + היסט -> מספר מסגרת + היסט) באמצעות טבלת עמודים. התייחסות לאתגרי גודל טבלה (למשל, טבלאות היררכיות או היפוך טבלת עמודים).
  • פילוח: הסבר על חלוקה לפלחים לוגיים בגודל משתנה, תהליך תרגום כתובת (מספר פלח + היסט -> כתובת בסיס + היסט) באמצעות טבלת פלחים. הדגשת הגנה ושיתוף ברמת פלח.
  • השוואה: דפדוף (שקוף למתכנת, חלוקה קבועה, פותר חיצונית, סובל פנימית) מול פילוח (גלוי למתכנת, חלוקה לוגית משתנה, סובל חיצונית, הגנה ושיתוף לוגיים).
  • TLB: הסבר על ה-TLB כמטמון חומרה לתרגומי כתובות אחרונים, שמטרתו לזרז את תהליך תרגום הכתובות בדפדוף על ידי הימנעות מגישה כפולה לזיכרון הראשי (אחת לטבלת העמודים ואחת לנתונים עצמם) ברוב המקרים.
מצאתם טעות או שחסר משהו?
→ הקודמת
מבוי סתום (Deadlock)
הבאה ←
זיכרון וירטואלי