יצירת תהליכים חדשים

יצירת תהליכים חדשים נעשית על ידי קריאת מערכת ההפעלה create.

כל תהליך במערכת רשאי ליצור תהליכים אחרים ללא הגבלה, ובכל עדיפות. התהליך נוצר במצב PRSUSP. התהליך הנוצר יקבל מחסנית בגודל המתבקש על ידי פרמטר, בעל העדיפות המתבקשת, השם המתבקש, וכן פרמטרים לפי הנתון המוגדר ב-create. קוד התהליך הנוצר יתחיל להתבצע בתחילת הפונקציה המועברת כפרמטר. create בודקת אם קיימת רשומה פנויה בטבלת התהליכים, בודקת את תקינות הפרמטרים, ומקצה מחסנית לכל תהליך. create יוצרת מחסנית המחקה פעולת קריאה ל-ctxsw. מכאן שכאשר תתבצע החלפת ההקשר, לא נצטרך לבצע טיפול במקרה מיוחד עבור תהליך חדשה. כאשר מסתיימת פעולת השיגרה הראשית, יש לסיים את פעולת התהליך. לכן create מחקה על המחסנית את פעולה הקריאה לפונקציה ה"קוראת" לשגרה הראשי, ושמה שם את כתובת השגרה userret. שיגרה זו מבצעת kill לתהליך הנוכחי. דגש: כאשר יוצרים תהליך חדש, והוא נהפך לפעיל בעזרת ctxsw, איננו חוזרים אל resched כאשר ctxsw מסתיימת, אלא אל הפונקציה המועברת כפרמטר.

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

נקודה למחשבה: האם לא יכול להיווצר מצב, ששני תהליכים מנסים ליצור תהליך חדש בו זמנית, ושני התהליכים החדשים מקבלים את אותו PID? התשובה היא לא. כאשר נוצר תהליך חדש, create משתמשת ב-disable על מנת לחסום זמנית את פסיקות המערכת, וכך פעולת יצירת התהליך הינה אטומית ולא יכולה להיות מופרעת בדרך.

דוגמא ליצירת תהליכים:

void prA()

{

       while (1) putc(CONSOLE, 'A');

}

void prB()

{

       while (1) putc(CONSOLE, 'B');

}

int xmain()

{

       resume(create(prA, INITSTK, INITPRIO, "proc 1", 0));

       resume(create(prB, INITSTK, INITPRIO, "proc 2", 0));

       return 0;

}

תגיות המסמך:

מאת: באסל

תודה

הסברתם את זה, כמו שאר הנושאים, באופן הכי ברור שיש.
שיתוף:
| עוד