Smart-World Surf

יחידה 4: סנכרון תהליכים

פתרון בעיות גישה למשאבים משותפים בין תהליכים.
מצב מרוץקטע קריטימנעולים (Mutex)סמפוריםצג (Monitor)בעיות סנכרון קלאסיות

יחידת "סנכרון תהליכים" עוסקת באחד האתגרים המרכזיים במערכות הפעלה מודרניות: ניהול גישה למשאבים משותפים בין תהליכים או תהליכונים (threads) הפועלים במקביל. הבנה מעמיקה של נושא זה חיונית למניעת שגיאות לוגיות, הבטחת עקביות נתונים ויעילות המערכת. יחידה זו תסקור את המושגים המרכזיים, מנגנוני הסנכרון ואתגרי התכנון הנפוצים בתחום.

הצורך בסנכרון: בעיית הגישה למשאבים משותפים

כאשר מספר תהליכים או תהליכונים ניגשים ומשנים נתונים משותפים במקביל, עלולות להיווצר בעיות של חוסר עקביות. הבעיה המרכזית היא מצב מרוץ.

מצב מרוץ (Race Condition): מצב שבו מספר תהליכים ניגשים למשאב משותף (נתון, קובץ, התקן) ומנסים לשנות אותו בו-זמנית, כאשר התוצאה הסופית תלויה בסדר הלא-דטרמיניסטי שבו פעולותיהם מתבצעות. מצב זה מוביל לרוב לשגיאות לוגיות קשות לאיתור.

כדי למנוע מצבי מרוץ, יש להבטיח שרק תהליך אחד יוכל לגשת למשאב המשותף בפרק זמן נתון. אזור הקוד שבו מתבצעת גישה למשאב משותף נקרא קטע קריטי.

קטע קריטי (Critical Section): קטע קוד שבו תהליך ניגש למשאב משותף (לדוגמה, משנה משתנה גלובלי, כותב לקובץ, משתמש בהתקן). יש להבטיח שרק תהליך אחד יוכל לבצע את הקטע הקריטי בכל רגע נתון (הדרה הדדית - Mutual Exclusion).

דרישות לפתרון בעיית הקטע הקריטי:

  • הדרה הדדית (Mutual Exclusion): אם תהליך אחד מבצע את הקטע הקריטי שלו, אף תהליך אחר לא יוכל לבצע את הקטע הקריטי שלו.
  • התקדמות (Progress): אם אף תהליך לא מבצע את הקטע הקריטי שלו, ויש תהליכים שרוצים להיכנס לקטע הקריטי, רק התהליכים שאינם בקטע הקריטי יכולים להשתתף בהחלטה איזה תהליך ייכנס הבא, והחלטה זו לא יכולה להידחות ללא הגבלת זמן.
  • המתנה חסומה (Bounded Waiting): קיימת חסימה על מספר הפעמים שתהליכים אחרים יכולים להיכנס לקטע הקריטי לאחר שתהליך מסוים ביקש להיכנס אליו ולפני שבקשתו נענתה. מונע רעב (starvation).

מנגנוני סנכרון מרכזיים

מערכות הפעלה מציעות מגוון כלים להבטחת סנכרון תהליכים. נתמקד בשלושה מהנפוצים ביותר:

מנעולים (Mutex Locks)

מנגנון סנכרון בסיסי המספק הדרה הדדית. מנעול יכול להיות במצב "נעול" (locked) או "פתוח" (unlocked). תהליך שרוצה להיכנס לקטע קריטי מנסה לנעול את המנעול. אם הוא נעול, התהליך ממתין. כשהוא פתוח, התהליך נועל אותו ונכנס לקטע הקריטי. בסיום, הוא משחרר את המנעול. פשוט ויעיל לקטעים קריטיים יחידים.

Mutex (Mutual Exclusion): מנגנון סנכרון המבטיח שרק תהליך אחד יוכל לגשת למשאב משותף בכל רגע נתון. פועל כמו מפתח יחיד לדלת: רק מי שמחזיק בו יכול להיכנס.

סמפורים (Semaphores)

מנגנון סנכרון כללי יותר ממנעול. סמפור הוא משתנה שלם (integer variable) שניתן לגשת אליו רק באמצעות שתי פעולות אטומיות: wait() (או P()) ו-signal() (או V()). סמפור יכול לשמש להדרה הדדית (סמפור בינארי) או לסנכרון מורכב יותר, כמו הגבלת מספר הגישות למשאב (סמפור סופר). מאפשר שליטה על מספר המשאבים הזמינים.

סמפור (Semaphore): משתנה שלם המשמש לסנכרון, הנגיש רק באמצעות פעולות אטומיות wait() ו-signal(). יכול להיות בינארי (0 או 1) או סופר (כל מספר שלם חיובי).

צגים (Monitors)

מבנה תכנותי ברמה גבוהה יותר, המאגד נתונים משותפים ופרוצדורות המטפלות בהם. הצג מבטיח הדרה הדדית באופן מובנה: רק תהליך אחד יכול להיות פעיל בתוך הצג בכל רגע נתון. צגים כוללים גם משתני תנאי (condition variables) המאפשרים לתהליכים להמתין לתנאי מסוים ולהתעורר כאשר התנאי מתקיים. מפשט את כתיבת קוד הסנכרון.

צג (Monitor): מבנה תכנותי המאגד נתונים משותפים ופרוצדורות לטיפול בהם, ומבטיח הדרה הדדית אוטומטית. כולל משתני תנאי לסנכרון מורכב.

בעיות סנכרון קלאסיות

הבנת בעיות סנכרון קלאסיות חיונית ליישום נכון של מנגנוני סנכרון. הן מדגימות את האתגרים ומספקות תבניות לפתרון בעיות אמיתיות.

בעיית היצרן-צרכן (Producer-Consumer Problem)

תהליכים יצרנים מייצרים פריטים ומכניסים אותם למאגר משותף בגודל סופי. תהליכים צרכנים מוציאים פריטים מהמאגר וצורכים אותם. יש לסנכרן את הגישה למאגר כך שהיצרן לא ינסה להכניס פריט למאגר מלא, והצרכן לא ינסה להוציא פריט ממאגר ריק.

בעיית הפילוסופים הסועדים (Dining Philosophers Problem)

N פילוסופים יושבים סביב שולחן עגול, ובין כל שני פילוסופים יש מזלג אחד. כל פילוסוף צריך שני מזלגות כדי לאכול. הבעיה מדגימה מצב שבו גישה למשאבים משותפים עלולה להוביל למצב של קיפאון (Deadlock).

קיפאון (Deadlock): מצב שבו שני תהליכים או יותר ממתינים זה לזה לשחרור משאב, וכתוצאה מכך אף אחד מהם אינו יכול להתקדם. זוהי בעיה קריטית במערכות מבוזרות ומקביליות, והבנת התנאים להיווצרותה (הדרה הדדית, החזק והמתן, אי-הפקעה, המתנה מעגלית) חיונית למניעתה.

בעיית הקוראים-כותבים (Readers-Writers Problem)

מספר תהליכים רוצים לגשת למאגר נתונים משותף. חלקם הם "קוראים" (רק קוראים את הנתונים) וחלקם "כותבים" (משנים את הנתונים). מותר למספר קוראים לגשת במקביל, אך רק כותב אחד יכול לגשת בכל רגע נתון, ואף קורא לא יכול לגשת בזמן שכותב פעיל. הבעיה מדגימה את הצורך בסנכרון מורכב יותר, תוך התחשבות בסוגי הגישה השונים.

שאלות לדיון

  • הסבר את ההבדל העיקרי בין מנעול (Mutex) לסמפור (Semaphore) בינארי, ומתי תעדיף להשתמש בכל אחד מהם.
  • כיצד צגים (Monitors) מפשטים את תכנות הסנכרון בהשוואה לשימוש ישיר בסמפורים? אילו יתרונות וחסרונות יש לגישה זו?
  • תאר מצב מרוץ פוטנציאלי ביישום בנקאי שבו שני לקוחות מנסים למשוך כסף מאותו חשבון בו-זמנית. כיצד ניתן למנוע זאת באמצעות קטע קריטי ומנעול?
  • הסבר את ארבעת התנאים ההכרחיים להיווצרות קיפאון (Deadlock). האם מניעת אחד מהם מספיקה כדי למנוע קיפאון? נמק.

נקודות לתשובת מודל

  • הבנת מצב מרוץ וקטע קריטי: היכולת לזהות מצבי מרוץ ולהגדיר קטעים קריטיים היא הבסיס לכל פתרון סנכרון.
  • הדרה הדדית: הבנת חשיבותה כעיקרון יסוד בסנכרון.
  • הבחנה בין מנגנונים: ידע מעמיק על Mutex, Semaphores ו-Monitors, כולל יתרונות, חסרונות ושימושים אופייניים לכל אחד. היכולת להשוות ביניהם ולבחור את הכלי המתאים לבעיה נתונה.
  • פתרון בעיות קלאסיות: היכרות עם בעיות היצרן-צרכן, פילוסופים סועדים וקוראים-כותבים, והבנת הפתרונות האפשריים להן (לרוב באמצעות סמפורים או צגים).
  • התמודדות עם קיפאון (Deadlock): הבנת הגורמים לקיפאון, דרכי מניעה, הימנעות, זיהוי ושחזור. זהו נושא מרכזי במבחנים.
  • מושגים נלווים: רעב (Starvation), היפוך עדיפויות (Priority Inversion).
מצאתם טעות או שחסר משהו?
→ הקודמת
תזמון מעבד
הבאה ←
מבוי סתום (Deadlock)