תרגול 7 חוטים Flashcards
מה הscheduler
מזמן
תהליכים או חוטים
חוטים
מה משותף בין חוטים
ומה לא
משותף מרחב זכרון
גישה לקבצים והתקני חומרה
לא משותף
רגיסטרים
ומחסנית
למה יצירת חוט יותר זול מייצירת תהליך
כי לא דורש העתקה של משאבים מסוימים כמו
טבלת הדפים
וטבלת קבצים פתוחים
מתי לא כדאי לעבוד עם חוטים
אם אנחנו במערכת עם מעבד יחיד ורוצים להריץ תהליך חישובי יכולים לסבול מתוקרה מיותרת להחלפת הקשר
תוכנית קטנה ופשוטה יכולה לסבול מתקורה מיותרת של יצירת חוט
האם יותר חוטים לתהליך יתן לו יותר זמן מעבד
לא
החתיכה שלו תתחלק בין החוטים שלו
מה צריך להגיד בקוד בשביל להשתמש בחוטים
לייבא את
<pthreads.h>
בתהליך הקימפול
Gcc ... -pthreads ....
שמוסיף את הmacros הנחוצים ומקשר עם הספריה שצריל
</pthreads.h>
איך מייצרים חוט חדש
מה מקבל מה מחזיר
פונק
pthread_create
מקבל מצביע לשמירת מזהה החוט
Arrt - הגדרות של החוט כמו אם גרעין או לא
בדך כלל נשלח null
מצביע לפונק להרצה
פרמטר להעביר לפונק
מחזיר 0 בהצלחה אחרת קוד שגיאה
עד מתי חוט ירוץ יעל מה ירוץ
ירוץ על פונק שניתן לו
יסיים כשייסים את ריצת הפונ
או עד שיריץ
Pthread_exit
עם ערך סיום
או עד שיקבל
Pthread_cancel
Pthread_self()
מה זה
חוט מריץ את זה
ומקבל מזהה של עצמו
מזהה פנימי של pthreads זה לא מהזהה של החוט
Pthread_cancel
מקבל?עושה?מחזיר?
מה יהיה ערך סיום של חוט שעשו עליו את זה
מקבל מזהה חוט מסוג pthread_t
שולח לחוט סיגנל ייחודי
Pthread_canceled ערך סיום
Pthread_join()
מה מקבל
מי יכול להריץ
מקבל מזהה חוט לחכות לסיומו
ומצביע לשמירת ערך סיום שלו
כל חוט יכול להמתין לכל חוט
גורם לשחרור מידע הניהול ברמתpthread וגם ברמת הגרעין
מתי תהליך עם חוטים מסיים את ריצתו
כשכל החוטים שלו סיימו
פעולה לא חוקית באחד החוטים
קריאה לexit מאחד החוטים
חזרה מmain בחוט הראשי
מה יכול אם החוט הראשי רוצה לצאת אבל לא רוצה שכל התהליך יסתיים מה יעשה
Pthread_exit()
לאיזה תהליכים יש חוט ראשי
לכל התהליכים אפילו אם לא יצרו חוט יהיה ראשי
נוצר בקריאה לFORK
איזה קריאת מערכת מייצרת חוט חדש
clone()
איזה חוט יכול להרוג חוט אחר
אין קשרי משפחה בחוטים כולם יכולים להרוג את כלום
איך עובד
PID
בחוטים
לכל חוט יש
PID
שונה, אבל יש מזהה לכל החוטים תחת אותו תהליך וזה הPID של החוט הראשי שהוא בעצם המזהה של התהליך.
נקרא tpid
זה בעצם מה שקריאת המערכת getpid() מחזירה
מה קורה אז כשעושים
kill(pid, signal)
על
PID
שהוא מזהה של החוט הראשי
זה מתורגם ברקע לפעולה על
PID
של כל אחד מהחוטים באותה קבוצה
פקודת מערכת gettid()
מחזיר לנו בעצם את ה
PID
האמיתי של החוט
מבחינת המשתמש זה המזהה של התהליך
במה שונה ההסתכלות של המשתמש על חוט ומערכת ההפעלה בהסתכלות על חוטים
מערכת ההפעלה מסתכלת על כל אחד מהם כתהליך נפרד
אבל זה אבסטרקטי למשתמש והוא חושב שכולם חלק מאותו תהליך ובעצם שהוא קורא ל
getpid לדוגמה
הוא מקבל את ה tpid
שברקע זה המזהה של החוט הראשי PID
מה ההבדל בין
pthread_create()
clone()
pthread_create()
זוהי פונק משתמש שקוראת ברקע ל
clone
שהיא הממשק שמערכת ההפעלה מציעה ליצירת חוטים
clone()
מה מקבלת
מצביע לפונקציה שצריכה להריץ
פרמטר להעביר לפונקציה
מצביע לראש המחסנית של התהליך החדש - כתובת במרחב המשתמש כי זו קריאת מערכת המשתמש לא מכיר מחסנית גרעין בכלל
- מחסנית גדלה מלמעלה למטה ולכן צריך להעביר את הכתובת האחרונה של המחסנית
דגלים - מוסברים בכרטיסיה נפרדת
איזה דגלים clone מקבלת
CLONE_VM הרם לשתף את מרחב הזכרון
CLONE_FILE האם לשתף את טבלת הקבצים הפתוחים
CLONE_FS האם לשתף מידע על מיקום נוכחי במערכת קבצים ועוד..
CLONE_PARENT האם התהליך החדש יהיה אותו אב כמו לקורא או שהוא יהיה בן של הקורא
CLONE_THREAD האם התהליך החדש הוא חלק מקבוצת החוטים כלומר אותו tgid
מה CLONE_THREAD גורר?
דגל ודגל
CLONE_PARENT
יהיה להם את אותו אב משותף
בתוך הגרעין
באיזה פונקציה משתמשת
sys_clone
do_fork()
האם כל החוטים באותה קבוצה רצים על אותו מעבד
לא בהכרח
יכולים להתפצל
מה האנגלוגיה לשימוש במנעולים
חדר עם מפתח
בשביל להכנס לחדר צריך להכנס ולנעול את הדלת
שיוצאים משאירים את המפתח על הדלת
מה זה mutex
מנעולים ב pthreads
mutex ראשי תיבות
matual exlusion
מניעה הדדית
איך נועלים מנעול בpthreads
ציין גם איך מאתחלים
pthread_mutex_t m;
pthread_mutex_init(m, mutex_type (typicly null))
pthread_mutex_lock(&m)
pthread_mutex_unlock(&m)
מה קורה עם חוט מנסה לתפוס mutex נעול
ומה קורה שמנסה לתפוס spinlock
מה היתרון בכל אחד מהמקרים
הוא עובר להמתנה mutex
יתרון בזמני המתנה ארוכים
spinlock - busy waiting לא יוצא להמתנה
יתרון בזמני המתנה קצרים שלא נרצה לבזבז זמן על החלפת הקשר
האם busy waiting
בspinlock
יגרור אי החלפת הקשר?
תהיה הפקעה לבסוף בסוף פיסת הזמן שהוקצתה להתליך
איזה עוד פעולות אפשר לעשות על mutex חוץ מאתחול נעילה ושחרור?
pthread_mutex_trylock - מנסה לנעול את המנעול אם לא מצליח יחזיר שגיאה וכך לא נצא להמתנה
pthread_mutex_destory - פינוי בסוף השימוש
יכשל אם נעול
איזה פעולות יצרו התנהגות לא מגודרת בmutexes
נעילה חוזרת של מנעול נעול
שחרור מנעול עי חוט שלא מחזיק בו
שחרור מנעול לא נעול
מהי פקודת מכונה אטומית
בחד מעבדי
ומרובה מעבדי
איך אני יכול להפוך פקודת מכונה לאטומית
פקודה אשר מעדכנת את המעבד ואת הזכרון ללא עדכונים אחרים בזמן ריצתה
מעבד יחיד = כל פקודה היא אטומית
מרובת מעבדים - כל פקודה יכולה לכלול התערבות חיצונית של שאר המעבדים לכן נרצה להפוך אותה לאטומית
עי הוספת קידמת lock
לדוג
lock; inc x
(++ atomicly)
איזה פונקציה אטומית מוצעת בקוד הגרעין לשינוי ובדיקת ערך אטומי לכתובת בזכרון או רגיסטר?
באיזה פקודת מכונה היא משתמשת
test_and_set_bit()
BTS
שהיא פקודה בx64