Previous Up Next

Managing Process Groups

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

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

הסוג השני נקרא עבודה )job(, הוא יותר כללי ואפשר לשייך אליו תהליך מכל סוג שהוא. אבל בתרגיל הזה נשתמש בחבורות תהליכים.

יצירת חבורת תהליכים חדשה: חבורת תהליכים חדשה נוצרת כאשר יוצרים תהליך חדש ומעבירים את הדגל CREATE_NEW_PROCESS_GROUP לקריאת המערכת CreateProcess. כל התהליכים שהתהליך החדש ייצור, והצאצאים שלהם, ישויכו אוטומטית לקבוצה הזו אלא אם אחד מהם ייווצר עם אותו הדגל. שם חבורת התהליכים הוא המספר של התהליך שיצרנו עם הדגל CREATE_NEW_PROCESS_GROUP, השורש של עץ התהליכים שמרכיבים את החבורה.

הפסקת ריצה של עבודה שלמה:  

BOOL GenerateConsoleCtrlEvent(DWORD control_event,
                              DWORD process_group);
הקריאה הזו, כאשר ערך הארגומנט הראשון הוא CONTROL_BREAK_EVENT, גורמת לתהליכים של חבורת התהליכים )אולי לא כולם( שמספרה הוא process_group להגיב באותה צורה שהם מגיבים להקשת control-break. בדרך כלל זה גורם להפסקת הריצה של התהליכים שמגיבים לקריאה. התהליכים שיגיבו הם התהליכים ששייכים לחבורה ושמחוברים לאותה קונסולה כמו התהליך שמבצע את הקריאה GenerateConsoleCtrlEvent. תהליכים אחרים בחבורה לא יגיבו.

גם הערך CONTROL_C_EVENT חוקי עבור הארגומנט הראשון, אבל הוא משפיע רק את תהליך בודד שמספרו נתון בארגומנט השני, לא על חבורת תהליכים שלימה.

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

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

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

הנה הפעלה לדוגמה של התכנית:

               ¯ the name of the event
c:\> ex-pgroup job-event netstat.exe -e 5
                         ­ 
the command line to run in the new job
כדי להפסיק את פעולת העבודה, מפעילים מתוך חלון אחר את הפקודה

c:\> ex-pgroup job-event
כדי לבדוק את התוכנית, השתמשו בתוכנית CloneProcess שמסופקת יחד עם התרגיל. צריך להריץ את התוכנית הזו עם ארגומנט אחד, משך זמן בשניות. התוכנית יוצרת שני תהליכים בהפרש של משך הזמן הנתון ואז מסיימת את פעולתה. לאורך זמן, האפקט הוא של יצירת מספר אקספוננציאלי של תהליכים, כאשר התהליכים שיצרו אותם כבר אינם קיימים. צפו ביצירת התהליכים הללו בעזרת מנהל המשימות ונסו לסיים את פעולתם בעזרת מנהל המשימות )לא קל אם משך הזמן בין יצירת תהליכים קצר(. כעת נסו לסיים את פעולתם בעזרת התוכנית שכתבתם; זה אמור להיות קל יותר. על מנת להמנע מיצירת תהליכים מרובים מדי, כדאי להריץ את CloseProcess לפחות בתחילה עם משך זמן של כ--10 שניות או יותר.

Copyright Sivan Toledo 2004
Previous Up Next