מערכות הפעלה

‫מערכות הפעלה‬
‫תרגול ‪ – 6‬יצירת תהליכים בדומה לנעשה ב‪-‬‬
‫‪LINUX‬‬
‫מה בתכנית?‬
‫‪ ‬יצירת תהליך‬
‫‪ ‬אתחול של תהליך‬
‫‪ ‬התפצלות של תהליך‬
‫‪2‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫החלפת הקשר‬
‫‪ ‬החלפת הקשר נעשת בעזרת פונקציה ‪ctxsw‬‬
‫‪ ‬הפונקציה שומרת את הרגיסטרים של התהליך‬
‫המתחלף )נזכר בכניסת ה‪ *pregs-‬בטבלת‬
‫‪ )proctab‬ומחליפה אותם ברגיסטרים של‬
‫התהליך הנכנס‬
‫‪ ‬מתבצעת בכל פעם שיש קריאה ל‪resched-‬‬
‫‪3‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫יצירת תהליכים‬
‫‪ ‬איתחול רשומה של התהליך החדש (שינויים ב‪-‬‬
‫‪.)PROCTAB‬‬
‫‪ ‬העברת פרמטרים המיועדים לפונקציה של‬
‫התהליך החדש‪.‬‬
‫‪ ‬הכנת התהליך החדש לסיום‪.‬‬
‫‪ ‬הכנת התהליך לקבלת שליטה ממנגנון החלפת‬
‫תהליכים‪.‬‬
‫‪4‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪7‬‬
‫ינואר ‪17‬‬
‫‪5‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫מתחזה‬
ctxsw-‫ל‬
_ctxsw ………….
pop
di
pop
si
popf
; restore interrupt state
pop
bp
ret
_ctxsw endp
17 ‫ינואר‬
SP
<di>
<si>
INITF
BP
ctxsw stack operations
<bp>
procaddr
INITRET
args
9 ‫ תרגול‬- ‫מערכות הפעלה‬
procaddr calls to
ctxsw without parameters
INITRET calls to
procaddr with args
6
‫יצירת תהליך חדש – )(‪newpid‬‬
‫‪7‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫)(‪kill‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫)‪ kill(pid‬מסיימת את פעולתו של תהליך ‪pid‬‬
‫בנוסף ‪ kill‬נקראת באופן אוטומטי בסיום קוד התהליך‬
‫היא משחררת את‪:‬‬
‫‪ ‬המחסנית של התהליך‬
‫‪ ‬רשומת התהליך בטבלת התהליכים‬
‫‪ ‬הוצאת רשומת התהליך מהתור בו היא נמצאת‬
‫‪ ‬עדכונים ספציפיים למצב התהליך‪ .‬למשל‪ ,‬אם תהליך מחכה‬
‫לסמפור ‪ :‬הגדלת המונה ב‪1-‬‬
‫‪ ‬במקרה של סיום התהליך הנוכחי – ביצוע ‪resched‬‬
‫‪ ‬סיום ריצת ‪ XINU‬כשמסתיימים כל התהליכים כולל תהליכי‬
‫מערכת ההפעלה‬
‫‪8‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪2‬‬
‫ינואר ‪17‬‬
‫‪9‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪2‬‬
‫ינואר ‪17‬‬
‫סיום התהליך – )( ‪userret‬‬
‫‪10‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫דוגמה – ‪xexecl, xfork‬‬
‫‪ ‬מימוש קריאות ‪)xexecl, xexecl2( xexecl‬‬
‫ו‪ xfork-‬שמדמות קריאות דומות ב‪UNIX-‬‬
‫‪ ‬ניזכר במשמעות הקריאות‬
‫‪11‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
UNIX-‫ ב‬fork ‫קריאת מערכת‬
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
17 ‫ינואר‬
9 ‫ תרגול‬- ‫מערכות הפעלה‬
12
‫הרצת תכנית אחרת ב‪UNIX-‬‬
‫‪‬‬
‫קריאת המערכת )(‪execl‬‬
‫‪ ‬תחביר‪:‬‬
‫;)… ‪int execl(const char *filename, const char * arg,‬‬
‫‪ ‬פעולה‪ :‬טוענת תכנית חדשה לביצוע על‪-‬ידי התהליך הקורא‬
‫‪‬‬
‫דוגמה‬
‫{ )(‪main‬‬
‫;)‪execl(“/bin/date”, “date”, NULL‬‬
‫;)”‪printf(“hello‬‬
‫}‬
‫‪13‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexecl‬‬
‫‪ ‬אין צורך בכניסה חדשה בטבלת התהליכים‬
‫‪ ‬לא צריך זיכרון נוסף‬
‫‪ ‬מבצעים ‪ create‬על תהליך עצמו‪:‬‬
‫‪ ‬עדכון פרמטר‪ INITRET ,‬והמצביע על הקוד לערכים‬
‫של תכנית חדשה‬
‫‪ ‬עדכון תוכן להחלפת התהליכים‬
‫‪ ‬קריאה ‪ctxsw-‬‬
‫‪14‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexecl‬‬
‫‪15‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
ctxsw ‫ מצב המחסנית המדמה‬- xexecl
Low
Addr
pptr->pbase
SP1
SI, DI ‫עבור‬
INITF
BP ‫עבור‬
PF
INITRET
High
Addr
17 ‫ינואר‬
pptr->pbase +
pptr->plen
PARAM
9 ‫ תרגול‬- ‫מערכות הפעלה‬
16
‫‪xexecl‬‬
‫‪17‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexecl‬‬
‫‪18‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexecl‬‬
‫‪19‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexecl2‬‬
‫‪ ‬לולאה שמעתיקה מספר לא קבוע של פרמטרים‬
‫מהנקודה הפעילה של מחסנית אל התחתית‬
‫‪ ‬יתר הפרטים כמו ב‪xexecl-‬‬
‫‪20‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexec2‬‬
‫‪21‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
Low Addr
SP
SI, DI ‫עבור‬
xexec2
INITF
BP ‫עבור‬
PF
INITRET
PARAM1
…
PARAMn
High Addr
17 ‫ינואר‬
9 ‫ תרגול‬- ‫מערכות הפעלה‬
22
‫‪xexecl2‬‬
‫‪23‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexec2‬‬
‫‪24‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexec2‬‬
‫‪25‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xexec2‬‬
‫‪26‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xfork‬‬
‫‪ ‬חיקוי ‪ XINU‬לקריאת ‪fork‬‬
‫‪ ‬מייצרים תהליך חדש עבור תהליך הבן‬
‫‪ ‬מעתיקים תוכן המחסנית מתהליך האב אל תהליך הבן‬
‫‪ ‬מחשבים מצביע הקוד עבור תהליך הבן‬
‫‪ ‬מסמלצים קריאה ל‪ctxsw-‬‬
‫‪ ‬מחזירים ‪ pid‬של תהליך חדש לאב או ‪ 0‬לבן‬
‫‪27‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪ – retip‬חישוב כתובת חזרה‬
‫‪28‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xfork‬‬
‫‪29‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫‪xfork‬‬
‫הכנת‬
‫מחסנית‬
‫עדכון ‪bp‬‬
‫עבור ‪xmain‬‬
‫הרצת‬
‫תהליך הבן‬
‫‪30‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬
‫שאלות שצריך לשאול‬
‫‪ ‬האם צריך ליצור תהליך חדש עם ‪ pid‬חדש או‬
‫מספיק לשנות תהליך קיים?‬
‫‪ ‬האם צריך להקצות מחסנית נוספת?‬
‫‪ ‬מה המחסנית אמורה להכיל?‬
‫‪ ‬איך התהליך יחזור מהקריאה?‬
‫‪ ‬האם דרושים משתנים נוספים כדי לבצע את‬
‫המשימה?‬
‫‪31‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫ינואר ‪17‬‬