פעולה אטומית

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

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

הצורך בפעולה אטומית עריכה

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

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

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

תרחיש ראשון (תקין) עריכה

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

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

תרחיש שני (תוצאה שגויה) עריכה

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

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

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

פעולות אטומיות נפוצות עריכה

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

  • קידום – הוספת 1 (increment) או החסרת 1 (decrement) מיחידת זיכרון.
  • השמה – החלפת ערך ביחידת זיכרון לערך חדש.
  • השוואה והחלפה – החלפת ערך ביחידת זיכרון לערך חדש רק אם יש ערך מסוים ביחידת הזיכרון לפני ההחלפה. פעולה זו יכולה להיכשל.
  • פעולות אריתמטיות – הפעלת פעולה אריתמטית על יחידת זיכרון (כגון הוספה, החסרה, הכפלה וכדומה).
  • פעולות ביטים – הפעלת פעולת ביטים על יחידת זיכרון (כגון AND, OR, XOR וכדומה).

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

ראו גם עריכה

קישורים חיצוניים עריכה

הערות שוליים עריכה