לדלג לתוכן

4.3 תהליכים ותהליכונים הרצאה

תהליך

  • תהליך, או באנגלית "process" זה תוכנה שרצה במחשב. אפשר להגיד שכל התוכנות שרצות במחשב הם תהליכים במערכת ההפעלה שלנו.
  • במערכת הפעלה מודרנית כמו ווינדוס, תהליכים יכולים לרוץ במקביל, (תוכנות יכולות באותו הזמן) ואומנם זה נשמע לנו ברור מאילו אבל זה לא כל כך. ונדבר בהרצאה הזו קצת על איך שזה קורה
  • תהליכים יכולים גם ליצור עוד תהליכים, כמו למשל שהטרמינל הוא תהליך, והטרמינל יכול להריץ עוד תהליכים (תוכנות אחרות). זה הופך את הטרמינל לתהליך אב, ואת הפקודה שרצה להתהליך בן של התהליך של הטרמינל.

תהליכונים

  • המון פעמים יש לנו מצבים שגם תוכנה (תהליך), צריך הוא בעצמו להריץ מספר דברים במקביל, נקח לדוגמה את הדפדפן שלנו - יכול להיות שנפתח בדפדפן בטאב אחד יוטיוב, ובטאב שני את הקורס, אז התהליך של הדפדפן יצטרך גם לנגן את הסרטון שאנחנו רואים ביוטיוב וגם להפעיל את האתר של הקורס.
  • הדרך שבה זה קורה זה באמצעות תהליכונים, תהליכון הוא בסוף משהו שמריץ קוד, ולכל תהליך יכול להיות מספר תהליכונים, זאת אומרת שיכול להיות שלמשל לתוכנת הדפדפן שלנו יש 4 תהליכונים, וזה אומר שהתוכנה מריצה 4 דברים במקביל.
  • אם יש לנו במערכת לדוגמה 3 תהליכים, ולכל אחד מהתהליכים יש 3 תהליכונים, סהכ קיימים 9 תהליכונים במערכת - 9 תהליכונים שצריכים להריץ קוד במקביל- זה המון.
  • אבל כיצד באמצעות מעבד אחד נריץ 9 דברים שונים במקביל? במיוחד שאפילו כל אחד תהליכונים צריך גם זכרון נפרד.

שינוי קונטקסט - context switch

  • כאשר המעבד צריך להריץ מספר תהליכונים במקביל, המעבד עושה דבר שנקרא "שינוי קונטקסט" (context switch).
  • שינוי קונטקסט הוא מצב שבו המעבד כדי להריץ מספר תהליכונים במקביל, ממש עובר ממש מהר בין תהליכונים כך שזה יראה למשתמש כיאלו שכולם רצים באותו הזמן.
  • דמיינו והמעבד שלנו צריך להריץ שני תהליכונים, המעבד פשוט יריץ שורת קוד אחת מהתהליך הראשון, מהר יעבור לשני ואז יריץ שורת קוד בקוד השני וכך ימשיך בצורה מהירה מאוד. כך שלנו המשתמשים זה יראה כיאלו שני התליכונים האלה ממש רצים באותו הזמן, במקביל.

ליבות מעבד

  • אז במעבדים מודרנים יש כמה ליבות, וכל ליבה יכולה להריץ תהליכון. כך שיש מעבדים שבאמת יכולים להריץ מספר תהליכונים במקביל בלי צורך בשינוי קונטקסט.
  • דמיינו ומעבד שלנו יש 4 ליבות (מעבד סטנדרטי), ויש לנו 50 תהליכים במחשב, ולכל תהליך בממוצע יש 3 תהליכונים כך שסה"כ יש לנו 150 תהליכונים שצריכים לרוץ. זה אומר שבערך כל ליבה צריכה להריץ 37 תהליכונים במקביל, עכשיו בחיים האמיתיים לכל תהליך יש עדיפות - "priority" והיא מוגדרת על ידי המשתמש והמערכת הפעלה. כך שבתכלס אומנם יש לנו 150 תהליכונים שצריך להריץ אבל לכל אחד יש "עדיפות" אחרת.
  • אז, איך נוכל לתכנן קוד שיודע להגיד איזה תהליכון צריך לרוץ מתי ובאיזה ליבה?

מתזמן - scheduler

  • הscheduler זה תוכנה שנמצאת בקרנל שיודעת לחשב בדיוק איזה תהליכון צריך לרוץ על איזה ליבה במעבד.
  • לכל תהליכון במערכת ההפעלה יש עדיפות, וזה בדרך כלל מספר שאומר עד כמה התהליכון הזה קריטי - אם המספר גבוהה אז הוא יקבל יותר זמן לרוץ בליבות כך שהתהליכון ירוץ יותר מהר משאר התהליכים. וגם בזה הscheduler צריך להתחשב.
  • הscheduler זה תוכנה מסובכת, ויש המון אלגוריתמים שכתבו לscheduler. מוזמנים לקרוא עליהם באינטרנט.

פרוסס אב, ופרוסס בן

  • בדרך כלל ברוב המערכת ההפעלה- אפשר לצייר את הפרוססים כמעין עץ. כאשר קיים הפרוסס הראשון במערכת ההפעלה שהקרנל אחראי ליצור, והפרוסס הזה יוצר את כל הפרוססים האחרים.
  • פרוססים יוצרים פרוססים אחרים, כאשר אנחנו משתמשים בשולחן העבודה כדי להריץ פרוססים במערכת- אפשר להגיד שהפרוסס של שולחן העבודה יוצר פרוססים אחרים. וזה הופך אותו לפרוסס אב, ואת הפרוסס שהרצנו לפרוסס בן שלו.
  • זה בא לידי ביטוי בטרמינל, כאשר הפרוסס של הCMD הוא הפרוסס אב, וכל הפקודות שאנחנו מריצים בטרמינל הן הפרוססי בנים שלו.

הכלי procexp

  • בהרצאה נעבור על הכלי procexp של sysinternals, פתחו אותו בתקיית sysinternals שלכם. הוא אמור להיראות כך:
    Pasted image 20240630224213.png
  • אפשר לראות שיש לנו פה רשימה של כל התהליכים שלנו במחשב, ואפשר לראות שזה נראה ממש כמו עץ
  • העץ הזה מתאר את הקשרים אבא ובן של כל התהליכים, למשל אפשר לראות שהתהליך wininit מריץ את התהליך services שמריץ מלא תהליכים בשם svchost - שאני מזכיר לכם, אלו תהליכים של service-ים של מערכת ההפעלה. אם נלחץ על המינוס כדי לסגור את services, אפשר לראות עוד המון תהליכים אחרים במערכת:
    Pasted image 20240630224444.png
  • אפשר לראות אצלי שפתוחות המון תוכנות, וכולן פתוחות על ידי התהליך אב explorer, שהוא אחראי על השולחן העבודה.
    Pasted image 20240630224551.png
  • אם נבחר תהליך, למשל obsidian ונלחץ מקש ימני ונבחר properties נוכל לראות המון מידע על התהליך:
    Pasted image 20240630224635.png
  • נוכל לראות גם רשימה של כל התהליכונים של התהליך:
    Pasted image 20240630224808.png
  • אם נפתח את הstack של התהליכון נוכל לראות אפילו איזה פונקציות בלייב התהליכון מריץ, משוגע!
    Pasted image 20240630224901.png
  • שימו לב שבstack אפשר לראות ממש פונקציות של winapi, ואפילו קוד קרנלי שרץ!
  • אם תחפרו קצת בתוכנה תוכלו למצוא את הקבצים שכל תהליכון פותח, ואפילו המקורות אליהם הוא ניגש באינטרנט.
  • אפשר לראות לכל פרוסס שיש גם PID, שזה מזהה מיוחד שיש לכל פרוסס במערכת שמציין את הID שלו- מספר יחודי שיש רק לו. PID זה קיצור של process id.
  • בנוסף יש לכל פרוסס PPID, שזה parent process id, שמציין את הID של הפרוסס אב שלו.

  • הכלי procexp, או בשמו המלא "process explorer" הוא משוגע, והוא נותן לנו לבחון תהליכים (פרוססים) במערכת ולקבל עליהם המון מידע. ממש task manager על סטראוידים!

הכלי procmon

  • אז כמו procexp שנותן לנו לקבל מידע כללי על כל הפרוססים במערכת, הכלי procmon או בשמו המלא "process monitor" נותן לנו לקבל גישה למידע קונקרטי על פרוססים בלייב, כמו איזה קבצים הם ניגשים אליהם, איזה מפתחות בregistry, ועוד.
  • פתחו את הכלי procmon בתקייה של sysinternals, הוא אמור להיראות כך בערך:
    Pasted image 20240630225525.png
  • הכלי הזה זורק לנו המון מידע על המון פרוססים, אז נרצה לפלטר - נוכל לעשות את זה באמצעות לחיצה על "filter" למעלה ואז שוב על filter. ויפתח לנו חלון כזה:
    Pasted image 20240630225643.png
  • בו תוכלו לפלטר על איזה דברים תרצו, למשל כדי לפלטר על שם של פרוסס, תוכלו לבחור "Process Name" ואז למשל Notepad.exe
    Pasted image 20240630225817.png
    ואז לחצו על add, ואז apply וok
    • עכשיו פתחו את notepad
      Pasted image 20240630225924.png
    • אפשר לראות שהתוכנה פתחה המון קבצים, וניגשה להמון מפתחות בregistry
    • התוכנה procmon מאפשרת לנו ממש לנטר על פעולות שפרוססים ותוכנות עושים על המחשב שלנו, וזה מאוד חזק. אנחנו יכולים עכשיו לדוגמה ללמוד ולחקור כיצד התוכנה notepad עובדת ועל דברים שהיא עושה באמצעות הכלי procmon.