Download presentation
Presentation is loading. Please wait.
1
מערכות הפעלה תרגול 12 – ניהול זיכרון ב-Linux : המשך
2
מערכות הפעלה - תרגול 122 (c) ארז חדד 2003 תוכן התרגול (1) טבלת המסגרות מטמון הדפים למה יש בו צורך ? איך דפים מגיעים למטמון ? שדות ומבנים במטמון הדפים דוגמה פינוי דפים דירוג פעילות של דפים בזיכרון פינוי בפועל של זיכרון פינוי דפים ממרחבי זיכרון
3
מערכות הפעלה - תרגול 123 (c) ארז חדד 2003 טבלת המסגרות ב-Linux גרעין Linux מחזיק מערך עם כניסה לכל מסגרת בזיכרון הראשי של המחשב המערך נקרא mem_map וכל כניסה היא מסוג struct page קובץ גרעין include/linux/mm.h מספר שדות חשובים בכל כניסה: count – מונה שימוש (reference counter) של הדף שבמסגרת: כמה מרחבי זיכרון מצביעים לדף זה כשהוא בזיכרון. אם ערך המונה הוא 0, המסגרת פנויה mapping, index, next_hash, pprev_hash – משמשים במטמון הדפים, כפי שנראה מיד lru – משמש למנגנון פינוי הדפים. פרטים בהמשך flags – דגלים המתארים את מצב הדף שבמסגרת, כגון: PG_locked – מציין שהמסגרת נעולה עקב פעולת פינוי/הבאת דף שעדיין לא הסתיימה PG_referenced, PG_active, PG_lru, PG_dirty– משמשים למנגנון פינוי הדפים. פרטים בהמשך
4
מערכות הפעלה - תרגול 124 (c) ארז חדד 2003 indexmappingpprev_ hash next_ hash lruflagscountמספר מסגרת.. NULL RD--1295.. ALD45439.. NULL --011234.. NULL LDR145442.. LR293421.. דיסקים מאגר דפדוף swap1מאגר דפדוף swap2 קובץ /bin/lsקובץ /home/eli/file1 מטמון הדפדוף טבלת המסגרות מסגרת גרעין אוביקט ניהול קובץ flags: R - PG_referenced D - PG_dirty A - PG_active L - PG_lru
5
מערכות הפעלה - תרגול 125 (c) ארז חדד 2003 מטמון הדפים – למה יש בו צורך? נסתכל על המצב האפשרי הבא: דף,השייך למרחב הזיכרון של תהליך מסוים, מפונה. לפני שהפינוי הסתיים, התהליך מנסה לגשת לאותו דף. מתי נסמן שהדף לא בזיכרון? (present = 0 בטבלת הדפים) 1. אם לפני הפינוי בפועל, ואז כשמחליטים לפנות דף קודם כל מסמנים אותו ע“י present = 0. התהליך מנסה לגשת לדף, מגלה ש present = 0, ניגש לזיכרון המשני לפי הכתובת במאגר הדפדוף. המערכת עוד לא הספיקה לכתוב את הדף למאגר הדפדוף => הדף שנקרא ע“י התהליך לא נכון (נתונים לא מעודכנים ואף יתכן זבל) 2. אם אחרי הפינוי בפועל, ואז מתחילים לפנות את הדף. התהליך ניגש לדף, הpresent = 1 עדיין. הדף פונה ודף אחר נטען לאותה מסגרת התהליך ניגש למסגרת המצוינת בטבלת הדפים => גישה לא חוקית !
6
מערכות הפעלה - תרגול 126 (c) ארז חדד 2003 מטמון הדפים נדרש מנגנון שינהל את פינוי והבאה של דפים מ/לזיכרון הראשי! מטמון הדפים (Page Cache) הוא המנגנון המרכזי לטעינת ופינוי דפים בין הזיכרון לדיסק ב-Linux. כל דף של מרחב הזיכרון של תהליך מפונה תמיד דרך מטמון הדפים. מטמון הדפים ממומש כחלק מטבלת המסגרות.
7
מערכות הפעלה - תרגול 127 (c) ארז חדד 2003 מטמון הדפים – מיפוי דף לזיכרון משני דף יכול להכיל סוגים שונים של מידע: קטע של קובץ: קוד מתוכנית טעונה, נתונים מקובץ נתונים דף כזה נקרא ממופה לקובץ (file mapped) – מפונה לקובץ ממנו נטען דף זיכרון של תהליך שנשמר בדיסק במאגר דפדוף כלשהו (swap area) דף כזה נקרא ממופה אנונימי (anonymous mapped)- מפונה למאגר דפדוף. שדה mapping ברשומת מסגרת של דף במטמון הדפים, מצביע לאובייקט ניהול המכיל מידע ופונקציות לטיפול בדף שבמסגרת (פינוי וטעינה) לפי סוג המיפוי שלו (ממופה לקובץ, או אנונימי) שדה index ברשומת מסגרת כל דף במטמון הדפים מציין את המיקום הפיזי של הדף במאגר המידע בדיסק עבור מידע מקובץ, את ההיסט מתחילת הקובץ (offset) עבור דף מזיכרון תהליך, את מזהה המגירה
8
מערכות הפעלה - תרגול 128 (c) ארז חדד 2003 מטמון הדפים – hash table מטמון הדפים מכיל hash table המתרגם צירוף של (mapping+index) לכתובת מסגרת (אם יש כזו) המכילה את הדף במיקום index של האובייקט mapping. כל המסגרות שמתאימות לאותו hash מקושרות ברשימה כפולה מעגלית דרך השדות next_hash ו-pprev_hash ברשומת המסגרת. ל-hash table יש תפקיד מרכזי במנגנון הדפדוף, כפי שנראה בהמשך הפונקציות/מאקרו הבאות, המוגדרות בקבצי הגרעין mm/filemap.c ו- include/linux/pagemap.h, קשורות ל-hash table: page_hash() – פונקצית ה-hash find_get_page() – מקבלת mapping+index ומחזירה מצביע למסגרת המכילה את הדף המתאים (או NULL אם אין) add_to_page_cache() – הוספת מסגרת + מיקום בדיסק (במגירה או בקובץ) למטמון וכך גם ל-hash-table
9
מערכות הפעלה - תרגול 129 (c) ארז חדד 2003 מטמון הדפים – מוני שימוש מבחינת מונה השימוש של מסגרת (שדה count) או מגירה (מונה swap_map), מטמון הדפים נחשב כמרחב זיכרון נפרד המשתמש בדף המאוחסן בה כאשר מסגרת או מגירה בשימוש מטמון הדפים, מוגדל המונה ב-1. הקטנת המונה ב-1 מבוצעת עם ניתוק המסגרת או המגירה מהמטמון המטרה: למנוע שיבוש במיפוי ה-hash-table באמצעות הקצאה מחדש של המסגרת/מגירה עד להוצאת הדף מהמטמון
10
מערכות הפעלה - תרגול 1210 (c) ארז חדד 2003 הקשר בין מסגרת למגירה הקשר בין מסגרת ומגירה, המכילות את אותו דף ממופה אנונימי, הינו דינמי: דף המצוי במגירה יכול להיטען לכל מסגרת פנויה שתוקצה בעת הצורך דף מפונה למגירה בדיסק (והמסגרת מתפנה) רק לאחר שכל מרחבי הזיכרון השותפים בו מצביעים על המגירה בדיסק – והקשר הקיים בין המסגרת למגירה ניתן לניתוק Linux מאפשרת קישור דינמי גם בכיוון ההפוך: לאחר שדף נטען לזיכרון וכל מרחבי הזיכרון מצביעים למסגרת, הגרעין בוחר במקרים מסוימים לשחרר את המגירה ולנתק את הקשר הקיים לפני שכותבים דף לדיסק, מקצים לו מגירה חדשה אם אין לו מטמון הדפים מחזיק את הקשר בין המגירה והמסגרת של אותו דף ממופה אנונימי, כל עוד קשר זה מתקיים (ומסמן בכך את קיום הקשר) כאשר הקשר ניתק, המסגרת מוצאת ממטמון הדפים ..וגם המגירה (מונה השיתוף של המגירה מוקטן)
11
מערכות הפעלה - תרגול 1211 (c) ארז חדד 2003 מטמון הדפים – שלבי פינוי דף מטמון הדפים מצביע למסגרת בזיכרון הראשי, בתוכה נמצא הדף (ה-count של המסגרת מוגדל ב- 1) מוקצית מגרה במאגר הדפדוף שעליה יעבר הדף שמפונה המטמון מצביע גם למגרה שהוקצתה במאגר הדפדוף הדף נכתב למגרה במאגר הדפדוף. באופן סימטרי מבוצעת גם הבאת דף ממאגר הדפדוף לזיכרון הראשי.
12
מערכות הפעלה - תרגול 1212 (c) ארז חדד 2003 מטמון הדפים – דוגמה(1) הרלוונטיות של מטמון הדפים גדלה עוד יותר כאשר קיים שיתוף של דף ע“י מספר תהליכים. בתרשים בהמשך מוצגת דוגמה לתהליך פינוי דף ממופה אנונימי למסגרת S1 ו-S2 הם שני מרחבי זיכרון שלהם דף משותף P, המצוי בתחילה (שלב 1) במסגרת בזיכרון. PC הינו מטמון הדפים. הערך הכתוב בתרשים במשבצת של המסגרת של P ושל המגירה של P בכל השלבים הינו מונה השיתוף (count או swap_map)
13
מערכות הפעלה - תרגול 1213 (c) ארז חדד 2003 מטמון הדפים – דוגמה(2) במסגרת פינוי דפים, מבוצע מעבר על הטבלאות של S1 והגרעין מחליט לפנות את P לדיסק (שלב 2): הדף P אינו במטמון הדפים (שדה mapping במסגרת מצביע על NULL) ולכן: 1. מוקצית מגירה עבור P 2. המסגרת והמגירה של P מקושרות למטמון הדפים (עדכון מוני השיתוף, עדכון mapping ו-index במסגרת) 3. הטבלה ב-S1 עוברת להצביע על המגירה של P (מזהה המגירה מוצב בטבלה, עדכון מוני השיתוף) P עדיין לא מפונה פיזית מהזיכרון! בהמשך, מבוצע מעבר גם על הטבלאות של S2 ושוב הגרעין מחליט לפנות את P לדיסק (שלב 3): כעת, הדף P כבר במטמון הדפים ולכן: 1. הטבלה ב-S2 עוברת להצביע על המגירה של P (ומעדכנים מוני שיתוף) P עדיין לא מפונה פיזית מהזיכרון!
14
מערכות הפעלה - תרגול 1214 (c) ארז חדד 2003 מטמון הדפים – דוגמה(3) מאוחר יותר (שלב 4), מתבצע פינוי פיזי של הדף P, לאחר שהמסגרת כבר לא משמשת מרחבי זיכרון של תהליכים: 1. תוכן המסגרת נכתב לדיסק 2. המסגרת מוצאת ממטמון הדפים ומסומנת כפנויה (עדכון mapping, מונה השיתוף) 3. המגירה מוצאת אף היא ממטמון הדפים (עדכון מונה השיתוף)
15
מערכות הפעלה - תרגול 1215 (c) ארז חדד 2003 2 S1 S2 PC מאגר דפדוף זיכרון ראשי 1 P 2 S1 S2 PC מאגר דפדוף זיכרון ראשי 2 P 2 P 1 S1 S2 PC מאגר דפדוף זיכרון ראשי 3 P 3 P S1 S2 PC מאגר דפדוף זיכרון ראשי 4 2 P
16
מערכות הפעלה - תרגול 1216 (c) ארז חדד 2003 מטמון הדפים – סיכום דוגמה ראינו בדוגמה זו כיצד מאפשר מטמון הדפים פעולה הדרגתית של פינוי דף, ממרחב זיכרון אחד בכל פעם, תוך שמירה על תיאום בין מרחבי הזיכרון המשתמשים בדף. אין צורך לעדכן את כל טבלאות הדפים המתייחסות לאותו דף בבת אחת ניתן לדחות את פעולת הפינוי הפיזי ככל הרצוי אם בשלב כלשהו תהליך ניגש לדף, שמבחינתו נמצא בזיכרון המשני, אך בפועל נמצא עדיין בזיכרון הראשי: לא יהיה צורך להביא את הדף מהזיכרון המשני,אלה התהליך יקבל את מספר המסגרת תוך שימוש ב-hash של מטמון הדפים ( ע"י שימוש בפונקציה find_get_page() ). מצב זה נקרא Minor Page Fault. (אפשרי בשלבים 2,3 בדוגמה) הדף מפונה פיזית פעם אחת, ולמקום אחד בדיסק
17
מערכות הפעלה - תרגול 1217 (c) ארז חדד 2003 מטמון הדפים – טעינת דף בטעינת דף מתבצעות הפעולות בסדר הפוך בקירוב, תוך שימוש במטמון הדפים בטעינת דף למרחב זיכרון מסוים, בודקים אם הדף כבר נטען למסגרת בזיכרון באמצעות find_get_page(): אם כן, רק מעדכנים את טבלת הדפים ומוני השיתוף אחרת, טוענים את הדף לזיכרון ומכניסים אותו למטמון הדפים גם טעינת דף משותף מתבצעת בצורה הדרגתית תוך שמירה על תיאום בין התהליכים הדף נטען פעם אחת בלבד ולמסגרת אחת בלבד
18
מערכות הפעלה - תרגול 1218 (c) ארז חדד 2003 פינוי דפים ב-Linux פינוי דפים מהזיכרון לדיסק הינו מנגנון בעל שלושה מרכיבים : דירוג דינמי של רמת הפעילות של כל דף במסגרת בזיכרון (שאינו שייך לגרעין) כאשר עולה הצורך בפינוי בפועל של זיכרון: מעבר על רשימת המסגרות בעלות ה"פעילות הנמוכה ביותר" ופינוי בפועל של המסגרות שאינן בשימוש מרחבי זיכרון של תהליכים אם הגרעין מעריך שצריך לפנות דפים נוספים: מעבר על טבלאות הדפים של כל מרחבי הזיכרון של תהליכי משתמש: כאשר מאותרת כניסה השייכת לאזור זיכרון ומצביעה למסגרת הניתנת לפינוי ובעלת פעילות "נמוכה", מבוצע פינוי של הדף ממרחב הזיכרון הנבדק פינוי דף ממרחב זיכרון יחיד, בהתאם לשיטה שהודגמה קודם
19
מערכות הפעלה - תרגול 1219 (c) ארז חדד 2003 דירוג פעילות של דפים בזיכרון (1) הגרעין מחזיק שתי רשימות מקושרות כפולות מעגליות של רשומות מסגרות במטמון הדפים: active_list – רשימת מסגרות הדפים ה"פעילים", כלומר דפים שניגשו אליהם "לאחרונה" inactive_list – רשימת מסגרות הדפים ה"לא-פעילים", כלומר דפים שלא ניגשו אליהם "זמן מה" active_list, inactive_list הם שמות המשתנים הגלובליים המצביעים לראשי הרשימות, המוגדרים בקובץ הגרעין mm/page_alloc.c הרשימות לא-חופפות, ורשומת כל מסגרת הניתנת לפינוי מקושרת לאחת הרשימות מסגרות (הרשומות שלהן) מועברות בין הרשימות כפי שנראה בהמשך מסגרת מוספת לרשימה דרך ראש הרשימה
20
מערכות הפעלה - תרגול 1220 (c) ארז חדד 2003 דירוג פעילות של דפים בזיכרון (2) הדגל PG_lru דולק ברשומת מסגרת הנמצאת באחת מהרשימות (לא מסגרת השייכת לגרעין, למשל) הקישור של מסגרת לאחת הרשימות הוא באמצעות השדה lru ברשומת המסגרת הדגל PG_active דולק רק בכל רשומת מסגרת השייכת לרשימה active_list הדגל PG_referenced ברשומת מסגרת מציין שבוצעה גישה לדף במסגרת זו. דגל זה משמש ליצירת שתי הזדמנויות למסגרת להישאר ב-active_list אבל גם שתי מדרגות למסגרת על-מנת להיכנס ל-active_list מתוך ה- inactive_list.
21
מערכות הפעלה - תרגול 1221 (c) ארז חדד 2003 דירוג פעילות של דפים בזיכרון (3) הפונקציה mark_page_accessed(), המופעלת לציון גישה למסגרת. מבצעת כדלקמן: אם המסגרת ב-active_list או PG_referenced כבוי, מדליקה את PG_referenced. אחרת, מכבה את PG_referenced ומכניסה את המסגרת מחדש ל-active_list קובץ גרעין mm/filemap.c הפונקציה refill_inactive(), המופעלת רק במקרה שיש צורך לפנות דפים, מעדכנת את inactive_list. עוברת על כל המסגרות ב-active_list מסוף הרשימה (מסגרות ותיקות ביותר): אם PG_referenced דלוק, מכבה אותו ומכניסה את המסגרת מחדש ל- active_list. אחרת, מעבירה את המסגרת ל-inactive_list עם דגל PG_referenced דולק קובץ גרעין mm/vmscan.c
22
מערכות הפעלה - תרגול 1222 (c) ארז חדד 2003 דירוג פעילות של דפים בזיכרון (4) פינוי בפועל של דפים ממסגרות מבוצע החל מסוף רשימת ה- inactive_list המסגרות הכי "לא פעילות" הפונקציה mark_page_accessed() מופעלת עבור דף כלשהו במקרים הבאים: בכל פעם שהדף נטען מהדיסק בכל פעם שהגרעין סורק את טבלאות הדפים כדי לפנות דפים ומגלה שביט accessed של הדף בטבלת הדפים דלוק (אז גם הביט accessed מכובה) הפונקציה refill_inactive() מופעלת כאשר יש צורך לפנות דפים, כפי שנראה בהמשך האלגוריתם המתקבל הוא קירוב ל-LRU: "אלגוריתם ההזדמנות השלישית" PG_referenced=1 PG_active=0 PG_referenced=0 PG_active=1 PG_referenced=1 PG_active=1 add_to_page_cache() refill_inactive() mark_page_accessed() PG_referenced=0 PG_active=0
23
מערכות הפעלה - תרגול 1223 (c) ארז חדד 2003 פינוי בפועל של זיכרון (1) כפי שכבר הוזכר קודם, פינוי בפועל של מסגרות ב-Linux מתבצע כפעולה של חוסר ברירה Linux נוטה לנצל את הזיכרון הראשי ככל האפשר מבלי לפנות דפים כלל מוגדר סף "קריטיות" threshold)) של כמות מינימלית של מסגרות שחייבת להישאר פנויה. הסיבות להגדרת הסף : לצורך הפעלת אלגוריתמים של פינוי זיכרון ישנו צורך במספר מסגרות פנויות. כמו כן, זה מקטין את זמן הטיפול ב-page fault שמצריך טעינת דף מהזיכרון המשני, כי אין צורך לפנות מסגרת אלה רק לטעון דף למסגרת פנויה. מוגדר גם סף עליון, שמעבר לו אין צורך לבצע פינוי מסגרות. פונקצית הפינוי תמיד תנסה להגיע לסף העליון כדי למנוע סחרור – thrashing.
24
מערכות הפעלה - תרגול 1224 (c) ארז חדד 2003 פינוי בפועל של זיכרון (2) מנגנון הפינוי, הקרוי מנגנון מחזור מסגרות (Page Frame Reclaiming), מופעל בקריאה לפונקציה try_to_free_pages() כל פונקציות פינוי המסגרות מוגדרות בקובץ הגרעין mm/vmscan.c הפעלת הפונקציה try_to_free_pages() מבוצעת במקרים הבאים: במקרה שחו חוט גרעין מיוחד הקרוי kswapd (או "swapper"), מגלה שכמות המסגרות הפנויות קטנה/שווה לסף הנמוך. swapper (pid=0) רץ בעדיפות נמוכה ומנצל לפיכך את ה-idle time (זמן ללא פעילות תהליכים) לפעולות פינוי הזיכרון, מה שמשפר את ביצועי המערכת. כאשר הקצאת מסגרת חדשה נכשלת (בעקבות הגעה לסף הקריטי) מתבצעת הפעלה ישירה של הפונקציה או שמעירים את kswapd הפונקציה try_to_free_pages() מנסה לפנות SWAP_CLUSTER_MAX (32) מסגרות בזיכרון.
25
מערכות הפעלה - תרגול 1225 (c) ארז חדד 2003 פינוי בפועל של זיכרון (3) הטקטיקה לשחרור מסגרות היא כדלקמן: מבוצעות מספר איטרציות של ניסיונות שחרור מסגרות בכל איטרציה: מנסים לשחרר מסגרות ע"י קריאה לפונקציות לצמצום מטמונים שונים (פרט למטמון הדפים) קוראים ל-refill_inactive() על-מנת להגדיל את ה-inactive_list מבצעים סריקה של ה-inactive_list מהסוף (קריאה ל- shrink_cache()) ובה: משחררים מסגרות הנמצאות בשימוש מטמון הדפים בלבד (mapping != NULL, count == 1) מסגרת המכילה דף מלוכלך, כלומר שעבר עדכון (דגל PG_dirty דולק), נכתבת לדיסק לפני פינויה.
26
מערכות הפעלה - תרגול 1226 (c) ארז חדד 2003 פינוי דפים ממרחבי זיכרון (1) אם במהלך סריקת המסגרות ב-inactive_list נספרות "יותר מדי" (מעבר לסף מוגדר) מסגרות המסומנות בשימוש ע"י תהליכים (count > 1) ו/או שאינן במטמון הדפים (mapping == NULL), מופסקת הסריקה ומופעלת הפונקציה swap_out() לפינוי דפים ממרחבי זיכרון. הפונקציה swap_out() מנסה לפנות דפים ממרחבי זיכרון הטעונים למסגרות. המטרה: להביא את המסגרות למצב פנוי (count == 0) או שהן בשימוש מטמון הדפים בלבד (count == 1, mapping != NULL) – מסגרות "לפני שחרור" הפונקציה מסיימת אם היא מצליחה להביא SWAP_CLUSTER_MAX מסגרות למצב הרצוי או אם היא סרקה מתארי זיכרון בכמות שהייתה כשהתחילה לרוץ.
27
מערכות הפעלה - תרגול 1227 (c) ארז חדד 2003 פינוי דפים ממרחבי זיכרון (2) פעולת הפונקציה swap_out() היא לסרוק את כל טבלאות הדפים הממפות את כל אזורי הזיכרון בכל מרחבי הזיכרון במערכת (עד לכמות הנסרקת), ולכל כניסה המצביעה למסגרת בזיכרון, מבוצעות הפעולות הבאות (המוגדרות בפונקציה try_to_swap_out()): אם הביט accessed בכניסה בטבלה דלוק, קוראת ל- mark_page_accessed() עבור המסגרת ומכבה את הביט ועוברת למסגרת הבאה. הדף במסגרת ניתן לפינוי אם מתקיימים כל התנאים הבאים: אזור הזיכרון המכיל את הדף ניתן לפינוי (דגל VM_LOCKED במתאר אזור הזיכרון כבוי) המסגרת לא ב-active_list (דגל PG_active כבוי)
28
מערכות הפעלה - תרגול 1228 (c) ארז חדד 2003 פינוי דפים ממרחבי זיכרון (3) אם הדף ניתן לפינוי, מתבצע כדלקמן: 1. אם הדגל dirty בכניסה בטבלת הדפים דלוק, מודלק דגל PG_dirty ברשומת המסגרת לציון דף "מלוכלך" (מעודכן) שיש לכתבו לדיסק לפני פינויו 2. מבוצע פינוי של הדף ממרחב הזיכרון תוך שימוש במטמון הדפים (כפי שהוסבר קודם): 1. אם הדף "מלוכלך" (PG_dirty דלוק), הדף צריך להתפנות לדיסק: אם הדף לא במטמון הדפים, הוא מוכנס למטמון הדפים: הקצאת מגירה אם ממופה אנונימי, עדכון mapping, index 2. עדכון מוני שיתוף במסגרת ו(אם צריך) במגירה 3. עדכון הכניסה בטבלת הדפים: מזהה מגירה למיפוי אנונימי, NULL למיפוי לקובץ דף מיפוי אנונימי "בתול" לא עודכן מעולם (PG_dirty כבוי) ולכן מכיל אפסים בלבד. עבור דף כזה, מוכנס NULL לכניסה בטבלת הדפים. כשדף זה יידרש שוב, יוחזר דף עם אפסים.
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.