תהליכים ב- UNIX
Transcription
תהליכים ב- UNIX
Principles of Structure of Operating Systems עקרונות מבנה מערכות הפעלה מערכת ההפעלה -UNIXסקירה מצגת מס' 2 תהליכים בUNIX - היחידה הפעילה ב UNIX-היא התהליך. כל תהליך מריץ תוכנית יחידה. מאחר שכל אחד יכול להריץ מספר תהליכים ,אזי יתכן מצב בו ירוצו תהליכים רבים במקביל ,אפילו בזמן שהמשתמש לא מריץ דבר, רצים תהליכי מערכת הנקראים "שדים" .תהליכים אלו מתחילים לרוץ עם עליית המערכת. • "שד" טיפוסי הוא CROMשרץ פעם בדקה ,בודק אם יש עבורו עבודה ,אם כן מבצע אותה וחוזר לישון ,אחרת חוזר לישון עד הפעם הבאה שירוץ. • CROMטוב לתזמן זמנים ,לשליחת עבודות לשעה מסוימת וכדומה" .שדים" אחרים אחראיים על דואר אלקטרוני ,ניהול תור של מדפסת ,בדיקה האם יש מספר דפים פנויים בזיכרון. עץ תהליכים בUNIX - לתהליך שממנו נוצר תהליך אחר קוראים תהליך אב, לתהליך החדש קוראים בן. בדרך-כלל ,האב מגדיר או מוריש משאבים ותכונות לבניו קבצים פתוחים ניתנים לשיתוף בין האב לבן .אם קובץ היה פתוח אצל ההורה לפני קריאת ,FORKהוא ימשיך להיות פתוח עבור הבן וההורה לאחר מכן. האב יכול להמתין לבנו ,לסיים ,או להמשיך לרוץ במקביל. בסופו של דבר מאחר שיכולים להיות הרבה ילדים וגם להם ילדים נבנה עץ של תהליכים. התהליך INIT • עם עליית המערכת עולה התהליך .INITתהליך זה קורא מספריית /ETC/TTYSמה מספר המסופים\כניסות שיש למערכת .ואינפורמציה לגבי כל אחת מהכניסות. לאחר מכן משאיר בן בכל כניסה ,שמפעיל את תוכנית ,LOGINוהולך לישון עד שאחד המסופים ינסה להיכנס לעבודה. בכל מסוף מופיע , LOGINלאחר ה LOGIN -נתבקש להקיש סיסמא ,הסיסמא תיבדק בספריה ETC/PASSWD/ אם הסיסמא נכונה ,ה LOGIN -יפעיל את מעטפת המשתמש. התהליך INIT יצירת תהליכים בfork() :UNIX- • יוצר ומאתחל .PCB • מיצר מרחב כתובות חדש ,ומאתחל אותו עם העתק מלא של מרחב הכתובות של האב. • מאתחל משאבי גרעין לפי משאבי האב (למשל ,קבצים פתוחים) – באג נפוץ הוא שכיחת סגירת קבצים פתוחים של האב אצל הבן • • • שם את ה PCB-בתור המוכנים עכשיו יש שני תהליכים ,אשר נמצאים באותה נקודה בביצוע אותה תוכנית. שני התהליכים חוזרים מה :fork – הבן ,עם ערך 0 – האב ,עם מספר התהליך ( )pidשל הבן int main(int argc, )char **argv { ;)(int child_pid = fork { )if (child_pid == 0 printf(“Son of %d is %d\n”, ;))(getppid(),getpid ;return 0 { } else printf(“Father of %d is %d\n”, ;))(child_pid,getpid ;return 0 } יצירת תהליכים בfork():UNIX- כאשר )( forkמופעל נעשית פניה לגרעין על מנת שימצא מקום פנוי בטבלת התהליכים, אם מוצא אזי מעתיק את כל האינפורמציה של ההורה לכניסה של הבן. לאחר מכן מקצה זיכרון לתהליך הבן מעתיק את הסגמנטים של האב. ואז תהליך הבן מוכן לרוץ. יצירת תהליכים ב Unix -ישנן שתי צורות להריץ תוכניות: הרצה בחזית foreground ><command • מתבצעת ע"י כתיבת הפקודה: • פקודה המורצת בחזית גורמת ל prompt -להיעלם עד לסיום הפקודה ולכן לא נוכל להקליד פקודה נוספת כל עוד הפקודה הנוכחית לא הסתיימה • בחזית יכולה להתבצע פקודה אחת לכל היותר הרצה ברקע background & ><command • מתבצעת ע"י כתיבת הפקודה בתוספת &: >gcc Calc.c -o Calc הפקודה מורצת בחזית. & >gcc Calc.c -o Calc > הפקודה מורצת ברקע. על מנת לבצע מספר תוכניות בו זמנית יש להריצן ברקע. לאחר תחילת ביצוע פקודה ברקע מופיע הפרומפט וניתן לתת למערכת פקודות נוספות שתתבצענה במקביל לפקודה שהורצה ברקע ניהול תהליכים בעזרת הפקודה jobsניתן לבדוק אילו תהליכים קיימים בshell- – סימן ה "+"-מייצג את התהליך ה"נוכחי" – התהליך שהוא ברירת המחדל לפקודות שנציג בהמשך – סימון ה "-"-מייצג את ה"יורש" – התהליך שיקבל את סימן ה "+"-אחרי שהתהליך הנוכחי יסיים את ריצתו < more forever.c )(main { ;)"printf("I am going to run forever !!!\n ; )while (1 } & > forever [1] 587 !!! > I am going to run forever > jobs [1] + Running forever > kill -9 %1 > [1] Killed forever >jobs [1] + Running cc prog.c [2] - Running troff -me big_doc.roff פקודות נוספות המאפשרות הצגה של התהליכים שקיימים כרגע הן ps :ו.top- ניתן למצוא את המידע בקבצי ה man-שלהן העברת תהליכים לחזית fg [jobIDs] .[ לחזיתjobIDs] • מעבירה את התהליך הנוכחי או > more try_input.c main() { char str[20]; printf("I shall try to eat something"); scanf("%s" , str); printf("%s" , str); } > try_input& [1] 828 > I shall try to eat something [1] + Suspended (tty input) try_input > jobs [1] + Suspended (tty input) try_input > fg %1 try_input goodies goodies > העברת תהליך לרקע bg [jobIDs] [ לרקעjobIDs] • מעבירה את התהליך הנוכחי או > jobs [1] + Suspended > bg %1 [1] forever & > jobs [1] Running > forever forever השעיית תהליך תהליך מושעה ניתן להעביר. משעה את התהליך המתבצע כרגע בחזית- Ctrl-z .bg אוfg לחזית או לרקע ע"י שימוש בפקודות jobIDs משעה אתstop jobIDs הפקודה > nroff -ms report Ctrl-z [1] + Suspended <bg % nroff > emacs & [1] 982 > forever& [2] 991 > jobs [1] + Running emacs [2] - Running forever > stop %2 > [2] + Suspended (signal) forever > jobs [1] - Running emacs [2] + Suspended (signal) forever > • • הריגת תהליך • • - Ctrl-cהורג את התהליך המתבצע כרגע בחזית הפקודה kill -9 jobIDהורגת את התהליך .jobID &< forever [1] 660 !!! > I am going to run forever > kill -9 %fo > jobs > • למרות שמה האכזרי ,פקודת killמשמשת באופן כללי לשליחת הודעות .בפועל שתי ההודעות הנפוצות ביותר שאנו שולחים לתהליכים הן "תמות" ()SIGTERM ו"תמות תכף ומייד!" (.)SIGKILL • הפרמטר לפקודת ,killבנוסף למזהה התהליך ,הוא " ,"-nכאשר nהוא מספר מזהה של הודעה .אם לא מוסיפים מספר ,ברירת המחדל היא שליחת ההודעה שמזוהה עם המספר " – 15תמות" .ההודעה שמזוהה עם המספר 9היא "תמות תכף ומייד!" .ההבדל בן שתי ההודעות היא ש"תמות" מאפשרת לתהליך להרוג את עצמו בצורה מסודרת (כמו ביצוע סגירה של המחשב על ידי לחיצה על הכפתור shut downבמערכת ההפעלה) ואפילו להתעלם מההוראה ,ואילו "תמות תכף ומייד!" הורגת את התהליך תכף ומייד (כמו ביצוע סגירה של המחשב על ידי ניתוק מהחשמל) קשר בין תהליכים PIPE .1 ניתן לסנכרן בין התהליכים משום שאם תהליך מנסה לקרוא מצינור שלא הגיע ממנו מידע אזי הוא יחסם עד שהמידע יהיה זמין. .2פסיקות תוכנה • תהליך יכול לשלוח לתהליך אחר ,SIGNALהתהליך המקבל יכול להתעלם או לתפוס אותו ולהגדיר מה לעשות אתו ,או להרוג את התהליך (ברירת מחדל). • אם הוחלט לתפוס אותו ,אזי חייב להגדיר פרוצדורה שנקראת .SIGNAL HANDLINGלאחר סיום הטיפול בסיגנל התהליך יחזור לנקודה אחרי הנקודה בה הוא פנה לפונקצית הטיפול בפסיקות. • תהליך יכול לשלוח סיגנלים רק לתהליכים הנמצאים יחד עמו ב- GROUP PROCESSשכוללים את הוריו וילדיו. UNIX Scheduler המתזמן בUNIX -מבוסס על האלגוריתם .multilevel queue המבנה בנוי בצורה שבתור הראשון נמצאים המשימות בעלות העדיפות הגבוהה ביותר (תור זה בנוי לפי משטר עדיפות ) בשאר התורים בנויים על פי משטר (R.Rכאשר גודל ה TQמשתנה ביניהם ) UNIX Scheduler תהליך שרץ ב USER MODE -מקבל ערך חיובי ,תהליך בגרעין מקבל ערך שלילי( .ערך שלילי בעל עדיפות גבוהה יותר ) .תהליך יכול לרוץ יחידת זמן אחת ,או עד שהוא נחסם .בכל CLOCK מורדת עדיפות לתהליך ב .1 -ואז הוא עובר לתור בעל עדיפות נמוכה יותר. חישוב העדיפות בכל פעם נעשית בצורה הבאה: priority = CPU_usage + nice + base כאשר : • = CPU_usageמייצגת את המספר הממוצע של תקתוקי השעון בכל שנייה שהייתה התהליך במהלך בעבר מספר שניות. • =NICEהוא ערך בין -20ל( 20 -ברירת המחדל .)0 קריאת מערכת NICEיכולה לשמש כדי להגדיר ערך זה 0-20 =Baseהוא פרמטר מערכת בקוד המקור UNIX • מתזמן ב UNIXמכריח את ה CPUלטפל בעדיפות בתהליך החוזר מחסימה עקב פעולת I/Oכדי לסיים את התהליך ע"י העברת התהליך לתור בעל עדיפות הגבוהה ביותר . יישום תהליכים • לכל תהליך יש חלק שנקרא USERוחלק שנקרא .KERNEL חלק הגרעין מתחיל לפעול רק שמתרחשת קריאת מערכת. לגרעין יש מחסנית ומונה ,והוא מכיל שני מבנים השייכים לתהליך: PROCESS TABLE USER STRUCTURE. PROCESS TABLE PROCESS TABLEקיימת כל הזמן ומכילה אינפורמציה על כל התהליכים ,כולל אלו שלא נמצאם כרגע בזיכרון. טבלת התהליכים מכילה את הקטגוריות הבאות: א- SCHEDULING PARAMETERS .עדיפות ,זמן CPUזמן שינה. ב - MEMORY IMAGE .מצביעים לSTACK ,DATA , TEXT- .SEGMENT ג .סיגנלים – אלו סיגנלים התקבלו ,אלו חסומים ,מאלו מתעלמים ואלו נשלחו. ד , MISCELLANEOUS .שונות – מצב נוכחי של תהליך ,אירועים שממתינים להם אם יש ,הזמן הנותר לסיום PID ,PID ,של הורה, זיהוי המשתמש וקבוצת המשתמש. USER STRUCTURE מכיל אינפורמציה שלא זקוקים לה כשהתהליך לא בזיכרון. המידע הנמצא ב USER STRUCTURE -הוא: א .רגיסטרים – שמירת ערך האוגרים. ב .מצב קריאת מערכת – מידע על קריאות המערכת כולל פרמטרים ותוצאה. ג– FILE DESCRIPTOR TABLE .כאשר מתרחשת קריאת מערכת ,מתקבל מידע לגבי קריאת המערכת המשמש כאינדקס לטבלה הזו ,וזאת כדי לאחסן את ה I-NODE -הקשור לקובץ. ד – ACCOUNTING.מצביע לטבלה המכילה מידע על המשתמש וזמן CPUשל תהליך. ה .מחסנית הגרעין – מכיל מידע לשימוש הגרעין של התהליך. שאלת מה"ט בנושא תהליכים במערכת UNIXניתן להריץ מס' תוכניות בו זמנית . כיצד ניתן להורות למערכת להריץ שתי עבודות בו זמנית ( אחת מהן רצה ברקע ) . מה המנגנון ב UNIXשבאמצעותו ניתן לתזמן תוכניות שונות . פרט תשובתך שאלת מה"ט בנושא תהליכים מהו ה PROCESSהראשון שעולה ב ? UNIX מה תפקידו ? מה קורה עם "הורגים" ( ) KILLלתהליך זה ?