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

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

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

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

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

ראו גם
------

* מנעול (תוכנה)
* סמפור (מדעי המחשב)
* פעולה בוליאנית

קישורים חיצוניים
----------------

* הצעה לפעולות אטומיות כחלק מהתקן הבא של שפת ++C
* פעולות אטומיות במערכת ההפעלה חלונות

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

1. ↑  bus lock

| תחומים במדעי המחשב |
| --- |
| יסודות מתמטים | לוגיקה מתמטית • תורת הקבוצות • תורת המספרים • תורת הגרפים • תורת הטיפוסים • תורת הקטגוריות • אנליזה נומרית • תורת האינפורמציה |
| תורת החישוביות | תורת האוטומטים • תורת הרקורסיה • תורת הסיבוכיות • מחשוב קוונטי |
| אלגוריתמים ומבנה נתונים | אנליזה של אלגוריתמים • גאומטריה חישובית |
| שפות תכנות ומהדרים | מפרש • פרדיגמת תכנות (תכנות פרוצדורלי • תכנות מונחה עצמים • תכנות פונקציונלי • תכנות לוגי) |
| חישוב מבוזר ועיבוד מקבילי | עיבוד מקבילי • מחשוב סריגי • בקרת מקביליות |
| הנדסת תוכנה | ניתוח מערכות מידע • עיצוב תוכנה • תכנות מחשבים • שיטות פורמליות • בדיקות תוכנה • מתודולוגיית פיתוח תוכנה |
| תקשורת | ניתוב • טופולוגיית רשת • קריפטוגרפיה |
| מסד נתונים | מסד נתונים יחסי • SQL • תנועה • אינדקסים • כריית מידע • CAP theorem |
| בינה מלאכותית | חשיבה אוטומטית • בלשנות חישובית • ראייה ממוחשבת • עיבוד שפה טבעית • בינה חישובית • מערכת מומחה • למידה חישובית • רובוטיקה |
| גרפיקה | הדמיה ממוחשבת • הנפשה ממוחשבת • עיבוד תמונה |
| שפות פורמליות | שפה רגולרית • שפה חסרת הקשר • שפה תלוית הקשר • ההיררכיה של חומסקי |
| שימושים במדע | ביואינפורמטיקה • מדעים קוגניטיביים • כימיה חישובית • פיזיקה חישובית • אנליזה נומרית |