μμμ μ°μ°(Atomic Operation)
- μμ μ΄ μ€κ°μ λκΈ°κ±°λ λ°©ν΄λ°μ§ μκ³ ν λ²μ μμ νκ² μνλλ μ°μ°μ λλ€.
- μμμ μ°μ°μ μ£Όλ‘ λμμ±(Concurrency) λ¬Έμ λ₯Ό λ°©μ§νκ³ , λ€μ€ μ€λ λ νκ²½μμ λ°μ΄ν° μΌκ΄μ±μ μ μ§νκΈ° μν΄ μ¬μ©λ©λλ€.
μμμ μ°μ°μ μ£Όμ νΉμ§
- λΉλΆν μ±:
- μμμ μ°μ°μ λ μμ λ¨κ³λ‘ λλμ΄μ§μ§ μλ μ°μ°μ λλ€. μ¦, μ°μ°μ΄ μμλλ©΄ μ€κ°μ λ©μΆκ±°λ λ€λ₯Έ μ°μ°μ΄ λΌμ΄λ€ μ μμ΅λλ€.
- μλ₯Ό λ€μ΄, x++κ³Ό κ°μ μ¦κ° μ°μ°μ΄ μμμ μ΄μ§ μμ κ²½μ°, μ¬λ¬ μ€λ λκ° λμμ xμ κ°μ λ³κ²½νλ € ν λ κ°μ΄ κΌ¬μΌ μ μμ΅λλ€. μμμ μ°μ°μ μ¬μ©νλ©΄ x++κ° μ€κ°μ λ°©ν΄λ°μ§ μκ³ μμ νκ² μ€νλ©λλ€.
- λμμ± μ μ΄:
- μμμ μ°μ°μ μ¬λ¬ μ€λ λλ νλ‘μΈμ€κ° λμμ λμΌν λ°μ΄ν°λ₯Ό μμ ν λ λ°μνλ κ²½μ 쑰건(Race Condition)μ λ°©μ§ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°μ 무결μ±μ μ μ§νλ©°, λ°μ΄ν°κ° μμμΉ λͺ»νκ² λ³κ²½λλ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
- μ±λ₯ ν₯μ:
- μμμ μ°μ°μ μΌλ°μ μΌλ‘ λ½(Lock)λ³΄λ€ λΉ λ₯΄λ©°, μ μ λΉμ©μΌλ‘ λκΈ°νλ₯Ό μ 곡ν μ μμ΅λλ€.
- λ€μ€ μ€λ λ νκ²½μμ λ¨μν λ½μ μ¬μ©νμ§ μκ³ μμμ μ°μ°μ μ¬μ©ν¨μΌλ‘μ¨, λΆνμν λκΈ° μκ°μ μ€μΌ μ μμ΅λλ€.
μμμ μ°μ°μ μμ
- λ¨μΌ CPU λͺ
λ Ήμ΄λ‘ μνλλ μ°μ°:
- νΉμ μ°μ°μ λ¨μΌ CPU λͺ λ Ήμ΄λ‘ μνλ μ μμΌλ©°, μ΄λ° μ°μ°μ λ³΄ν΅ μμμ μ λλ€. μλ₯Ό λ€μ΄, x = yμ²λΌ κ°μ λ¨μν λμ νλ μ°μ°μ λ¨μΌ CPU λͺ λ Ήμ΄λ‘ μ²λ¦¬λ μ μμ΅λλ€.
- CPU μ§μ μμμ μ°μ°:
- CPUλ λμμ± μ μ΄λ₯Ό μν μμμ μ°μ°μ μ§μν©λλ€. μλ₯Ό λ€μ΄, Test-and-Set, Compare-and-Swapκ³Ό κ°μ CPU λͺ λ Ήμ΄λ₯Ό ν΅ν΄ νΉμ λ³μμ κ°μ μμμ μΌλ‘ κ²μ¬νκ³ μμ ν μ μμ΅λλ€.
- νμ€ λΌμ΄λΈλ¬λ¦¬μ μμμ μ°μ° ν¨μ:
- λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄μμ μμμ μ°μ°μ μν λΌμ΄λΈλ¬λ¦¬λ λͺ λ Ήμ΄λ₯Ό μ 곡νλ©°, μ΄λ₯Ό μ¬μ©νμ¬ μ½κ² μμμ μ°μ°μ μνν μ μμ΅λλ€.
- μλ₯Ό λ€μ΄, C++μμλ std::atomic λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μμμ λ³μλ₯Ό λ§λ€ μ μμ΅λλ€. std::atomic<int> xμ κ°μ λ³μλ₯Ό μ μΈνλ©΄ x++, x-- μ°μ°μ΄ μμμ μΌλ‘ μνλ©λλ€.
μμμ μ°μ°μ μ¬μ© μμ
#include <atomic>
#include <iostream>
#include <thread>
std::atomic<int> counter(0); // μμμ λ³μ μ μΈ
void increment() {
for (int i = 0; i < 1000; ++i) {
counter++; // μμμ μ¦κ° μ°μ°
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Counter: " << counter << std::endl;
return 0;
}
μ μμ μμ counter++λ μμμ μ°μ°μΌλ‘ μνλμ΄, μ¬λ¬ μ€λ λκ° λμμ counter λ³μλ₯Ό μμ νλλΌλ λ°μ΄ν°μ μΌκ΄μ±μ΄ μ μ§λ©λλ€.
μμμ μ°μ°μ΄ νμν μ΄μ
- κ²½μ 쑰건 λ°©μ§:
- μμμ μ°μ°μ μ¬λ¬ μ€λ λκ° λμμ κ°μ λ°μ΄ν°λ₯Ό μμ ν λ λ°μνλ κ²½μ 쑰건μ λ°©μ§ν©λλ€.
- λ°μ΄ν° μΌκ΄μ± 보μ₯:
- μμμ μ°μ°μ μ¬μ©νλ©΄, μ°μ°μ΄ μλ£λκΈ° μ κΉμ§λ λ€λ₯Έ μ°μ°μ΄ λΌμ΄λ€ μ μκΈ° λλ¬Έμ, λ°μ΄ν°κ° μμμΉ λͺ»νκ² λ³κ²½λλ μν©μ λ°©μ§νκ³ λ°μ΄ν°μ μΌκ΄μ±μ 보μ₯ν©λλ€.
- λ°λλ½ ννΌ:
- μμμ μ°μ°μ λ½μ μ¬μ©νμ§ μκ³ λκΈ°νκ° νμν λΆλΆλ§ μμμ μΌλ‘ μ²λ¦¬νκΈ° λλ¬Έμ, λ°λλ½μ ννΌν μ μμ΅λλ€.
μμμ μ°μ°μ νκ³
- μμμ μ°μ°μ λ¨μΌ λ³μμ λν΄ μμμ±μ 보μ₯ν©λλ€. νμ§λ§ μ¬λ¬ λ³μ κ°μ 볡μ‘ν μ°μ°μμλ λ°μ΄ν° μΌκ΄μ±μ μλ²½ν 보μ₯νμ§ λͺ»ν μ μμΌλ©°, μ΄λλ μΌλ°μ μΌλ‘ λ½μ μ¬μ©ν λκΈ°νκ° νμν©λλ€.
μμ½
μμμ μ°μ°μ μ€κ°μ λ°©ν΄λ°μ§ μκ³ ν λ²μ μνλλ μ°μ°μΌλ‘, λμμ± μ μ΄μ λ°μ΄ν° μΌκ΄μ±μ μ μ§νλ λ° μ€μν μν μ ν©λλ€. μμμ μ°μ°μ μ¬μ©νλ©΄, λ€μ€ μ€λ λ νκ²½μμ λ°μ΄ν°μ μΆ©λμ λ°©μ§νμ¬ μμ μ μ΄κ³ ν¨μ¨μ μΈ νλ‘κ·Έλ¨μ ꡬνν μ μμ΅λλ€.
ν€λνμΌλ‘ μ 곡
'π« Krafton Jungle > PintOS Project2 _ User Programs' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [Pintos] Project02 _ User Programs | Keyword | Interrupt (1) | 2024.11.28 |
|---|---|
| μμ λ° λ³΄μ νμ - rax register (1) | 2024.11.28 |
| μμ λ° λ³΄μ νμ - File Descriptor (1) | 2024.11.28 |
| [Pintos] Project02 _ User Programs | Keyword | System Call (1) | 2024.11.28 |
| [Pintos] Project02 _ User Programs | Keyword | User Stack (0) | 2024.11.28 |