זיכרון וירטואלי
זיכרון וירטואלי (באנגלית: Virtual Memory) הוא טכניקה לניהול והקצאה של זיכרון המחשב, המסתירה את הזיכרון הפיזי של המחשב ומדמה זיכרון רציף וגדול, ומפרידה בין ניהול הזיכרון של תהליכים שונים. כל אחת מהתוכניות המתבצעות פועלת כאילו עומד לרשותה מרחב זיכרון בגודל שהיא זקוקה לו, רציף, וללא הפרעות מתהליכים (לא מוזמנים) אחרים.
![](http://up.wiki.x.io/wikipedia/commons/thumb/b/b9/Virtualmem.png/250px-Virtualmem.png)
הרעיון של זיכרון וירטואלי הוא להוסיף עוד רמה של הפשטה בארגון הזיכרון. תהליך המנסה לגשת לזיכרון בכתובת X (כתובת וירטואלית), ייגש בפועל לכתובת מתאימה Y (כתובת פיזית) בזיכרון הראשי של המחשב, או לכתובת Z בזיכרון משני כלשהו, בדרך כלל דיסק קשיח, שהוא זול יותר, ואז המידע המבוקש יישלף משם ויועתק לזיכרון הראשי. תרגום הכתובות מתבצע במקרים רבים בחומרה.
ארבע מטרות מושגות בדרך זו:
- גודל: גלגול האחריות על ניהול מדרג הזיכרון מהתוכנית אל מערכת ההפעלה. ההגבלה על גודל הזיכרון הזמין לתהליך איננה תלויה בגודל הזיכרון הראשי, שהוא מהיר אך יקר יחסית ולכן גם קטן, אלא בפרמטרים אחרים: גודל הדיסק הקשיח (שיכול להגיע לאלפי ג'יגה בייט), גודל המילה (word) במחשב - 32 או 64 ביט בדרך כלל - ושיטת הייצוג והתרגום של כתובות בזיכרון. אם תהליך דורש יותר זיכרון משמוקצה עבורו על הזיכרון הפיזי, יוקצה לו זיכרון על הדיסק. מידע יועבר בין הדיסק הקשיח לזיכרון הראשי לפי הצורך, תוך ניצול העובדה שאף תהליך לא משתמש בכל הזיכרון שהוא ביקש, בכל רגע נתון. בדרך כלל פעולות בזיכרון הן מקומיות - כלומר, קבוצה של פעולות קרובות בזיכרון יתבצעו ככל הנראה בכתובות קרובות.
- רצף: כאשר תהליך מבקש זיכרון רציף (עבור מערכים, למשל), הוא יכול להתייחס לזיכרון וירטואלי רציף, ואין צורך למצוא בזיכרון הראשי רצף של כתובות שאינן בשימוש.
- בידוד בין תהליכים: אם שני תהליכים שאינם משתפים זיכרון מנסים שניהם לגשת לכתובת X, הם ניגשים בפועל לכתובות שונות, אלא אם כן מערכת הזיכרון הווירטואלי (על פי רוב, מערכת ההפעלה) מסיקה שאין בעיה בשיתוף של כתובות פיזיות - אם המידע הדרוש זהה, והגישה היא לקריאה בלבד, או שמדובר במידע שמשותף במפורש בין תהליכים.
- ניהול יעיל יותר של החומרה: זיכרון RAM (על ידי הקטנת שברור), דיסקים קשיחים (על ידי איחוד גישות לסקטורים סמוכים), וזמן עיבוד (על ידי זימון תהליכים בהתאמה למידת הנגישות המיידית של המידע הדרוש להם).
היסטוריה
עריכהארכיטקטורת פון נוימן היא מודל שהציע בשנות ה-40 של המאה ה-20 המתמטיקאי ג'ון פון נוימן למבנהו של המחשב. במודל זה, זיכרון המחשב משמש הן לאחסון התוכנית והן לאחסון הנתונים שתוכנית זו קוראת או כותבת בעת ביצועה על ידי המעבד. מרבית המחשבים בנויים על־פי מודל זה. במימוש המקובל של ארכיטקטורה זו, זיכרון המחשב הוא זיכרון גישה אקראית (RAM).
הצורך בזיכרון גדול יותר, יחד עם מחירו הגבוה של זיכרון RAM הובילו בשנות ה-70 לפתרון של זיכרון וירטואלי, שבו הזיכרון העומד לכאורה לרשות התוכניות המבוצעות גדול משמעותית מהזיכרון הפיזי.
עקרון הפעולה
עריכהזיכרון וירטואלי הוא מרחב זיכרון מדומה העומד לרשות תהליך, והוא גדול מהזיכרון הפיזי המשמש תהליך זה. מרחב הזיכרון הווירטואלי נמצא על אמצעי לאחסון נתונים (כגון דיסק קשיח), והחלקים מתוכו הנחוצים למעבד בזמן נתון מובאים לזיכרון הממשי על ידי מערכת ההפעלה, תוך שהם מחליפים חלקי זיכרון שאין בהם צורך באותו רגע.
ארכיטקטורת x86
עריכהבמעבדים של אינטל, הגישה לזיכרון הווירטואלי נעשית בשיטת דפדוף. כל כתובת זיכרון שאליה ניגש המעבד היא כתובת וירטואלית המורכבת ממקטע (segment) והֵסֶט (offset). תפקיד היחידה לניהול זיכרון (MMU), רכיב חומרה הקיים בדרך כלל במעבד, להפוך את הכתובת הווירטואלית המתבקשת לכתובת פיזית בעת הפנייה לזיכרון.
כאשר המעבד ניגש לקרוא או לכתוב נתון בזיכרון, הוא ניגש לזיכרון RAM של המחשב. אם המידע הרצוי לא קיים ב-RAM, החומרה מפעילה פסיקה הקוראת למערכת ההפעלה, כדי שזו תביא את הנתון הרצוי מהדיסק, קריאה זו נקראת "Page Fault".
על מנת לייעל את המערכת, ולקבל מהירויות גדולות יותר, כאשר מערכת ההפעלה מתבקשת להביא מידע מהדיסק הקשיח, היא מביאה חבילה שלמה של נתונים בגודל של כמה KB (הגודל תלוי במערכת). חבילה זו נקראת דף (Page).
על מנת לפנות מקום לדף החדש, מערכת ההפעלה מעבירה דף אחר, ישן יותר (שלא נמצא בשימוש בזמן האחרון) מה-RAM חזרה אל הדיסק.
תרגום כתובות
עריכהכדי להפוך כתובת וירטואלית לכתובת פיזית, המעבד ניגש אל טבלאות מיוחדות המכונות "טבלאות דפים" שמכילות מידע עבור התרגום. כיוון שלכל תהליך שרץ יש כמות גדולה מאוד של דפים ולרוב רק חלק קטן מהם בשימוש, לרוב בנויה טבלת הדפים במספר רמות כדי לצמצם את כמות הזיכרון שהיא תופסת: הרמה הראשונה מכילה הצבעות על דפי הטבלאות של הרמה השנייה, והרמה השנייה מכילה הצבעות לדפים שמרכיבים את מרחב הזיכרון של התוכנה.
בשל הצורך לבצע תרגום של הכתובות, ומכיוון שטבלאות הדפים שמורות בזיכרון המחשב, כל גישה לזיכרון הווירטואלי דורשת מספר גישות לזיכרון הפיזי - גישה אחת או יותר אל טבלאות הדפים כדי למצוא את הכתובת הפיזית, וגישה אחרונה לכתובת הפיזית עצמה כדי להביא את הנתון המבוקש. כדי לצמצם את העלות הגבוהה של גישה לזיכרון, מעבדים מודרניים מכילים רכיב מטמון מהיר בשם TLB (Translation Lookaside Buffer) על המעבד עצמו שמכיל כמות מסוימת של תרגומי כתובות שהתבצעו לאחרונה, וכל בקשה לתרגום כתובת מחפשת ראשית את התרגום ברכיב זה, מה שמהיר פי כמה מגישות לזיכרון. חסרונו של ה-TLB הוא בגודלו הקטן יחסית.