300 likes | 464 Views
מערכות הפעלה. תרגול 9 – ניהול פסיקות שעון. מה בתכנית?. ניהול פסיקות שעון אתחול המערכת. פסיקת השעון. מתרחשת כל הזמן בצורה מחזורית הפרשי זמן קצרים, המערכת נשארת בשליטה נותנת למערכת לספור זמן, התרחשות הפסיקה פירושה שעברה יחידת זמן נוספת שימוש של XINU :
E N D
מערכות הפעלה תרגול 9 – ניהול פסיקות שעון
מה בתכנית? • ניהול פסיקות שעון • אתחול המערכת מערכות הפעלה - תרגול 8
פסיקת השעון • מתרחשת כל הזמן בצורה מחזורית • הפרשי זמן קצרים, המערכת נשארת בשליטה • נותנת למערכת לספור זמן, התרחשות הפסיקה פירושה שעברה יחידת זמן נוספת • שימוש של XINU: • מנגנון ה-preemption • הרדמת תהליכים • ניהול שעון גלובלי מאז עלית המערכת (tod) מערכות הפעלה - תרגול 8
שגרת פסיקת השעון - clkint • הקוד הייחודי של פסיקת השעון • נקראת ע"י סדרן הפסיקות intcom • המצביע לשגרה נמצא בשדה newisr בטבלת intmap, טבלת הפסיקות של XINU מערכות הפעלה - תרגול 8
הרדמת התהליכים • תהליך נכנס להרדמה רק אם הוא בעצמו החליט על כך • שגרות ההרדמה – sleep, sleept • כל החישובים – ביחידות של פסיקות השעון • המימוש יעיל ככל האפשר – משפיע על מהירות הביצוע של שגרת פסיקת השעון מערכות הפעלה - תרגול 8
תור ההפרשים • התהליכים הרדומים נמצאים בתור ההפרשים • הסדר – לפי סדר ההתעוררות • qkey שומר את ההפרש בזמן בין שני תהליכים עוקבים • עבור התהליך הראשון בתור, המפתח שומר את מספר הפעימות שנשארו עד שיתעורר, שמתעדכן עם כל פעימת שעון מערכות הפעלה - תרגול 8
תור ההפרשים • למה זה טוב? • עדכון ההמתנות בעקבות פסיקה כרוך בהפחתה של מפתח ראשון בלבד • זמן ההמתנה של תהליך יהיה שווה שסכום ערכי המפתח של כל מי שלפניו • כשתהליך יוצא מתור (ערך המפתח 0), תהליך שנהיה הראש החדש יתחיל את הספירה לאחור מערכות הפעלה - תרגול 8
תור הפרשים :דוגמה • זמני המתנה : תהליך 1: 15, תהליך 2 : 20, תהליך 3 : 12 בטבלת q : מערכות הפעלה - תרגול 8
insertd.c • הכנסת תהליך לתור ההפרשים - insertd • לא משתתפת בפסיקת שעון • עוברת על התור במטרה למצוא את ההפרש הקרוב ביותר לנתון – סכום של ערכי המפתח של כל מי שלפניו אמור להיות קטן שווה למספר הפעימות שהוא אמור להכנס למצב sleep מערכות הפעלה - תרגול 8
sleep.h מערכות הפעלה - תרגול 8
insertd.c מערכות הפעלה - תרגול 8
sleept.c/sleep.c • sleeptמממשת המתנה בפסיקות שעון • עד 30 דקות (32767 פסיקות) • sleep מממשת המתנה בשניות, תוך המרה פנימית ליחידות פסיקת שעון • אם זמן ההרדמה גדול מ-30 דקות התהליך מרדים את עצמו כמה פעמים. השיטה הזאת לא מדויקת. למה? מערכות הפעלה - תרגול 8
sleept.c/sleep.c • אם זמן ההרדמה גדול מ-30 דקות התהליך מרדים את עצמו כמה פעמים. השיטה הזאת לא מדויקת. למה? • זה נכון בהנחה שתהליך הופך להיות current בסוף כל הרדמה קצובה • זה לא המצב – בגלל מדיניות החלפת התהליכים מערכות הפעלה - תרגול 8
sleept.c מערכות הפעלה - תרגול 8
sleep.c מערכות הפעלה - תרגול 8
wakeup.c • משחררת תהליכים רדומים • התהליך משוחרר כל עוד המפתח שלו קטן או שווה לאפס מערכות הפעלה - תרגול 8
clkint.c • הפחתת המפתח הראשון באחד • בדיקה האם קיימים תהליכים שחייבים להתעורר, הוצאה מתור הרדומים • טיפול ב-preemption • האם ערך ה-preempt יכול להיות שלילי? • כן, במקרה של תהליך עם עדיפות גבוהה שלא מתחלף כשזמנו נגמר. מערכות הפעלה - תרגול 8
clkint.c מערכות הפעלה - תרגול 8
clkint.c • מקדמת את tod באחד • סדר הפעולות הוא חשוב • מה יקרה אם resched יקדים את הטיפול בתור הרדומים? • ההמתנה עלולה להתארך מעבר למצופה, עד לפסיקה הבאה ואפילו יותר מזה מערכות הפעלה - תרגול 8
החלפת תהליכים בזמן פסיקה • האם זה בטוח לקרוא ל-resched מתוך שגרת clkint? • עם החלפת תהליכים חזרה מפסיקה יכולה לקחת זמן (ואפילו להימשך לנצח) • אז איך בכל זאת זה עובד? מערכות הפעלה - תרגול 8
החלפת תהליכים בזמן פסיקה • למה צריך לטפל בפסיקה במהירות? • צריך להודיע לחמרה שהפסיקה טופלה במהירות, אחרת מנגנון הפסיקות ישתבש • מנגנון הפסיקות חסום בזמן הפסיקה שגם עלול לשבש פעילות מחשב תקינה • התכנית המופסקת אמורה לא "לחוש" את הפסיקה מערכות הפעלה - תרגול 8
החלפת תהליכים בזמן פסיקה • איך זה עובד? • לא קוראים ל-resched לפני שהודענו לחמרה שהפסיקה טופלה • גם אם יש החלפה, מנגנון ישוחרר על ידי restore של התהליך הנכנס • ההנחה היא שמערכת ההפעלה עובדת בצורה סבירה מערכות הפעלה - תרגול 8
דוגמה • עלינו לשנות את השגרה sleept כך שתהיה מסוגלת לקבל ערכים העולים על TICSD (יותר מ-30 דקות) • נגדיר מערך חדש, sleep_time[NPROC] • נממש שגרת wakeup חדשה, wakeup_new() מערכות הפעלה - תרגול 8
דוגמה clkint.c - מערכות הפעלה - תרגול 8
דוגמה new_wakeup.c - מערכות הפעלה - תרגול 8
דוגמה – CPU time limit • ממשו שגרה limit_cpu_time שמונעת מתהליך pid לשהות יותר מ-secs שניות במעבד: • SYSCALL limit_cpu_time(int pid, int secs) • נא לסיים תהליך אחרי שתם זמנו מערכות הפעלה - תרגול 9
דוגמה – CPU time limit מערכות הפעלה - תרגול 9
דוגמה – CPU time limit מערכות הפעלה - תרגול 9
דוגמה – CPU time limit מערכות הפעלה - תרגול 9
דוגמה – CPU time limit מערכות הפעלה - תרגול 9