Loading AI tools
מוויקיפדיה, האנציקלופדיה החופשית
בתוכנה, מנעול הוא מנגנון סנכרון לכפיית מגבלות על הגישה למשאב בסביבה בה יש תהליכונים (Threads) רבים. מנעולים הם דרך לאכוף מדיניות בקרת מקביליות מסוימת.
מטרת המנעול היא למנוע התנגשויות בין התהליכונים ומצב של מרוץ תהליכים שעלול לגרום לתוצאות שגויות ובלתי צפויות. השימוש במנעול פוגע במקביליות ובביצועים, ולכן יש להשתמש במנעולים רק בנקודות הכרחיות ולצמצם את אזור הנעילה – הקטע הקריטי, סביב קטע קוד קצר ככל האפשר.
בעת הגעה לקטע קריטי, מבקש התהליכון לבצע נעילה. במידה והמנעול פנוי, הנעילה תצליח והתהליכון יוכל להתקדם. בשלב זה, כל תהליכון אחר שיגיע לקטע הקריטי ויבקש לבצע נעילה - יאלץ להמתין עד לשחרור המנעול על ידי התהליכון הנועל (בקשת הנעילה היא פעולה חוסמת). עם יציאת התהליכון הנועל מהקטע הקריטי, הוא יבצע שחרור של המנעול, ותהליכון אחר שביקש לבצע נעילה יצליח בנעילה ויכנס לקטע הקריטי.
ישנם שני סוגי מימוש למנעול, מנעול הוגן בו כל מי שמבקש לבצע נעילה נכנס לתור המתנה ומתקדם לפי מיקומו בתור, ומנעול לא הוגן שבו באופן לא צפוי מתקבלת ההחלטה מי ישתחרר, דבר שעלול לגרום להרעבה אם מישהו מחכה אך כל פעם לפני שמישהו יוצא מהקטע הקריטי מישהו חדש מנסה לשחרר את המנעול ומקבל קדימות על פני האחר[1].
להמחשת הצורך במנעול, נסתכל על הפשטה של הפקודות שמרכיבות את פעולת ההגדלה ב-1 של ערך בזיכרון (increment):
כעת נסתכל על 2 תהליכונים שמבצעים פעולת הגדלה על אותו מקום בזיכרון (כדי להבהיר את הבעייתיות, נפרט את פעולת ה increment לפקודות המרכיבות אותה).
הערך גדל לבסוף רק פעם אחת: השינוי שביצע תהליכון ב' נדרס על ידי הכתיבה לזיכרון של תהליכון א'. לכן, בסביבה עם תהליכונים רבים החולקים זיכרון, פעולת ה- increment צריכה להיות מוגנת על ידי מנעול.
השימוש במנעול פתר את השגיאה שנוצרה והביא לתוצאה הרצויה, אך גם מנע את המקביליות (תהליכון ב' לא יכול לבצע נעילה עד שתהליכון א' ביצע שחרור) ולכן פגע בביצועים.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.