310 likes | 519 Views
מערכות הפעלה. תרגול 6 – יצירת תהליכים בדומה לנעשה ב- LINUX. מה בתכנית?. יצירת תהליך אתחול של תהליך התפצלות של תהליך. החלפת הקשר. החלפת הקשר נעשת בעזרת פונקציה ctxsw
E N D
מערכות הפעלה תרגול 6 – יצירת תהליכים בדומה לנעשה ב-LINUX
מה בתכנית? • יצירת תהליך • אתחול של תהליך • התפצלות של תהליך מערכות הפעלה - תרגול 7
החלפת הקשר • החלפת הקשר נעשת בעזרת פונקציה ctxsw • הפונקציה שומרת את הרגיסטרים של התהליך המתחלף )נזכר בכניסת ה-*pregs בטבלת proctab) ומחליפה אותם ברגיסטרים של התהליך הנכנס • מתבצעת בכל פעם שיש קריאה ל-resched מערכות הפעלה - תרגול 7
יצירת תהליכים • איתחול רשומה של התהליך החדש (שינויים ב- PROCTAB). • העברת פרמטרים המיועדים לפונקציה של התהליך החדש. • הכנת התהליך החדש לסיום. • הכנת התהליך לקבלת שליטה ממנגנון החלפת תהליכים. מערכות הפעלה - תרגול 7
_ctxsw …………. pop di pop si popf ; restore interrupt state pop bp ret _ctxsw endp מתחזה ל-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
kill() • kill(pid) מסיימת את פעולתו של תהליך pid • בנוסף kill נקראת באופן אוטומטי בסיום קוד התהליך • היא משחררת את: • המחסנית של התהליך • רשומת התהליך בטבלת התהליכים • הוצאת רשומת התהליך מהתור בו היא נמצאת • עדכונים ספציפיים למצב התהליך. למשל, אם תהליך מחכה לסמפור : הגדלת המונה ב-1 • במקרה של סיום התהליך הנוכחי – ביצוע resched • סיום ריצת XINU כשמסתיימים כל התהליכים כולל תהליכי מערכת ההפעלה מערכות הפעלה - תרגול 2
סיום התהליך – userret () מערכות הפעלה - תרגול 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