מנעול (תוכנה)

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

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

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

דרך פעולה[עריכת קוד מקור | עריכה]

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

דוגמה לשימוש[עריכת קוד מקור | עריכה]

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

1. התהליך קורא מהזיכרון את הערך שבמקום X
2. התהליך מגדיל את הערך ב-1
3. התהליך כותב למקום X את הערך החדש

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

תרחיש ראשון: ללא שימוש במנעול (תוצאה שגויה):[עריכת קוד מקור | עריכה]

1. תהליכון א' קורא מהזיכרון את הערך שבמקום X
2. תהליכון א' מגדיל את הערך ב-1
3. תהליכון ב' קורא מהזיכרון את הערך שבמקום X
4. תהליכון ב' מגדיל את הערך ב-1
5. תהליכון ב' כותב למקום X את הערך החדש
6. תהליכון א' כותב למקום X את הערך החדש

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

תרחיש שני: שימוש במנעול: (תוצאה תקינה)[עריכת קוד מקור | עריכה]

1. תהליכון א' מבצע נעילה
2. תהליכון א' קורא מהזיכרון את הערך שבמקום X
3. תהליכון א' מגדיל את הערך ב-1
4. תהליכון א' כותב למקום X את הערך החדש
5. תהליכון א מבצע שחרור
6. תהליכון ב' מבצע נעילה
7. תהליכון ב' קורא מהזיכרון את הערך שבמקום X
8. תהליכון ב' מגדיל את הערך ב-1
9. תהליכון ב' כותב למקום X את הערך החדש
10. תהליכון ב' מבצע שחרור

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

ראו גם[עריכת קוד מקור | עריכה]