תרגול מס' נושא התרגיל: איתותים, זימון תהליכים ב- UNIX. בתרגיל זה נלמד: איתותים-שליחה וקבלה זימן תהליכים ב- UNIX אנליזה של multiprogramming system Signals.1 איתותים - 1.1. מבוא האיתות הוא מנגנון אסינכרוני שמשמש לצורך העברת הודעות לתהליכים. SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGIOT SIGEMT SIGFPE SIGKILL SIGBUS SIGSEGV SIGSYS SIGPIPE SIGALRM SIGTERM SIGUSR1 SIGUSR SIGCLD SIGPWR שם hangup interrupt quit illegal instruction trace trap IOT instruction EMT instruction floating point exception bus error segmentation violation bad argument in system call write on a pipe with no reader alarm software termination death of a child power failure ברירת המחדל לא ניתן לשינוי ignore ignore הצבה אחרי האיתות נשאר נשאר נשאר
1.. מקור האיתותים = ע> ע> = "י הגרעין, בעקבות ארועים מוגדרים מראש: פסיקת חומרה (חריגות חמרה, שעון, נפילת מתח) חריגת גרעין בקריאות מערכת (פרמטרים, pipe ללא מוצא) מות תהליך בן ארועי מסוף ארוע Debug "י תהליך באמצעות קריאת המערכת sig) kill(pid, (ראה סעיף הבא). 1.. שליחת איתות ע"י תהליך int kill (int pid, int sig) שליחת איתות נעשית ע"י שימוש בקריאת המערכת: אשר שולחת את האיתות sig לתהליכים המזוהים ע"י.pid במקרה של כישלון מוחזר 1-. :pid> האיתות נשלח לתהליך בודד. :pid= האיתות נשלח לתהליכים שה- (group ID) GID שלהם הוא ה- GID של השולח. :pid=-1 אם השולח,SuperUser האיתות נשלח לכל התהליכים, אחרת האיתות נשלח לכל התהליכים שה- UID האמיתי שלהם זהה ל- (user ID) UID האפקטיבי של השולח..GID=abs(pid) האיתות נשלח לתהליכים עם :pid1 שימו לב: בכל מקרה, תהליך יכול לשלוח סיגנלים רק לתהליכים בעלי UID הזהה לשלו (למעט תהליכי ה-.(super user 1.. אופן שליחת האיתות בטבלת התהליכים, לכל תהליך יש וקטור עם דגל לכל סוג איתות array).(bit הגרעין מדליק את הביט המתאים לסוג הסיגנל בוקטור המצוי ב- entry process table של התהליך שאמור לקבל איתות זה. במידה והתהליך ישן ב- priority interruptible ה, - kernel מעיר אותו. בשל מבנה ה- array bit אין לתהליך יכולת לדעת כמה סיגנלים בדיוק קיבל מכל סוג.
1.. טיפול באיתות באזור ה- u area של כל תהליך נמצא וקטור הטיפול בסיגנלים fields).(array of signal handler זהו וקטור של מצביעים לשגרות הטיפול בכל סוגי הסיגנלים. תהליך מטפל בסיגנלים אך ורק כאשר התהליך חוזר מ- kernel mode ל- mode.user כאשר תהליך מקבל סיגנל שתוכנת עבורו טיפול, הגרעין יחזיר למצב ברירת מחדל את ה- signal handler field המתאים לסיגנל המטופל. משמעות הפעולה זו היא לגבי הסיגנל הבא מאותו הסוג שישלח לתהליך. במידה ולא יאותחל מחדש (בתוך ה- handler (signal הוקטור שאופס בידי ה- kernel, הסיגנל הזהה הבא יגרום לביצוע ברירת מחדל ) בד"כ.( לסיכום, סדר הפעולות בטיפול בסיגנל: 1. במעבר מ- kernel mode ל- user mode התהליך בודק את ה- bit array של הסיגנלים בכניסה שלו בטבלת התהליכים.. במידה וקיבל סיגנל, התהליך מאפס את המקום המתאים ב array.bit. התהליך ניגש לוקטור הטיפול בסיגנלים הנמצא ב- user area שלו, ושומר את המצביע לפונקצית הטיפול ) נניח ) )f ).. לפי סוג הסיגנל, אם נדרש, התהליך מציב בוקטור הטיפול (במקום המתאים לסיגנל שהתקבל) את פונקצית ברירת המחדל של הסיגנל.. התהליך מבצע את פונקצית הטיפול ) )f. 6. התהליך ממשיך לבצע את הפקודות שלו, כאילו חזר כרגיל ל-.user mode 1.6. סוגי תגובה עבור כל סיגנל (חוץ מ- SIGKILL ) ניתן לקבוע את אופן התגובה של התהליך לקבלת הסיגנל: ברירות המחדל () התהליך יגיב באפון שיקבע לפי סוג הסיגנל. אופן התגובה יכול להיות: א. סיום התהליך. ב. בהשהיית התהליך. ג. התעלמות. התעלמות (SIG_IGN) התהליך מתעלם מהסיגנל. הערה: במצב זה, התהליך לא יציב בוקטור הטיפול בסיגנלים לאחר קבלת הסיגנל. ולכן, התהליך יתעלם מסיגנלים כל עד לא הוצב ערך שונה מ- SIG_IGN בוקטור הטיפול בסיגנלים. פונקצית משתמש SigNum) void SignalCatcher(int התהליך יפעיל פונקציה זו כאשר יתקבל הסיגנל. במצב זה, התהליך יציב בוקטור הטיפול בסיגנלים בקבלת הסיגנל (לפני הפעלת פונקצית הטיפול). מפני שפונקציה זו רצה ב- mode,user התהליך עלול לקבל סיגנלים נוספים תוך כדי ביצוע פונקצית הטיפול. מה הבעיה? (רמז:.(race ישנם סיגנלים עבורם לא יוצב אלא ישמר הערך הקודם (ראה טבלה 1.1). ניתן לקבוע את התגובה באמצעות *function) signal(sig, (ראה סעיף הבא). לא ניתן לתפוס את האיתות.SIGKILL
1.7. הצבת פונקצית תגובה הגדרת הפונקציה שתטפל באיתות כלשהו נעשית ע"י שימוש בקריאת המערכת: oldfunction = signal (int sig, void (*function)()) העברת בתור הכתובת תגרום לתגובת ברירת המחדל.( ) העברת 1 בתור הכתובת תגרום לחוסר תגובה.(SIG_IGN 1) הערה: השמה SIG_IGN עבור SIGCLD אינה מומלצת, ותגרום לקריאת המערכת wait לחכות עד שכל תהליכי הבנים יסתיימו, ותחזיר 1-. #include <signal.h> 1.8. דוגמא void f(void) { } void sigcatch(int n) { printf( caught sig %d\n,n); (1); } void main(void) { int i; int *ip; } ip = (int*)f; for (i=; i< ; i++) signal (i, sigcatch); *ip = 1; // WARNING: we can get SIGBUS printf( affter assign to ip\n ); f(); // WARNING: we will get SIGILL if 1 is an illegal command עבור קומפילציה עם סגמנט קוד/נתונים משותף נקבל SIGILL ב- ()f. אחרת נקבל SIGBUS בהצבה.*ip=1 1.9. המתנה לאירוע המתנה לאירוע נעשית ע"י קריאת המערכת,pause() הגורמת להשהיית ביצוע התהליך עד לקבלת איתות כלשהוא.
. זימון תהליכים ב- UNIX..1 מושגים תזמון תהליכים - קביעת התהליך הבא לריצה. - Time slice/quantum פרק זמן מקסימלי על לתזמון מחדש זמן ריצה של תהליך - משך הזמן בו התבצע התהליך עד כה. - Scheduler אובייקט במערכת ההפעלה הקובע ומריץ את התהליך הבא לריצה. - Clock tick יחידת זמן בסיסית במחשב. עדיפות של תהליך - לכל תהליך מיוחסת עדיפות אשר קובעת את מקומו בתור השייך לתהליכים המוכנים לריצה. העדיפות מורכבת מעדיפות קבועה ועדיפות דינמית המחושבת על פי זמן הריצה של התהליך (ככל שזמן הריצה גדול יותר יורדת העדיפות הדינמית)... קביעת עדיפותו של תהליך קיימות שלוש רמות עדיפות : 1. עדיפות Kernel גבוהה - לתהליכים הרצים ב.Kernel mode. עדיפות Kernel נמוכה - לתהליכים הרצים ב.Kernel mode. עדיפות - User לתהליכים הרצים ב.User mode בכל Clock tick מתעדכן מונה בשם CPU השייך לתהליך הנוכחי אשר מתבצע במחשב. בכל Time slice מתעדכנים המונים של כל התהליכים באופן הבא : CPU = CPU/ חישוב עדיפותו של תהליך ב : User mode Priority = CPU/ + Base_priority ככל שהתוצאה גבוהה יותר כך העדיפות נמוכה יותר. בתהליכי User ה Base_priority גדול מערך עדיפות ה Kernel הגדולה ביותר ולכן תמיד ירוצו תהליכי Kernel לפני תהליכי.User ניתן (אם רוצים) להריץ תהליכים בעדיפות נמוכה, ניתן לקרוא לפונקצית המערכת nice(val) ולשנות את ה.Base_priority חישוב עדיפות התהליך יהיה אז : Priority = CPU/ + Base_priority + val
6 דוגמה : 1 במהלך הדוגמה נתון כי : Time Slice = 6 Clock Ticks Base_priority = 6 שני תהליכים A ו B רצים שניהם ב.User mode שני התהליכים התחילו באותו זמן כאשר תהליך A נכנס ראשון לריצה. Clock Ticks 1 6 7 8 9 1 11 1 1 1 1 16 17 18 19 6 7 67 78 Prior A CPU 1 < - 6 1 < - 6 7 < - 7 6 6 7 67 Prior B CPU 1 < - 6 1 < -
7 דוגמה : כעת מה היה קורה אם תתהליך B היה מורץ עם nice() (כלומר.(Base_priority=8 Clock Ticks 1 6 7 8 9 1 11 1 1 1 1 16 17 18 19 6 7 8 71 Prior A CPU A 1 < - 6 6 7 8 < - 9 < - 8 8 8 9 Prior B CPU B 1 < - 6
8. שאלת חזרה: א. בזימון תהליכים ב UNIX קיימת פונקצית דעיכה (decay) שמופעלת על מונה זמן ה CPU של כל תהליך. בוורסית system V של UNIX הפונקציה היא /x f(x) = איך ישפיע שינוי פונקצית הדעיכה ל /x f(x) = על זימון התהליכים?.1. איך ישפיע שינוי פונקצית הדעיכה ל f(x) = x על זימון התהליכים? ב. סעיף זה מתייחס לזימון תהליכים preemptive שעושה שימוש ב quantum (למשל (round-robin במערכת בעל מס' גדול של תהליכים שרובם אינטראקטיביים עדיף quantum? נמק בקצרה. גדול או קטן.1. אותה שאלה לגבי מערכת עם מס' גדול של תהליכי batch (כלומר מקבלים נתונים בתחילת ריצתם, למשל מקובץ, ומחזירים תשובות, למשל לקובץ אחר, בסיום ריצתם, ללא אינטראקציה עם משתמשים).
9. שאלת חזרה: במערכת תהליכים מסוג, I ו- תהליכים מסוג C, כאשר : כל תהליך מסוג I מבצע איטרציות, כאשר כל אחת מהן כוללת חישוב הצורך יחידת זמן 1, ולאחריו, פעולת I/O למשך 99 יחידות זמן. לאחר מכן מבצע התהליך חישוב אחרון הצורך יחידת זמן 1. כל תהליך מסוג C מבצע חישוב הצורך יחידות זמן. כל התהליכים מוכנים לריצה בזמן, כאשר תהליכי I הגיעו לתור המוכנים לפני תהליכי C. המערכת מסוגלת לטפל בפעולות ה- I/O של תהליכי I במקביל. זמן ה- Context Switch זניח. שאלה: מצאו סדר זימון אופטימלי מבחינת זמן סיום פעולת התהליכים. ציינו את זמן סיום פעולת התהליך האחרון מכל סוג. הנחיה : ניתן להשתמש ב-. Preemption 1 6 8 1 פתרון: נשתמש ב-. preemptive SJF Preemption I 1 I I I I C 1 C C C C 1 1 1 7 9 I 1 I I I I C C 6 C 7 C 8 C 9 C 1 1 I 1 I I I I 1 C 1 7 9 C 11 C 1 C 1 C 1 C 1 1 I 1 I I I I C 1 6 8 C 16 C 17 C 18 C 19 1 I 1 I I I I C
1 שאלה : מתי יסתיים ביצוע התהליכים כאשר מדיניות התזמון היא? FCFS I 1 - I C 1 - C I 1 - I 1 I 1 - I 1 6 פתרון: 6I 1 - I 61 7 I 1 - I 71 שאלה : מתי יסתיים ביצוע התהליכים כאשר מדיניות התזמון היא RR ו - time-slice=1? הנחה : במידה ותהליך I ותהליך C מגיעים באותו זמן, תהליך I יוכנס ראשון לתור התהליכים הממתינים. 6 1 I 1 - I C 1 - C C 1 - C C 1 - C C 1 - C 8C 1 - C פתרון: 1 119 11 1 1 17 1 C 1 - C 1 I 1 C 1 I C 16 I C 17 I C 18 I C 19 C 1C 1 - C 1C 1 - C 17C 1 - C 19C 1 - C 1C 1 - C 8 1 7 1 C 1 - C 8 I 1 C 9 C 1 I C 11 C 1 I C 1 C 1 I C 1 C 16 I C 17 - C C 1 - C 7C 1 - C 9C 1 - C 1C 1 - C C 1 - C 7 61 6 69 7 8 C 1 - C I 1 C - C I C 6 - C 8 I C 9 - C 11 I C 1 -C 1 I C 1 - C 8 7 C 1 - C C 1 - C I 1 61 I 6 I 69 7 I I 7
11 Analysis of Multiprogramming System Performance. CPU utilization = 1- p n p portion of time processes are waiting for I/O. n Number of processes. דוגמא לניתוח מערכת batch בעזרת המודל הנ"ל: נניח מרכז מחשבים בו פרק זמן ההמתנה הממוצע של תהליכים ל- I/O הוא 8 אחוז. התהליכים 1 הגיעו בזמנים הבאים: Job 1 זמן CPU דרוש (דקות) זמן הגעה 1: 1:1 1:1 1: נחשב את עומס ה- CPU בתלות במספר התהליכים: 1 CPU IDLE.8.6.1.1 CPU BUSY..6.9.9 CPU / PROCESS..18.16.1 מהטבלה האחרונה ניתן לחשב את זמני הביצוע של התהליכים השונים:..9.9.8.8.8.....9.9.9.1.1.7 1 1 8. 7.6