תרגול 2 וחלק מ3 Flashcards
כמה מצבים יכול להיות לתהליך
ומה הם
3
Ready
Running
Waiting
מה ההבדל בין תוכנית להתליך
תוכנית זה הקוד
תהליך זה הביצוע של הקוד
PID
ומה הגודל שלו?
המזהה של תהליך
הגודל שלו בלינקוס הוא 32 ביט
מה הבעיה בהסתמכות על
PID
מסויים? לדוגמה קוד שמוודא ש
PID
מסויים סגור כל כמה דקות
PID מתמחזר
לכן יכול להיות שעוד כמה דקות הוא יהיה בשימוש של תהליך אחר
PID = 0 מי זה
זה התהליך ה
IDLE
מעביר את המעבר למצב שינה וחוסך חשמל
PID = 1 מי זה
זה התהליך ה
INIT
מאתחל את שאר התהליכים במערכת
מה זה FORK
קריאת מערכת
מייצרת תהליך חדש
שממשיך באותה נקודה כמו התהליך שעשה לו
FORK
עבור תהליך האב יחזור המזהה של תהליך הבן
עבור תהליך הבן יחזור 0 ככה הוא גם יודע שהוא הבן
ערכי החזרה אפשריים FORK
-1 בעת שגיאה
0 לתהליך הבן
מזהה תהליך הבן לתהליך האב
קריאת מערכת WAIT
וערכי חזרה אפשריים
נקראת ע”י תהליך אב
מחכה עד שתהליך בן כלשהו יסיים
תחזיר את הערך חזרה של תהליך הבן שהסתיים
אם אין בנים או שכולם כבר הסתיימו ולא זומבים יחזור -1
תהליך זומבי
תהליך שהסתיים
מחכה שהאב שלו יעשה עליו
WAIT
לאחר מכן יסתיים
WAITPID קריאת מערכת
קריאת מערכת עבור תהליך אב לחכות לבן מסויים שיסתיים
אפשר גם להוסיף אליו אופציות
קריאת מערכת EXIT
מסיימת את הריצה של התהליך
כמו כן מגדירה את ערך החזרה של התהליך
לאחריה התהליך הופכת לזומבי ומחכה שיעשו עליה
WAIT
גודל סטטוס התהליך שהסתיים
8 ביט
מה קורה לזומבי יתום?
התהליך הראשי
INIT
מאמץ אותו
EXECV קריאת מערכת
FORK משכפלת את התהליך
אבל אנחנו צריכים לייצר תהליכים חדשים שיריצו קוד שונה מהקוד של התהליך המשוכפל
EXECV
מקבלת נתיב לקובץ קוד
היא טוענת אותו ומריצה אותו בתהליך
כמו כן מצרפת את הארגיומטים להרצה של התוכנית
קריאת מערכת
GETPID GETPPID
ומה ההבדל ביניהם
GETPID - מחזיר את המזהה של התהליך עצמו
GETPPID - מחזיר את המזהה של האבא הישיר שלי
מה זה אומר ש
GETPPID = 1
זה אומר שהתליך בן הוא יתום
כלומר האבא שלו סיים את הריצה ולא חיכה לו
רשימת תהליכים
רשימה מקושרת דו כיוונית שהראש שלה הוא תהליך ה
IDLE
איזה קריאות מערכת עושות מניפולציות לרשימת תהליכים
FORK - מוסיף
EXIT - מוציא
process descriptor - PCB
STRUCT שמכיל מידע על כל תהליך
מה הקשר בין
PCB
וקריאת המערכת GETPID
GETPID פשוט קוראת
מה PCB
את השדה
PID
איפה מנהלים קשרי המשפחה בין התהליכים
ובאיזה שדות מופיע המידע
בPCB
real_parent aperent
מכיל את המזהה של תהליך האב האמיתי שלי - לדוגמה במצבי דיבוג התהליך אב שלי הוא לא באמת תהליך האב כי יש תהליך מדבג שמחכה בכל שורה בקוד
siblings
כל האחים של התהליך
כמובן שלא חשוב לתהליך אלה רק לגרעין
children
כל הבנים של התהליך
למה משתמשים ב
HASH TABLE
בניהול תהליכים?
מערכת ההפעלה משתמשת בהם כדי לחפש תהליכים הרבה יותר מהר ברשימת התהליכים
מצב תהליך - TASK_RUNNING
תהליך רץ או מוכן לריצה
מצב תהליך - TASK_ZOMBIE
התהליך סיים - כלומר קרא ל
EXIT
עדיין אף אב שלא לא עשה עליו
WAIT
מצב תהליך - TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE
TASK_INTERRUPTIBLE
התהליך במצב שהוא ממתין
לדוגמה לאחר שקרא לWAIT
ניתן לעצור את התהליך
TASK_UNINTERRUPTIBLE
מצב המתנה עמוק אי אפשר לעצור את התהליך
לדוגמה תהליך שרץ בגרעין וקורא לקובץ שהוא ממתין לפתיחה שלו הרבה זמן
איך עוצרים
TASK_UNINTERRUPTIBLE
לוחצים על הכפתור כיבוי במחשב
מצב תהליך - TASK_STOPPED
תהליך שנעצר בצורה מבוקרת - לדוגמה בתהליך דיבוג
מה מכיל תור ריצה
וכמה כאלה יש
תור של תהליכים במצב
TASK_RUNNING
לכל ליבת מעבד יש תור כזה
האם תהליך יכול להיות בו זמנית בכמה תורי ריצה
לא
רק באחד
תור המתנה
תור של תהליכים במצב
TASK_INTERRUPTIBLE
או
ASK_UNINTERRUPTIBLE
מגיעים למצב הזה לדוגמה אחרי שקראו ל
WAIT או
READ
איך מעבירים תהליך לתור הריצה
קריאת מערכת
activate_task(),
פקודת kill
פקודה בלינוקס לשליחת סיגנלים לתהליכים
מהם שני הסיגנלים שלא ניתן להתעלם מהם
SIGKILL
SIGSTOP
מה ההבדל בין
SIGKILL - SIGSTOP
KILL הורג את התהליך
STOP משהה אותו
איך מחזירים תהליך אחרי
SIGSTOP
SIGCONT
מהם הסיגנלים
USR1 USR2
2 סיגנלים לא מגוגדים
לשימוש התהליך להחליט מה הוא עושה איתם
איך מגדירים את שגרת הטיפול בסיגנל?
signal(SIGNALTYPE, handlerFUNC)
למה משמשת הפונקציה
sigprocmask()
אפשר למסך איתה את הסיגנלים שהתליך יתעלם מהם
יכול להיות רלוונטי כשאר רוצים לעשות משהו שלא יקרוס באמצע בגלל אילוצי מערכת
לדוגמה עדכון חשוב של
DB
איך shell עובד לכל פקודה
באיזה מצבים הוא יכול לעשות זה
איך זה עובד בפועל?
לכל פקודה הוא מייצר תהליך בן שיריץ את הפקודה
יכול ברקע ויכול בחזית
בחזיר מייצר תהליך בן ועושה עליו wait רק שיחזור יוכל להתקדם לקרוא את בפקודה הבאה
הרקע מייצר בן וישר ממשיך לפקודה הבאה
בפועל כן יעשה לו wait בשלב מסוים כדי לשחרר לו משאבים
מה זה demon
איך מריצים כזה
תהליך שרץ ברקע ללא התערבות משתמש
בshelll
nohum cmd&
חוץ מSIGKILL SIGSTOP
איזה עוד סינגל לא ניתן להתעלמות
SIGCONT
כי כשהוא יפעל על התהליך הוא יהיה במצב המתנה והטיפול בו יחזיר אותו לתור הריצה
אפשר להגדיר לו שגרת טיפול ומה שהיא תעשה זה ברגע שיחזור לפעולה ישר יריץ את זה
אפשר לתקשר איתו בעזרת USR1 USR2 סיגנלים
SIGCHLD
אבות מקבלים את זה בכל פעם שהבנים שלהם סיומו או שהבנים קיבלו SIGSTOP
SIGALARM
סיגנל שמקבלים אחרי הרצה של
alarm(t)
אחרי t זמן
SIGFPE
כל השגיראות האריתמתיות
SIGILL
פקודה לא חוקית
אין למשתמש פריוולגיה להריץ אותה
SIGXCUP
התראה על שימוש שעבר את הsoftlimit CPU
במעבר אמיתי של הlimit התהליך ימות
set with syscall setrlimit()
man 1 cmd
man 2 cmd
1 is for shell cmd
2 is for syscalls
איך משתמש יכול לחסום סיגנלים ואיזה יכול
הכל חוץ מSIGKILL SIGSTOP
SYSCALL:
sigprocmask(SIG_BLOCK, &mask, &orig_mask);
SIG_BLOCK (+=), SIG_UNBLOCK (-=), SIG_SETMASK (=)
מה קורה אם תהליך מקבל סיגנל באמצע read
הוא יקבל EINVAL על הקריאה
זאת דוגמה ללמה כדאי לבדוק את הערך ולנסות לקרוא שוב
מה השיטה שלמדנו לקריאה בטוחה של SYSCALLS בהרצאה
לעטוף אותן במאקרו
שיקרא לקריאת המערכת דרך
DO WHILE
ולא דרך IF כי אז
תהיה בעיה שנעטוף בעוד IF
מה ההבדל בין האופן שתהליכים מדברים לבין האופן שבו חוטים מדברים
לחוטים מרחב זכרון משותף ולכן יכולים להתקשר דרך זכרון משותף
בפועל זה יכול לייצר כאב ראש של סנכון אבל אם יש מימוש שעוטף את זה ומסתיר את זה מאיתנו זה יכול להיות יותר פשוט מתהליכים
תהליכים מתקשרים דרך פיפים או דרך סיגנלים וזה דורש הרבה קריאות מערכת וכנראה יהיה גם פחות יעיל