זיכרון וירטואלי (Virtual Memory) – צלילה עמוקה לקראת בחינה
בחינות הקורס "מערכות הפעלה" (20594) באוניברסיטה הפתוחה, לאורך השנים (כפי שניתן לראות מהשמות כמו 2012a, 2000b_sol, 1999a_sol ועוד), מדגישות הבנה מעמיקה של מנגנוני הליבה של מערכות הפעלה. הנושא של זיכרון וירטואלי נבחן לרוב לא רק ברמה התיאורטית, אלא גם באמצעות שאלות הדורשות ניתוח תרחישים, חישובים (למשל, תרגום כתובות או מספר כשלים בדף), והשוואת אלגוריתמים. הדגש הוא על הבנת ה"למה" וה"איך" – מדוע זיכרון וירטואלי נחוץ, וכיצד הוא ממומש הלכה למעשה, כולל השלכותיו על ביצועי המערכת.
זיכרון וירטואלי הוא טכניקה מהפכנית במערכות הפעלה המאפשרת לתוכניות להשתמש במרחב כתובות לוגי גדול יותר מהזיכרון הפיזי הזמין, על ידי שימוש בדיסק כהרחבה לזיכרון. זהו מנגנון מפתח המאפשר ריבוי משימות יעיל, הגנה על זיכרון, ופישוט ניהול הזיכרון עבור מתכנתים.
מדוע זיכרון וירטואלי כה חשוב?
- מרחב כתובות לוגי גדול יותר: כל תהליך מקבל אשליה של מרחב זיכרון עצום ורציף, ללא קשר לגודל הזיכרון הפיזי בפועל.
- ריבוי משימות (Multitasking): מאפשר למספר תהליכים לרוץ במקביל, גם אם סך הזיכרון שהם דורשים גדול מהזיכרון הפיזי. רק חלקים מהקוד והנתונים של כל תהליך צריכים להיות בזיכרון הפיזי בכל רגע נתון.
- הגנת זיכרון: כל תהליך פועל במרחב כתובות משלו, מבודד מתהליכים אחרים. ניסיון גישה לכתובת מחוץ למרחב המוקצה לו יגרום לשגיאה, ובכך מונע מתהליכים להשחית זה את זיכרונו של זה.
- שיתוף זיכרון: מאפשר למספר תהליכים לשתף קטעי קוד או נתונים (למשל, ספריות משותפות) על ידי מיפוי אותם דפי זיכרון פיזיים למרחבי כתובות וירטואליים שונים.
- פישוט תכנות: מתכנתים אינם צריכים לדאוג למיקום הפיזי של הנתונים או הקוד שלהם, או לגודל הזיכרון הפיזי הזמין. הם כותבים קוד כאילו יש להם זיכרון בלתי מוגבל.
מנגנוני ליבה של זיכרון וירטואלי
המימוש הנפוץ ביותר של זיכרון וירטואלי הוא באמצעות דפדוף (Paging).
כתובת וירטואלית (Virtual Address): כתובת שנוצרת על ידי המעבד ומשמשת תהליך.
כתובת פיזית (Physical Address): הכתובת האמיתית בזיכרון הראשי (RAM).
המעבד (CPU) מייצר כתובות וירטואליות, אשר מתורגמות לכתובות פיזיות על ידי יחידת ניהול הזיכרון (MMU - Memory Management Unit). תהליך זה שקוף לתהליך הרץ.
דפדוף (Paging)
- הזיכרון הווירטואלי מחולק לבלוקים בגודל קבוע הנקראים דפים (Pages).
- הזיכרון הפיזי מחולק לבלוקים באותו גודל הנקראים מסגרות דף (Page Frames).
- לכל תהליך יש טבלת דפים (Page Table) משלו, הממפה דפים וירטואליים למסגרות דף פיזיות.
טבלת דפים (Page Table): מבנה נתונים המנוהל על ידי מערכת ההפעלה, המכיל רשומות הממפות כתובות דפים וירטואליים לכתובות מסגרות דף פיזיות.
כשל דף (Page Fault): אירוע המתרחש כאשר תהליך מנסה לגשת לדף וירטואלי שאינו נמצא כרגע בזיכרון הפיזי.
כאשר מתרחש כשל דף, מערכת ההפעלה נכנסת לפעולה: היא מאתרת את הדף המבוקש בדיסק (באזור הנקרא Swap Space או Paging File), טוענת אותו למסגרת דף פנויה בזיכרון הפיזי, מעדכנת את טבלת הדפים, ומאפשרת לתהליך להמשיך. אם אין מסגרת דף פנויה, יש להשתמש באלגוריתם החלפת דפים (Page Replacement Algorithm) כדי לבחור איזה דף קיים בזיכרון הפיזי יוצא לדיסק כדי לפנות מקום.
דפדוף לפי דרישה (Demand Paging)
טכניקה שבה דפים נטענים לזיכרון הפיזי רק כאשר הם נדרשים (כלומר, מתרחש כשל דף). זהו המימוש הנפוץ ביותר, המפחית את זמן האתחול של תהליכים ומאפשר להריץ תהליכים גדולים יותר.
TLB (Translation Lookaside Buffer)
מטמון חומרה קטן ומהיר במעבד, המאחסן רשומות תרגום כתובות וירטואליות-פיזיות שנעשה בהן שימוש לאחרונה. מטרתו להאיץ את תהליך תרגום הכתובות ולמנוע גישה לטבלת הדפים בזיכרון הראשי בכל פעם.
ביצועים ו-Thrashing: כשלים רבים בדף (High Page Fault Rate) עלולים להוביל למצב של Thrashing, שבו המערכת מבלה את רוב זמנה בהחלפת דפים בין הזיכרון הפיזי לדיסק, במקום לבצע עבודה שימושית. זהו צוואר בקבוק ביצועים קריטי, ובחינות עשויות לדרוש הבנה כיצד לזהות ולפתור מצב זה (למשל, על ידי הגדלת זיכרון פיזי, אופטימיזציה של אלגוריתם החלפת דפים, או הקטנת מספר התהליכים הרצים).
אלגוריתמי החלפת דפים (Page Replacement Algorithms)
- FIFO (First-In, First-Out): הדף שהוכנס ראשון הוא הראשון לצאת. פשוט ליישום, אך לא תמיד יעיל.
- LRU (Least Recently Used): הדף שלא נעשה בו שימוש במשך הזמן הארוך ביותר הוא זה שיוחלף. נחשב לאלגוריתם טוב, אך יקר למימוש.
- Optimal (OPT): מחליף את הדף שלא ייעשה בו שימוש במשך הזמן הארוך ביותר בעתיד. בלתי ניתן למימוש בפועל, אך משמש כבסיס השוואה.
- Clock (Second-Chance): גרסה משופרת של FIFO המשתמשת בביט סימוני שימוש (Reference Bit) כדי לתת לדפים "הזדמנות שנייה" לפני הוצאתם.