לדלג לתוכן

6.3 מתזמן התהליכים תרגול

תרגול - מתזמן התהליכים

תרגיל 1 - מצבי תהליכים

  1. הריצו top או htop על מכונת הלינוקס שלכם. בעמודה S (State) תראו אותיות שמייצגות מצבי תהליכים. מה מייצגות האותיות R, S, D, T, Z?
  2. כמה תהליכים במצב R (Running) יש כרגע? למה המספר הזה בדרך כלל נמוך?
  3. נסו ליצור תהליך זומבי: כתבו תוכנית בC שעושה fork, תהליך הבן יוצא מיד עם _exit(0), ותהליך האב ישן 60 שניות (sleep) בלי לקרוא ל-wait. הריצו ובדקו עם ps aux | grep Z שאתם רואים את הזומבי.

תרגיל 2 - השפעת nice

  1. כתבו תוכנית בC שרצה בלולאה אינסופית ומדפיסה כל שניה כמה איטרציות ביצעה:
    #include <stdio.h>
    #include <time.h>
    
    int main() {
        long count = 0;
        time_t start = time(NULL);
        while (1) {
            count++;
            if (time(NULL) - start >= 1) {
                printf("iterations: %ld\n", count);
                count = 0;
                start = time(NULL);
            }
        }
        return 0;
    }
    
  2. הריצו שני עותקים של התוכנית - אחד עם nice=0 (ברירת מחדל) ואחד עם nice=19:
    ./counter &
    nice -n 19 ./counter &
    
  3. השוו את מספר האיטרציות בשניה. כמה יותר איטרציות התוכנית עם nice=0 מבצעת?
  4. עצרו את שני התהליכים (kill %1 %2).

תרגיל 3 - מידע מproc

לכל תהליך שרץ, חקרו את המידע שהקרנל חושף דרך proc:

  1. הריצו sleep 300 & כדי ליצור תהליך שישן 5 דקות. רשמו את הPID שלו.
  2. בדקו את המצב שלו: cat /proc/<PID>/status | grep State. מה המצב?
  3. בדקו את מידע התזמון: cat /proc/<PID>/sched. מצאו את הvruntime. האם הוא משתנה אם תבדקו שוב אחרי כמה שניות? למה?
  4. כמה context switch-ים (voluntary ו-involuntary) היו לתהליך? (חפשו nr_switches בproc/PID/sched, או nr_voluntary_switches ו-nr_involuntary_switches בproc/PID/status)
  5. שלחו לתהליך SIGSTOP (kill -STOP <PID>) ובדקו שוב את המצב. מה השתנה?
  6. שלחו לו SIGCONT (kill -CONT <PID>) כדי להמשיך אותו, ואז kill <PID> כדי לסיים.

תרגיל 4 - ספירת context switch-ים

כתבו תוכנית שמדפיסה את מספר הcontext switch-ים הרצוניים והכפויים שלה:

  1. פתחו את /proc/self/status (self מצביע תמיד לתהליך הנוכחי).
  2. חפשו את השורות voluntary_ctxt_switches ו-nonvoluntary_ctxt_switches.
  3. הדפיסו את הערכים.
  4. הוסיפו לולאה שמבצעת sleep(1) כמה פעמים, ובסוף הדפיסו שוב. כמה context switch-ים רצוניים נוספו? האם זה מתאים למספר הsleep-ים?

רמז: אפשר לקרוא מ-/proc/self/status עם fopen ולחפש את השורות הרלוונטיות.


תרגיל 5 - שאלה תיאורטית

הCFS משתמש בvruntime כדי להחליט מי רץ הבא. הסבירו:
1. מה יקרה אם תהליך חדש נוצר עם vruntime=0? (רמז: איך זה ישפיע על תהליכים ותיקים עם vruntime גבוה?)
2. בפועל, הCFS לא מאתחל תהליך חדש עם vruntime=0. מה הוא עושה במקום? למה?