מצב תהליך

350x350px|ממוזער|מצב תהליך
במערכות הפעלה, **מצב תהליך** הוא הסטטוס הנוכחי של תהליך, המגדיר את פעילותו ואת מיקומו במחזור החיים שלו. הוא משקף האם התהליך חדש, מוכן להרצה, רץ בפועל על המעבד, ממתין למשאב כלשהו או סיים את פעולתו. הבנת מצבי התהליך השונים ומעבריהם היא קריטית, כיוון שהיא מאפשרת למערכת ההפעלה לנהל ביעילות את המשאבים, להבטיח ביצוע חלק של משימות מרובות, ולמנוע צווארי בקבוק.

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

## מצבי תהליך ראשוניים
ממוזער|300x300px|מצבי התהליך השונים, מוצגים בדיאגרמת מצב, עם חצים המציינים מעברים אפשריים בין מצבים - כפי שניתן לראות, חלק מהתהליכים מאוחסנים בזיכרון הראשי (צהוב), וחלקם מאוחסנים בזיכרון משני (ירוק).תהליך יכול להיות במספר מצבים עיקריים:
* **New** (חדש) – זהו השלב הראשוני בו תהליך נוצר. הוא נמצא בזיכרון הראשי, אך טרם הוקצו לו משאבי מערכת (כמו CPU). המתזמן לטווח ארוך מאשר את כניסתו לתור ההרצה, והתהליך עובר למצב "Ready".
* **Ready** (מוכן) – התהליך מוכן להרצה וכל משאביו הוקצו לו, אך הוא ממתין בתור כדי לקבל זמן מעבד (CPU), ומחכה שמתזמן הטווח הקצר יבחר בו.
* **Running** (רץ) – זהו המצב שבו התהליך מבוצע בפועל על ידי המעבד. בכל רגע נתון, על כל ליבת מעבד יכול לרוץ רק תהליך אחד. התהליך ירוץ עד שיסיים את משימתו, יבקש פעולת I/O, או יופסק על ידי המערכת.
* **Waiting** (ממתין) – תהליך נכנס למצב זה כאשר הוא ממתין לסיום אירוע חיצוני, כגון קריאה לקלט/פלט (I/O), גישה לקובץ או קבלת מידע מרשת. הוא אינו יכול להמשיך לרוץ עד שהאירוע יסתיים. לעיתים קרובות תהליכים נחסמים כשנדרש קלט מהמשתמש או גישה למקטע קריטי, שמוגן באמצעות מנגנוני סנכרון כמו סמפור.
* **Terminated** (סיים) – המצב הסופי של תהליך. הוא מגיע למצב זה לאחר שסיים את ריצתו בהצלחה או שנכשל. במצב זה הוא נשאר ב"טבלת התהליכים" כתהליך זומבי עד שהתהליך האב שלו קורא ל-`wait()`, מה שמאפשר למערכת לשחרר את כל המשאבים שתפס. ניתן לסיים תהליך גם על ידי סיום מפורש. בשני המקרים הללו, התהליך עובר למצב "סיום". אם התהליך נכשל בקריאה ל־`wait`, התהליך ממשיך לצרוך את ערך טבלת התהליכים (באופן ספציפי את מזהה התהליך או PID), וגורם לדליפת משאבים.

## מעברים בין מצבים
מעברי המצב בין מצבי התהליך מתרחשים באופן הבא:
* **Admitted** (התקבל) – מעבר מ־**New** ל־**Ready**. מערכת ההפעלה מקבלת את התהליך ומוסיפה אותו לתור התהליכים המוכנים להרצה.
* **Scheduler Dispatch** (שיגור) – מעבר מ־**Ready** ל־**Running**. מתזמן המערכת בוחר תהליך מתוך תור ה-Ready ומקצה לו את המעבד.
* **I/O** או **Event Wait** (המתנה לאירוע) – מעבר מ־**Running** ל־**Waiting**. התהליך מפסיק את ריצתו מכיוון שהוא זקוק לסיום של פעולת קלט/פלט או אירוע אחר.
* **I/O** או **Event Completion** (סיום אירוע) – מעבר מ־**Waiting** ל־**Ready**. האירוע שהתהליך המתין לו הסתיים, והוא יכול לחזור לתור ה-Ready ולהמתין לתורו שוב.
* **Interrupt** (פסיקה) – מעבר מ־**Running** ל־**Ready**. זהו מעבר כפוי, שנגרם לרוב על ידי תום הקצאת הזמן (time slice) שהוקצתה לתהליך. המערכת עוצרת את התהליך כדי לאפשר לתהליכים אחרים לרוץ.
* **Exit** (יציאה) – מעבר מ־**Running** ל־**Terminated**. התהליך סיים את עבודתו.

## מצבי תהליך נוספים בזיכרון וירטואלי
במערכות המשתמשות בזיכרון וירטואלי, ישנם מצבים נוספים המאפשרים למערכת לנהל זיכרון בצורה יעילה:
* **Swapped & Waiting** (הוחלף וממתין) – תהליך במצב **Waiting** יכול להיות מוחלף (swapped out) - מועבר מהזיכרון הראשי לזיכרון המשני, בדרך כלל הדיסק הקשיח. זה קורה כדי לפנות מקום בזיכרון הראשי עבור תהליכים אחרים.
* **Swapped & Blocked** (הוחלף ונחסם) – תהליך שנמצא במצב **Waiting** ועבר החלפה לזיכרון המשני. הוא יוחזר לזיכרון הראשי רק לאחר שהאירוע שהוא ממתין לו הסתיים.

## מנגנונים הכרחיים במערכת הפעלה
כדי לנהל את מחזור החיים של תהליכים, מערכת ההפעלה חייבת לספק מנגנונים בסיסיים:

# **יצירת תהליך** – המערכת צריכה לספק דרך ליצור תהליכים חדשים, להקצות להם זיכרון ומשאבים, ולהכניסם למצב "New".
# **סיום תהליך** – המערכת חייבת מנגנון לסיום תהליכים, בין אם הם סיימו את עבודתם או עקב שגיאה, ולשחרר את כל המשאבים שהם תפסו.
# **מצבי ליבה ומשתמש** – המערכת צריכה להבדיל בין פעולות המבוצעות במצב **ליבה** (Kernel), שיש להן גישה בלתי מוגבלת לחומרה, לבין פעולות במצב **משתמש (User)**, שמוגבלות כדי למנוע כשלים וקריסות. קריאת מערכת מתוכנית משתמש מובילה למעבר למצב ליבה. מצב המשתמש מגן מפני כשלים חמורים כמו קריסת מערכת, באמצעות מתן מרחב כתובות וירטואלי מבודד לכל תהליך, הבטחת הרצה מבודדת של תהליכים כך שלא יפגעו זה בזה, ומניעת גישה ישירה להתקני החומרה.

## ראו גם
* Ps (יוניקס)

## הערות שוליים

קטגוריה:תהליכים (מדעי המחשב)
קטגוריה:דפים עם תרגומים שלא נסקרו