מנעול (תוכנה) – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
מאין תקציר עריכה
Shunram (שיחה | תרומות)
אין תקציר עריכה
שורה 1:
ב[[מדעי המחשב]], '''מנעול''' הוא מנגנון [[סינכרון (מדעי המחשב)|סינכרון]] לכפיית מגבלות על הגישה למשאב בסביבה בה יש [[תהליכון|תהליכונים]] (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. תהליכון '''ב'''' מבצע שחרור
השימוש במנעול פתר את השגיאה שנוצרה והביא לתוצאה הרצויה, אך גם מנע את המקביליות (תהליכון ב' לא יכל לבצע נעילה עד שתהליכון א' ביצע שחרור) ולכן פגע בביצועים.
==ראו גם==
*[[מנעול קריאה כתיבה]]
*[[פעולה אטומית]]
 
{{קצרמר|מחשבים}}
[[קטגוריה:הנדסת תוכנה]]