Smart-World Surf

יחידה 7: זיכרון וירטואלי

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

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

זיכרון וירטואלי: הרעיון המרכזי

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

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

היתרונות המרכזיים של זיכרון וירטואלי כוללים:

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

מנגנוני מפתח: דפדוף לפי דרישה וכשל עמוד

דפדוף לפי דרישה (Demand Paging)

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

דפדוף לפי דרישה: טכניקה בניהול זיכרון וירטואלי שבה עמודים נטענים לזיכרון הפיזי רק כאשר הם נדרשים בפועל על ידי התוכנית, ולא מראש. זה מפחית את עומס ה-I/O ומאפשר ליותר תהליכים לרוץ בו-זמנית.

כשל עמוד (Page Fault)

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

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

תהליך הטיפול בכשל עמוד:

  1. החומרה (MMU) מזהה ניסיון גישה לעמוד שאינו בזיכרון הפיזי (לרוב באמצעות סימון "לא חוקי" או "לא קיים" בטבלת העמודים).
  2. נוצרת הפרעה (trap) למערכת ההפעלה.
  3. מערכת ההפעלה בודקת את חוקיות הגישה. אם הגישה אינה חוקית (למשל, ניסיון כתיבה לאזור קוד), התהליך מופסק.
  4. אם הגישה חוקית, מערכת ההפעלה מאתרת את העמוד הנדרש בדיסק (ב-swap space).
  5. אם הזיכרון הפיזי מלא, מערכת ההפעלה בוחרת עמוד "קורבן" להחלפה (באמצעות אלגוריתם החלפת עמודים).
  6. העמוד הקורבן נכתב לדיסק אם הוא שונה (dirty) מאז נטען, כדי לשמור את השינויים.
  7. העמוד הנדרש נטען מהדיסק לפריימים הפנויים בזיכרון הפיזי.
  8. טבלת העמודים של התהליך מתעדכנת כך שהכתובת הווירטואלית תצביע כעת על הכתובת הפיזית החדשה, והסימון "חוקי" מופעל.
  9. הפקודה שגרמה לכשל העמוד מופעלת מחדש.

אלגוריתמי החלפת עמודים

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

FIFO (First-In, First-Out)

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

LRU (Least Recently Used)

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

Optimal (OPT)

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

LFU (Least Frequently Used)

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

נושא קריטי למבחן: דישדוש (Thrashing)

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

שאלות לדיון

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

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

  • זיכרון וירטואלי: מאפשר מרחב כתובות גדול מהפיזי, בידוד תהליכים, ניצול יעיל של זיכרון, שיתוף קוד/נתונים.
  • טיפול בכשל עמוד: זיהוי ע"י MMU -> Trap ל-OS -> בדיקת חוקיות -> איתור עמוד בדיסק -> בחירת עמוד קורבן (אם נדרש) -> כתיבת קורבן לדיסק (אם dirty) -> טעינת עמוד נדרש לזיכרון -> עדכון טבלת עמודים -> הפעלת פקודה מחדש.
  • השוואת FIFO ו-LRU:
    • FIFO: פשוט ליישום, עשוי לסבול מ-Belady's Anomaly, לא מתחשב בשימוש בפועל.
    • LRU: יעיל יותר (מבוסס מקומיות), קשה ליישום מדויק (דורש חומרה מורכבת או עלויות תוכנה גבוהות), לא סובל מ-Belady's Anomaly.
  • דישדוש (Thrashing):
    • גורמים: זיכרון פיזי קטן מדי ביחס לסט העבודה הכולל של התהליכים הפעילים, הקצאת זיכרון לא מספקת לתהליכים.
    • השלכות: ירידה דרסטית בביצועים, רוב הזמן מבוזבז על החלפת עמודים (I/O), מעט עבודה שימושית.
    • מניעה/טיפול: הגדלת זיכרון פיזי, הקצאת מספיק פריימים לכל תהליך (מודל סט עבודה), השעיית תהליכים כדי להפחית עומס, ניהול רמת ריבוי המשימות.
מצאתם טעות או שחסר משהו?
→ הקודמת
ניהול זיכרון פיזי
הבאה ←
מערכות קבצים