Reg*_*ser 5 c operating-system atomicity
我正在尝试理解原子和非原子操作.关于操作系统以及关于C.根据维基百科页面这里
考虑一个简单的计数器,不同的进程可以递增
非原子
天真的非原子实现:
读取内存位置的值;
在值上加一个;
将新值写回内存位置.
现在,想象两个进程正在运行递增单个共享内存位置:
第一个进程读取内存位置中的值;
第一个进程为值添加一个;
但是在它可以将新值写回内存位置之前它被暂停,并允许第二个进程运行:
第二个进程读取内存位置的值,与第一个进程读取的值相同;
第二个过程为值添加一个;
第二个进程将新值写入内存位置.
如何将上述操作作为一种毒性操作.我对原子操作的理解是任何不间断执行的东西都是原子的.所以举个例子
int b=1000;
b+=1000;
Run Code Online (Sandbox Code Playgroud)
根据我的理解应该是一个原子操作,因为两个指令都是在没有中断的情况下执行的,我从某个人那里学到了在C中没有任何已知的原子操作,因此上面两个语句都是非原子的.所以我想要理解的是,当涉及到编程语言而不是操作系统时,原子性是什么?
int b = 1000;
b+=1000;
Run Code Online (Sandbox Code Playgroud)
在指令级别变成多个语句。至少,准备一个寄存器或存储器,分配1000,然后获取该寄存器/存储器的内容,将内容加1000,并将新值(2000)重新分配给该寄存器。如果没有锁定,操作系统可以在该操作中的任何时刻挂起进程/线程。此外,在多进程系统上,当您的操作正在进行时,不同的处理器可以访问该内存(在这种情况下不是寄存器)。
当您锁定(这就是如何使此原子化)时,您在某种程度上通知操作系统不能挂起此进程/线程,并且该内存不应被其他进程访问。
现在,上面的代码可能会被编译器优化为将 2000 简单分配给 b 的内存位置,但出于本答案的目的,我忽略了这一点。