300 likes | 657 Views
מערכות הפעלה. תרגול 3 – תהליכים, תאום תהליכים. מה בתכנית?. תאום תהליכים – המשך עדיפויות תהליכים ב- UNIX. תאום תהליכים. תאום תהליכים – למה לתאם?. סינכרון פעולות בין תהליכים מניעה הדדית – מנגנונים המבטיחים שרק תהליך אחד מבצע פעילות מסוימת הגנה על משאב משותף
E N D
מערכות הפעלה תרגול 3 – תהליכים, תאום תהליכים
מה בתכנית? • תאום תהליכים – המשך • עדיפויות • תהליכים ב-UNIX מערכות הפעלה - תרגול 3
תאום תהליכים מערכות הפעלה - תרגול 3
תאום תהליכים – למה לתאם? • סינכרון פעולות בין תהליכים • מניעה הדדית – מנגנונים המבטיחים שרק תהליך אחד מבצע פעילות מסוימת • הגנה על משאב משותף • דוגמה: מדפסת, CD, זכרון, מסד נתונים • הגנה על קוד משתמש משותף (קטע קריטי) מערכות הפעלה - תרגול 3
קטע קריטי (critical section) • קטע קריטי הוא קטע קוד שמבוצע רק על ידי תהליך אחד בו זמנית • מבנה: shared section trying/entry section critical section exit section • דוגמה – בנק הפועלים מהתרגול הקודם מערכות הפעלה - תרגול 3
קטע קריטי (critical section) • קטע קריטי הוא קטע קוד שמבוצע רק על ידי תהליך אחד בו זמנית • מבנה: shared section trying/entry section critical section exit section • דוגמה – בנק הפועלים מהתרגול הקודם מערכות הפעלה - תרגול 3
קטע קריטי (critical section) אין הרעבה –> אין קיפאון אבל ההיפך אינו נכון תכונות רצויות: • רק תהליך אחד נמצא בקטע קריטי (מניעה הדדית – mutual exclusion) • אם יש בקשות לקטע הקריטי אזי לפחות תהליך אחד נכנס לקטע הקריטי (אין קיפאוןno deadlock) • הוגנות(fairness)- אם תהליך מבקש להכנס לקטע הקריטי אזי יצליח בסופו של דבר (אין הרעבהno starvation) מערכות הפעלה - תרגול 3
קטע קריטי (critical section) • אטומיות- פעולה (סדרת פקודות) של תהליך אחד מבוצעת ללא חפיפה עם פעולה (סדרת פקודות) של תהליך אחר • מניעה הדדית (ביצוע סדרת הפקודות בתוך קטע קריטי) הינה דרך להבטיח אטומיות באמצעות תוכנה אבל לא הדרך היחידה... אפשר גם בחומרה מערכות הפעלה - תרגול 3
קטע קריטי (critical section) semaphore lock; ... read_security_code(screen); amount = read_amount(screen); wait(lock)// acquire lock balance = get_balance(account); balance -= amount; // 50K-20K put_balance(account, balance); return balance; // = 30K קטע קריטי signal(lock) // release lock show_balance(screen, balance); ... מערכות הפעלה - תרגול 3
דוגמאות לבעיות בתחום תאום תהליכים • כותבים/קוראים • המספרה והספר הישן • הפילוסופים הסועדים מערכות הפעלה - תרגול 3
בעיית כותבים/קוראים • מוטיבציה: גישה למסד הנתונים • שני סוגי תהליכים – קוראים וכותבים • כמה קוראים ביחד יכולים לגשת למסד נתונים בו זמנית • כותב אחד בלבד יכול לגשת בו זמנית קוראים כותב מערכות הפעלה - תרגול 3
בעיית כותבים/קוראים int readers = 0 // # of reading processes semaphore rc_access = 1; // controls access to rc semaphore db = 1; // controls database access void reader(void){ while(TRUE){ wait(rc_access); readers = readers + 1; if(readers == 1) wait(db); signal(rc_access); read_data_base(); wait(rc_access); readers = readers - 1; if(readers == 0) signal(db); signal(rc_access); } } void writer(void){ while(TRUE){ wait(db); write_data_base() signal(db) } מי ירוץ יותר – קוראים או כותבים? מערכות הפעלה - תרגול 3
בעיית כותבים/קוראים • אף קורא לא מחכה אם הגישה למסד נתונים היא לא בידי הכותב (סמפור db) • אם קוראים חדשים מגיעים כל הזמן ומחזיקים בסמפור db– הרעבה של כותב • עדיף לדרוש תנאי: אף כותב לא מחכה עם הוא "מוכן" – אם כותב מחכה אף קורא נוסף לא יכול להתחיל לקרא מערכות הפעלה - תרגול 3
המספרה, או בעיית הספר הישן • קיים ספר אחד ו-N כסאות ללקוחות שמחכים • אם אין לקוחות אז הספר יושב בכיסא וישן (כמו בתמונה) • כשמגיע לקוח חדש והספר ישן הוא יעיר את הספר • כשהלקוח מגיע והספר עסוק הוא ישב על אחד הכסאות, אם קיים כיסא פנוי, אחרת (הכל מלא) הוא יעזוב מערכות הפעלה - תרגול 3
בעיות שעלולות להתעורר: • לקוח מגיע, רואה שהספר עסוק, מתיישב ומחכה. כשהו בדרכו להתיישב, הספר מסיים את התספורת והולך לבדוק את חדר ההמתנה. מאחר ואין שם אף אחד הוא חוזר לישון. • שני לקוחות מגיעים באותו זמן, רואים שהספר עסוק, רואים שיש כיסא אחד פנוי ומנסים להתיישב. שנייהם ינסו להתיישב באותו כיסא. מערכות הפעלה - תרגול 3
המספרה, או בעיית הספר הישן int customers = 0; access = semaphore(1); customer = semaphore(0); barber = semaphore(0); void customer (void) { while(TRUE){ wait(access); if (customers>=CHAIRS) { signal(access); leave_shop(); } customers +=1; signal(access); signal(customer); wait(barber); getHairCut(); wait(access); customers -=1; signal(access); } } void barber (void) { while(TRUE){ wait(customer); signal(barber); cutHair(); } } מערכות הפעלה - תרגול 3
הפילוסופים הסועדים • חמישה פילוסופים מעבירים את זמנם באכילה ומחשבה • כל פילוסוף צריך 2 מזלגות כדי לאכול • פילוסוף לא יכול לקחת יותר ממזלג אחד בו זמנית * פילוסוף – תהליך, מזלג - משאב מערכות הפעלה - תרגול 3
הפילוסופים הסועדים האם הכל בסדר? • void philosopher() { • while(1) { • think(); • get_left_fork(); • get_right_fork(); • eat(); • put_left_fork(); • put_right_fork(); • } • } אם כל פילוסוף יבחר במזלג שמאלי באותו זמן אף אחד לא הולך לאכול... אף פעם! סכנה של Deadlock! מערכות הפעלה - תרגול 3
הפילוסופים – מה עושם? קח מזלג מצד שמאל. אם המזלג מצד ימין פנוי קח אותו גם. אם לא, תחזיר מזלג שלקחת, חכה ונסה שוב. 2 בעיות: • אם כל הפילוסופים מחכים אותו פרק זמן – חוזרים לאותו מצב כמו קודם • אם הזמנים הם שונים עדיין ייתכן ויהיה פילוסוף חסר מזל שישאר רעב (במובן המילולי והטכני) מערכות הפעלה - תרגול 3
אז מה בכל זאת? • רעיון: להשתמש בגורם נוסף שממנו יבקשו משאבים, והוא לא ירשה לקחת מזלג חמישי. מערכות הפעלה - תרגול 3
הפילוסופים הסועדים ולבעיה האמיתית... מערכות הפעלה - תרגול 3
עדיפויות תהליכים מערכות הפעלה - תרגול 3
עדיפויות תהליכים • עדיפות משפיעה על תדירות ההכנסה של תהליך לריצה פעילה ועל מיקומו בתור התהליכים המחכים למעבד • גדרת עדיפות גבוהה לתהליך מבטיחה שירוץ ללא הפרעות מצידם של תהליכים עם עדיפות נמוכה (למשל, אנטיוירוס) • במ"ה מודרניות עדיפויות יכולות להשתנות בזמן ריצה של התהליך כתלות בהתנהגותו מערכות הפעלה - תרגול 3
תהליכים עם עדיפויות זהות ריצת תהליכים ב-CPU תור תהליכים 2 1 3 2 2 0 A 1 A 3 1 2 1 0 2 2 B 1 1 2 2 2 0 3 A 2 1 2 3 0 2 1 A 3 1 2 0 2 B 2 1 0 2 3 A 1 0 2 זמן תהליך במעבד מערכות הפעלה - תרגול 3
תהליכים עם עדיפויות שונות pid1 – עדיפות20 , pid2- עדיפות 20, 3pid – עדיפות 21 ריצת תהליכים ב-CPU תור תהליכים 1 1 2 2 2 0 B 1 1 2 2 2 0 3 1 1 2 2 0 2 2 0 A A 1 1 A 1 0 2 A 1 2 0 2 1 A 1 0 2 זמן מערכות הפעלה - תרגול 3
יצירת תהליכים עם עדיפויות שונות ex8.c int count1 = 0, count2 = 0, count3 = 0; xmain() { int Inc(), Pr(); resume( create(Inc, INITSTK, INITPRIO, "proc 1", 1, &count1) ); resume( create(Inc, INITSTK, INITPRIO, "proc 2", 1, &count2) ); resume( create(Inc, INITSTK, INITPRIO - 1, "proc 3", 1, &count3) ); resume( create(Pr, INITSTK, INITPRIO + 1, "proc 4", 0) ); } Inc<i> - מוסיף 1 ל-count<i> Pr – מדפיס מונים count1, count2, count3 האם ניתן למחוק sleep()? Inc(int ptr) { int *ptr1; ptr1 = (int *)ptr; while (1) (*ptr1)++; } Pr() { while(1) { sleep(3); printf("count1 = %d, count2 = %d, count3 = %d\n", count1, count2, count3); } } מערכות הפעלה - תרגול 3
יצירת תהליכים עם עדיפויות שונות ex8.c למה המספרים מודפסים עם "-"? מערכות הפעלה - תרגול 3
יצירת תהליכים עם עדיפויות שונות ex8.c unsigned longint count1 = 0, count2 = 0, count3 = 0; xmain() { int Inc(), Pr(); resume( create(Inc, INITSTK, INITPRIO, "proc 1", 1, &count1) ); resume( create(Inc, INITSTK, INITPRIO, "proc 2", 1, &count2) ); resume( create(Inc, INITSTK, INITPRIO - 1, "proc 3", 1, &count3) ); resume( create(Pr, INITSTK, INITPRIO + 1, "proc 4", 0) ); } Inc(int ptr) { unsigned long int *ptr1; ptr1 = (unsigned long int *)ptr; while (1) (*ptr1)++; } Pr() { while(1) { char str[80]; sleep(3); sprintf("count1 = %lu, count2 = %lu, count3 = %lu \n", count1, count2, count3); printf(str); } } מערכות הפעלה - תרגול 3
יצירת תהליכים עם עדיפויות שונות ex8.c מערכות הפעלה - תרגול 3
בשיעור הבא... • ממוש תהליכים ב-XINU מערכות הפעלה - תרגול 3