יחידת ניהול זיכרון

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

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

זיכרון וירטואלי

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

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

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

מימוש

ישנם שלושה מימושים לניהול טבלת המיפוי:
באמצעות מערך פנימי - בתוך יחידת הניהול ישנו מערך של אוגרים מהירים שמספרו הסידורי של כל אחד מהם מסמל את הכתובת הווירטואלית של הדף ובתוכו יש את הכתובת הפיזית אם קיימת. היתרון בשיטה הוא מהירות הגישה לאוגר בודד היא מאוד גבוהה. החסרונות הם עלות גבוהה לכמות גדולה של אוגרים וצורך להחליף את כל התוכן שבתוך המערך כל פעם שמבוצעת החלפת הקשר מה שמבזבז הרבה זמן, בגלל חסרונות אלו מימוש זה אינו בשימוש רב.
באמצעות מערך חיצוני - בזיכרון הפיזי נמצאים מספר מערכים שכל אחד מהם ממפה בין זיכרון וירטואלי של תהליך כלשהו לבין הזיכרון הפיזי שלו, וביחידת הניהול נמצא אוגר בודד שמפנה לתחילת המערך של התהליך הנוכחי, בצורה זו בפעולת החלפת הקשר ישנו צורך לשנות רק אוגר בודד ביחידת הניהול כדי שיצביע על המערך הנוכחי. כדי להתגבר על הבעיה שכל קריאה לזיכרון תדרוש בעצם גם קריאה לזיכרון כדי לקבל את מיקום הדף וגם קריאה לזיכרון עצמו לאחר מכן, נמצא ביחידת הניהול זיכרון מטמון שנקרא TLB, ראשי תיבות של Translation Look-aside Buffer, שמכיל מיפוי למספר מועט של דפים, ובכל בקשה שמגיעה ליחידת הניהול תחילה מבוצעת סריקה מקבילית על האוגרים שבזיכרון המטמון ורק אם הדף לא נמצא שם תתבצע שאילתה לזיכרון לגבי מיקום הדף ומיקום זה יחליף במטמון דף אחר שלא היה בשימוש לאחרונה.
באמצעות מערך חיצוני שמנוהל על ידי מערכת ההפעלה - גישה זו זהה לקודמת אך במקום שיחידת הניהול תקבל TLB fault ותיגש לזיכרון הפיזי, מערכת ההפעלה עושה זאת ועובדת ישירות מול ה - TLB. גישה זו אמנם יותר איטית מהגישה הקודמת אך תופסת פחות מקום פיזי על המעבד, מה שמפנה מקום לדברים אחרים. מימוש זה מקובל במעבדי RISC.

דוגמה
בקטע תוכנה המתכנת הגדיר משתנה וכינה אותו בשם X. טיפוס המשתנה X הוא מספר שלם בגודל שני בתים, שבו מספר. המהדר קבע שמשתנה זה יישמר בתחום שבין 0E00:0030 עד 0E00:0031. בהנחה שגודל דף הוא 4 ק"ב (0000:1000), יחידת ניהול הזיכרון ממפה בין 0E000 לבין המיקום בו הדף נמצא בפועל בזיכרון הפיזי, נניח 00A00 ושמה את המספר בכתובת 00A0:0030 ו - 00A0:0031.

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

לקריאה נוספת

modern operating systems third edition,  Andrew S. Tanenbaum  עמודים 189-198.

מקבץ סרטונים קצרים שמסבירים את הנושא בצורה טובה: https://www.youtube.com/watch?v=qcBIvnQt0Bw

קישורים חיצוניים

הערות שוליים 

חומרה
זיכרון מחשב