פעולה אטומית
במדעי המחשב, פעולה אטומית הינה רצף של פקודות מכונה או פקודת מכונה יחידה שיבוצעו על ידי מעבד, מבלי שיכולה להיעשות החלפת הקשר בזמן ביצוען ומבלי שרכיב אחר במחשב יוכל להבחין בכל מצב ביניים אלא רק במצב ההתחלתי או הסופי של הפעולה. חלק מהפעולות האטומיות יכולות להצליח או להיכשל ואילו אחרות תמיד מצליחות.
פעולות אטומיות מהוות לעיתים תחליף יעיל יותר לשימוש במנעולים, ועל כן אלגוריתמים חסרי נעילות נדרשים לעשות שימוש בפעולות אטומיות.
הצורך בפעולה אטומית
להמחשת הצורך בפעולה אטומית, נסתכל על הפשטה של הפקודות שמרכיבות את פעולת הקידום (הגדלה ב-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 וכדומה).
רוב הפעולות האטומיות מחזירות את הערך הקודם שהיה ביחידת הזיכרון לפני הפעולה.