מערכות הפעלה

‫מערכות הפעלה‬
‫תרגול ‪– 6‬פסיקת שעון‪ ,‬אתחול מ"ה ויצירת תהליכים‬
‫פסיקת השעון‬
‫‪ ‬מתרחשת כל הזמן בצורה מחזורית‬
‫‪ ‬הפרשי זמן קצרים‪ ,‬המערכת נשארת בשליטה‬
‫‪ ‬נותנת למערכת לספור זמן‪ ,‬התרחשות הפסיקה‬
‫פירושה שעברה יחידת זמן נוספת‬
‫‪ ‬שימוש של ‪:XINU‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪2‬‬
‫מנגנון ה‪preemption-‬‬
‫הרדמת תהליכים‬
‫ניהול שעון גלובלי מאז עלית המערכת (‪)tod‬‬
‫הרדמת התהליכים‬
‫‪ ‬תהליך נכנס להרדמה רק אם הוא בעצמו‬
‫החליט על כך‬
‫‪ ‬שגרות ההרדמה – ‪sleep, sleept‬‬
‫‪ ‬כל החישובים – ביחידות של פסיקות השעון‬
‫‪ ‬המימוש יעיל ככל האפשר – משפיע על‬
‫מהירות הביצוע של שגרת פסיקת השעון‬
‫‪3‬‬
‫תור ההפרשים‬
‫‪ ‬התהליכים הרדומים נמצאים בתור ההפרשים‬
‫‪ ‬הסדר – לפי סדר ההתעוררות‬
‫‪ qkey ‬שומר את ההפרש בזמן בין שני‬
‫תהליכים עוקבים‬
‫‪ ‬עבור תהליך ראשון בתור המפתח שומר את‬
‫הזמן עד שהתהליך מתעורר‬
‫‪4‬‬
‫תור ההפרשים‬
‫‪ ‬למה זה טוב?‬
‫‪7 5 M‬‬
‫‪3 6 9‬‬
‫‪1 10 7‬‬
‫‪M 5 3‬‬
‫‪ ‬עדכון ההמתנות בעקבות פסיקה כרוך בהפחתה‬
‫של מפתח ראשון בלבד‬
‫‪5‬‬
‫‪insertd.c‬‬
‫‪ ‬הכנסת תהליך לתור ההפרשים ‪insertd -‬‬
‫‪ ‬לא משתתפת בפסיקת שעון‬
‫‪ ‬עוברת על התור במטרה למצוא את ההפרש‬
‫הקרוב ביותר לנתון‬
‫‪6‬‬
sleep.h
7
insertd.c
8
‫‪sleept.c/sleep.c‬‬
‫‪ sleept ‬מממשת המתנה בפסיקות שעון‬
‫‪ ‬עד ‪ TICSN‬פסיקות‬
‫‪ sleep ‬מממשת המתנה בשניות‪ ,‬תוך המרה‬
‫פנימית ליחידות פסיקת שעון‬
‫‪ ‬אם זמן ההרדמה גדול מ‪ 1080-‬שניות‬
‫התהליך מרדים את עצמו כמה פעמים‪.‬‬
‫השיטה הזאת לא מדויקת‪ .‬למה?‬
‫‪9‬‬
‫‪sleept.c/sleep.c‬‬
‫‪ ‬אם זמן ההרדמה גדול מ‪ 1080-‬שניות‬
‫התהליך מרדים את עצמו כמה פעמים‪.‬‬
‫השיטה הזאת לא מדויקת‪ .‬למה?‬
‫‪ ‬זה נכון בהנחה שתהליך הופך להיות‬
‫‪ current‬בסוף כל הרדמה קצובה‬
‫‪ ‬זה לא המצב – בגלל מדיניות החלפת‬
‫התהליכים‬
‫‪10‬‬
sleept.c
11
sleep.c
12
‫‪wakeup.c‬‬
‫‪ ‬משחררת תהליכים רדומים‬
‫‪ ‬התהליך משוחרר כל עוד המפתח שלו קטן או‬
‫שווה לאפס‬
‫‪13‬‬
‫שגרת פסיקת השעון ‪clkint -‬‬
‫‪ ‬הקוד הייחודי של פסיקת השעון‬
‫‪ ‬נקראת ע"י סדרן הפסיקות ‪intcom‬‬
‫‪ ‬המצביע לשגרה נמצא בשדה ‪newisr‬‬
‫בטבלת ‪ ,intmap‬טבלת הפסיקות של ‪XINU‬‬
‫‪14‬‬
intmap.asm ,intmap ‫תזכורת – טבלת‬
15
‫‪clkint.c‬‬
‫‪ ‬הפחתת המפתח הראשון באחד‬
‫‪ ‬בדיקת האם קיימים תהליכים שחייבים‬
‫להתעורר‪ ,‬הוצאה מתור הרדומים‬
‫‪ ‬טיפול ב‪preemption-‬‬
‫‪ ‬האם ערך ה‪ preemt-‬יכול להיות שלילי?‬
‫‪ ‬כן‪ ,‬במקרה של תהליך עם עדיפות גבוהה‬
‫‪16‬‬
clkint.c
17
‫‪clkint.c‬‬
‫‪ ‬מקדמת את ‪ tod‬באחד‬
‫‪ ‬סדר הפעולות הוא חשוב‬
‫‪ ‬מה יקרה אם ‪ resched‬יקדים את הטיפול‬
‫בתור הרדומים?‬
‫‪ ‬ההמתנה עלולה להתארך מעבר למצופה‪ ,‬עד‬
‫לפסיקה הבאה ואפילו יותר מזה‬
‫‪18‬‬
‫אתחול השעון ותור הרדומים‬
‫‪19‬‬
‫דוגמה‬
‫‪ ‬עלינו לשנות את השגרה ‪ sleept‬כך שתהיה‬
‫מסוגלת לקבל ערכים העולים על ‪TICSD‬‬
‫‪ ‬נגדיר מערך חדש‪sleep_time[NPROC] ,‬‬
‫‪ ‬נממש שגרת ‪ wakeup‬חדשה‪,‬‬
‫)(‪wakeup_new‬‬
‫‪20‬‬
clkint.c - ‫דוגמה‬
21
new_wakeup.c - ‫דוגמה‬
22
‫דוגמה – ‪CPU time limit‬‬
‫‪ ‬ממשו שגרה ‪ limit_cpu_time‬שמונעת מתהליך‬
‫‪ pid‬לשהות יותר מ‪ secs-‬שניות במעבד‪:‬‬
‫)‪SYSCALL limit_cpu_time(int pid, int secs‬‬
‫‪ ‬נא לסיים תהליך אחרי שתם זמנו‬
‫‪23‬‬
CPU time limit – ‫דוגמה‬
24
CPU time limit – ‫דוגמה‬
25
CPU time limit – ‫דוגמה‬
26
CPU time limit – ‫דוגמה‬
27
‫אתחול המערכת‬
‫‪ ‬שלבים‪:‬‬
‫‪ ‬אתחול המכונה בזמן ההדלקה (‪ ,boot‬לא קיים ב‪-‬‬
‫‪)XINU‬‬
‫‪ ‬אתחול מבנה הנתונים‬
‫‪ ‬מעבר למוד של ריצה‬
‫‪ ‬קוד האתחול נמצא בפונקצית ‪main‬‬
‫שמתחילה לרוץ כיישום רגיל‪ ,‬משתלטת על‬
‫פסיקות והופכת למערכת תהליכים‬
‫‪28‬‬
‫אתחול מבנה נתונים‬
‫‪ ‬חישוב זכרון פנוי ואיתחול מנהל הזכרון‬
‫‪ ‬אתחול טבלאות תהליכים‪ ,‬תורים‪ ,‬סמפורים‬
‫‪ ‬אתחול מבני נתונים של שעון‬
‫‪ ‬וכו' (שלא דנו בקורס)‬
‫‪ ‬השתלטות על פסיקות‪ ,‬כולל אתחול טבלת‬
‫הפסיקות‬
‫‪29‬‬
‫מעבר לשלב ריצה‬
‫מצב שיכול היה להיות שלב ביניים בריצה של‬
‫מערכת‬
‫‪ ‬הצבת ערכי אתחול במבנה נתונים עבור‬
‫תהליך ‪ NULL‬פעיל‬
‫‪ ‬הוספת תהליכי מערכת‪ butler ,‬ו‪xmain-‬‬
‫(במקום ‪)command line‬‬
‫‪30‬‬
initialize.c
31
initialize.c
32
initialize.c
33
main - initialize.c
34
main - initialize.c
35
sysinit
36
sysinit
37
sysinit
38
sysinit
39
sysinit
40
‫יצירת תהליך חדש – )(‪newpid‬‬
‫‪41‬‬
‫סיום התהליך – )( ‪userret‬‬
‫‪42‬‬
43
-‫מתחזה ל‬
ctxsw
SP
<di>
<si>
INITF
BP
ctxsw stack operations
<bp>
procaddr
INITRET
args
procaddr calls to
ctxsw without parameters
INITRET calls to
procaddr with args
44
‫תכניות דוגמה – ‪xexec, xfork‬‬
‫מימוש קריאות דמוי‪:‬‬
‫‪ – xexec ‬קריאה שמריצה תכנית אחרת‬
‫(‪)exec1, exec2‬‬
‫‪– xfork ‬עבור קריאת דמוי ‪( fork‬בשיעור‬
‫הבא)‬
‫‪45‬‬
‫‪xexec1‬‬
‫‪ ‬אין צורך בכניסה חדשה בטבלת התהליכים‬
‫‪ ‬לא צריך זיכרון נוסף‬
‫‪ ‬מבצעים ‪ create‬על תהליך עצמו‪:‬‬
‫‪ ‬עדכון פרמטר‪ INITRET ,‬והמצביע על הקוד לערכים‬
‫של תכנית חדשה‬
‫‪ ‬עדכון תוכן להחלפת התהליכים‬
‫‪ ‬קריאה ‪ctxsw-‬‬
‫‪46‬‬
xexec1
47
xexec1
48
xexec1
49
SP
xexec1
INITF
PF
INITRET
PARAM
50
xexec1
51
‫‪xexec2‬‬
‫‪ ‬לולאה שמעתיקה מספר לא קבוע של פרמטרים‬
‫מהנקודה הפעילה של מחסנית אל התחתית‬
‫‪ ‬לא צריך זיכרון נוסף‬
‫‪52‬‬
xexec2
53
xexec2
54
xexec2
55
xexec2
56
xexec2
57
SP
xexec2
INITF
PF
INITRET
PARAM1
…
PARAMn
58