590 likes | 967 Views
מערכות הפעלה. תרגול 7 – יצירת תהליכים בדומה לנעשה ב- LINUX וניהול זכרון. מה בתכנית?. פונקציות אתחול של תהליך ניהול זיכרון ב- XINU דוגמה לניהול זיכרון - BestFit. יצירת תהליכים. התחול מהרשומה של התהליך החדש (שינויים ב- PROCTAB ). העברת הפרמטרים המיועדים לפונקציה של התהליך החדש.
E N D
מערכות הפעלה תרגול 7 – יצירת תהליכים בדומה לנעשה ב-LINUX וניהול זכרון
מה בתכנית? • פונקציות אתחול של תהליך • ניהול זיכרון ב-XINU • דוגמה לניהול זיכרון - BestFit מערכות הפעלה - תרגול 7
יצירת תהליכים • התחול מהרשומה של התהליך החדש (שינויים ב- PROCTAB). • העברת הפרמטרים המיועדים לפונקציה של התהליך החדש. • הכנת התהליך החדש לסיום. • הכנת התהליך לקבלת שליטה ממנגנון החלפת תהליכים. מערכות הפעלה - תרגול 7
מתחזה ל-ctxsw <di> SP <si> ctxsw stack operations INITF BP <bp> procaddr calls to ctxsw without parameters procaddr INITRET INITRET calls to procaddr with args args מערכות הפעלה - תרגול 9
יצירת תהליך חדש – newpid() מערכות הפעלה - תרגול 9
דוגמה – xexecl, xfork • ממשו קריאות xexecl (xexecl, xexecl2) ו-xfork שמדמות קריאות דומות ב-UNIX • ניזכר במשמעות הקריאות מערכות הפעלה - תרגול 9
קריאת מערכת fork ב-UNIX • קריאת המערכת fork() pid_t fork(); • פעולה: מעתיקה את תהליך האב לתהליך הבן וחוזרת בשני התהליכים status = fork(); if (status < 0) // fork() failed – handle error (e.g. message & exit) if (status == 0) // son process – do son code else // father process – do father code מערכות הפעלה - תרגול 9
הרצת תכנית אחרת ב-UNIX • קריאת המערכת execl() • תחביר: int execl(const char *filename, const char * arg, …); • פעולה: טוענת תכנית חדשה לביצוע על-ידי התהליך הקורא • דוגמה main() { • execl(“/bin/date”, “date”, NULL); printf(“hello”); } מערכות הפעלה - תרגול 9
xexecl • אין צורך בכניסה חדשה בטבלת התהליכים • לא צריך זיכרון נוסף • מבצעים create על תהליך עצמו: • עדכון פרמטר, INITRET והמצביע על הקוד לערכים של תכנית חדשה • עדכון תוכן להחלפת התהליכים • קריאה -ctxsw מערכות הפעלה - תרגול 9
xexecl מערכות הפעלה - תרגול 9
- xexeclמצב המחסנית המדמה ctxsw Low Addr pptr->pbase SP1 עבור SI, DI INITF עבור BP PF INITRET PARAM pptr->pbase + pptr->plen High Addr מערכות הפעלה - תרגול 9
xexecl מערכות הפעלה - תרגול 9
xexecl מערכות הפעלה - תרגול 9
xexecl מערכות הפעלה - תרגול 9
xexecl2 • לולאה שמעתיקה מספר לא קבוע של פרמטרים מהנקודה הפעילה של מחסנית אל התחתית • יתר הפרטים כמו ב-xexecl מערכות הפעלה - תרגול 9
xexec2 מערכות הפעלה - תרגול 9
Low Addr xexec2 SP עבור SI, DI INITF עבור BP PF INITRET PARAM1 … PARAMn High Addr מערכות הפעלה - תרגול 9
xexecl2 מערכות הפעלה - תרגול 9
xexec2 מערכות הפעלה - תרגול 9
xexec2 מערכות הפעלה - תרגול 9
xexec2 מערכות הפעלה - תרגול 9
xfork • חיקוי XINU לקריאת fork • מייצרים תהליך חדש עבור תהליך הבן • מעתיקים תוכן המחסנית מתהליך האב אל תהליך הבן • מחשבים מצביע הקוד עבור תהליך הבן • מסמלצים קריאה ל-ctxsw • מחזירים pid של תהליך חדש לאב או 0 לבן מערכות הפעלה - תרגול 9
retip – חישוב כתובת חזרה מערכות הפעלה - תרגול 9
xfork מערכות הפעלה - תרגול 9
xfork הכנת מחסנית עדכון bp עבור xmain הרצת תהליך הבן מערכות הפעלה - תרגול 9
שאלות שצריך לשאול • האם צריך ליצור תהליך חדש עם pid חדש או מספיק לשנות תהליך קיים? • האם צריך להקצות מחסנית נוספת? • מה המחסנית אמורה להכיל? • איך התהליך יחזור מהקריאה? • האם דרושים משתנים נוספים כדי לבצע את המשימה? מערכות הפעלה - תרגול 9
kill() • kill(pid) מסיימת את פעולתו של תהליך pid • בנוסף kill נקראת באופן אוטומטי בסיום קוד התהליך • היא משחררת את: • המחסנית של התהליך • רשומת התהליך בטבלת התהליכים • הוצאת רשומת התהליך מהתור בו היא נמצאת • עדכונים ספציפיים למצב התהליך. למשל, אם תהליך מחכה לסמפור : הגדלת המונה ב-1 • במקרה של סיום התהליך הנוכחי – ביצוע resched • סיום ריצת XINU כשמסתיימים כל התהליכים כולל תהליכי מערכת ההפעלה מערכות הפעלה - תרגול 2
סיום התהליך – userret () מערכות הפעלה - תרגול 9
מנהל זיכרון - XINU • מעקב אחרי שטחי זכרון פנויים • הקצאת זיכרון עבור מערכת ההפעלה • הקצעת זכרון עבור האפליקציות • שחרור המחסנית של התהליך שחדל להתקיים • אין מנגנוני הגנה או מנגנוני תמיכה בזיכרון הוירטואלי • המימוש פשוט ומינימלי (מערכת הפעלה לימודית) מערכות הפעלה - תרגול 7
השטח הדינמי השטח שבשימוש על ידי XINU סגמנט המידע שטח סטטי שטח דינמי שטח שמור השטח בשימוש של XINU שטח גלובלי שטח ש-XINU ויתר עליו end maxaddr מערכות הפעלה - תרגול 7
רשימת הפנויים • memlist– רשימת הבלוקים הפנויים • רשימה מקושרת של בלוקים פנויים המוכנים להקצאה • הראש נמצא בבלוק גלובלי • האיברים הם בלוקים פנויים עצמם • ממוינת לפי כתובת ההתחלה של בלוק (לצורך מיזוג) מערכות הפעלה - תרגול 7
רשימת הפנויים • כל השטחים, המוקצים והפנויים, נמצאים בכתובות שהן כפולות של 4 ואורכם כפולות של 4 • שטחים מוקצים לא יופיעו ברשימה • שני שטחים פנויים רצופים לא יופיעו ברשימה • כאשר מבקשים הקצאת שטח זכרון שאינו כפולה של 4 בתים, יוקצה השטח באורך של הכפולה הבאה של 4 (12 בתים במקום 9) • הרשימה מאותחלת על ידי בלוק אחד בגודל כל שטח הזכרון להקצאה מערכות הפעלה - תרגול 7
רשימת הפנויים memlist מערכות הפעלה - תרגול 7
מדיניות הקצאת זכרון • מדיניות First Fit • ההקצאה מתבצעת אם קיים בלוק פנוי בגודל המתאים • הבלוק המתאים הראשון ברשימה נבחר להקצאה • אינו מממש Best Fit – סריקה של כל הבלוקים להתאמה טובה יותר • לא בודק האם יש הרעבה של תהליכים אחרים על ידי תהליך מסויים בשימוש בזכרון מערכות הפעלה - תרגול 7
מבני נתונים – mem.h מערכות הפעלה - תרגול 7
קריאות מערכת הפעלה • הקצאת זכרון char* getmem(int nbytes) • שחרור זכרון freemem(char* block, int size) מערכות הפעלה - תרגול 7
getmem() – getmem.c מערכות הפעלה - תרגול 7
getmem() – getmem.c • גודל הבלוק מחושב ככפולה של 4 • השיגרה עוברת על רשימת הפנויים • אם גודל הבלוק הפנוי גדול או שווה לגודל הנדרש הבלוק מוקצה • אם גודל הבלוק הפנוי עולה על הנדרש בלוק פנוי חדש בגודל ההפרש נוצר ברשימת הפנויים מערכות הפעלה - תרגול 7
freemem() –freemem.c מערכות הפעלה - תרגול 7
freemem() – freemem.c • מעדכנים את גודל הבלוק ואת כתובת הבלוק להיות כפולה של 4 • בודקים את גבולות הזכרון המותר בסגמנט • מחפשים מיקום מתאים לבלוק המשתחרר ברשימת הפנויים על פי כתובת הבלוק maxaddr end שטח סטטי שטח דינמי שטח שמור block > maxaddr block < end מערכות הפעלה - תרגול 7
freemem() –freemem.c מערכות הפעלה - תרגול 7
freemem() – freemem.c • בודקים תקינות הבלוק • אם הבלוק לא תקין מחזירים שגיאה • מוסיפים בלוק פנוי לרשימה • מנסים לאחד את הבלוק החדש עם בלוקים פנויים נוספים אם זה אפשרי מערכות הפעלה - תרגול 7
freemem() – בדיקת תקינות q top p q->mlen block < q + q->mlen מערכות הפעלה - תרגול 7
freemem() – בדיקת תקינות q p block + size > p מערכות הפעלה - תרגול 7
freemem() – בדיקת שילוב p q top q->mlen size block p q q->mlen size block מערכות הפעלה - תרגול 7
freemem() – בדיקת שילוב p q size q->mlen block p q q->mlen size block מערכות הפעלה - תרגול 7
שברור פנימי –Internal Fragmentation • מצב בו ישנם שטחי זכרון שהוצאו מרשימת הפנויים כתוצאת ההקצאה אך בהכרח לא נמצאים בשימוש • ב-XINU כל הקצאה היא כפולה של 4. לכן התהליך המבקש הקצאה של 9 בתים אכן יקבל מצביע ויוכל להשתמש ב-9 בתים מהמקום שהוחזר לו • למעשה ההקצאה היתה בגודל של 12, ו-3 הבתים שהוקצו מעבר לדרישה אינם פנויים לשימוש מערכות הפעלה - תרגול 7
דוגמה /* assume free memory is 4000 bytes */ for (i=0; i<400; i++) { arr[i] = getmem(10); if (arr[i] == NULL) break; } printf(“Only %d bytes out of 4000 allocated”, 10*i); • לאחר 333 הקצאות הלולאה תפסק (הוקצו רק 3300 בתים מתוך 4000 בתים פנויים) • בפועל היו 333 הקצאות של 12 (4000/12 = 333) מערכות הפעלה - תרגול 7