6.3 מתזמן התהליכים תרגול
תרגול - מתזמן התהליכים¶
תרגיל 1 - מצבי תהליכים¶
- הריצו
topאוhtopעל מכונת הלינוקס שלכם. בעמודה S (State) תראו אותיות שמייצגות מצבי תהליכים. מה מייצגות האותיות R, S, D, T, Z? - כמה תהליכים במצב R (Running) יש כרגע? למה המספר הזה בדרך כלל נמוך?
- נסו ליצור תהליך זומבי: כתבו תוכנית בC שעושה fork, תהליך הבן יוצא מיד עם
_exit(0), ותהליך האב ישן 60 שניות (sleep) בלי לקרוא ל-wait. הריצו ובדקו עםps aux | grep Zשאתם רואים את הזומבי.
תרגיל 2 - השפעת nice¶
- כתבו תוכנית בC שרצה בלולאה אינסופית ומדפיסה כל שניה כמה איטרציות ביצעה:
- הריצו שני עותקים של התוכנית - אחד עם nice=0 (ברירת מחדל) ואחד עם nice=19:
- השוו את מספר האיטרציות בשניה. כמה יותר איטרציות התוכנית עם nice=0 מבצעת?
- עצרו את שני התהליכים (
kill %1 %2).
תרגיל 3 - מידע מproc¶
לכל תהליך שרץ, חקרו את המידע שהקרנל חושף דרך proc:
- הריצו
sleep 300 &כדי ליצור תהליך שישן 5 דקות. רשמו את הPID שלו. - בדקו את המצב שלו:
cat /proc/<PID>/status | grep State. מה המצב? - בדקו את מידע התזמון:
cat /proc/<PID>/sched. מצאו את הvruntime. האם הוא משתנה אם תבדקו שוב אחרי כמה שניות? למה? - כמה context switch-ים (voluntary ו-involuntary) היו לתהליך? (חפשו nr_switches בproc/PID/sched, או nr_voluntary_switches ו-nr_involuntary_switches בproc/PID/status)
- שלחו לתהליך SIGSTOP (
kill -STOP <PID>) ובדקו שוב את המצב. מה השתנה? - שלחו לו SIGCONT (
kill -CONT <PID>) כדי להמשיך אותו, ואזkill <PID>כדי לסיים.
תרגיל 4 - ספירת context switch-ים¶
כתבו תוכנית שמדפיסה את מספר הcontext switch-ים הרצוניים והכפויים שלה:
- פתחו את
/proc/self/status(self מצביע תמיד לתהליך הנוכחי). - חפשו את השורות
voluntary_ctxt_switchesו-nonvoluntary_ctxt_switches. - הדפיסו את הערכים.
- הוסיפו לולאה שמבצעת sleep(1) כמה פעמים, ובסוף הדפיסו שוב. כמה context switch-ים רצוניים נוספו? האם זה מתאים למספר הsleep-ים?
רמז: אפשר לקרוא מ-/proc/self/status עם fopen ולחפש את השורות הרלוונטיות.
תרגיל 5 - שאלה תיאורטית¶
הCFS משתמש בvruntime כדי להחליט מי רץ הבא. הסבירו:
1. מה יקרה אם תהליך חדש נוצר עם vruntime=0? (רמז: איך זה ישפיע על תהליכים ותיקים עם vruntime גבוה?)
2. בפועל, הCFS לא מאתחל תהליך חדש עם vruntime=0. מה הוא עושה במקום? למה?