operating-system - 什么是原子交换(寄存器和内存位置之间)指令?
问题描述
我正在研究操作系统,突然对原子交换(寄存器和内存位置之间)指令是什么感到好奇。以及如何使用它来实现锁?
解决方案
我不确定您所说的原子交换是什么意思,但也许您的意思是比较和交换指令。
- 比较和交换指令检查给定值的内存位置,如果该内存位置中的值等于给定值,则它将内存位置设置为新值。这是“原子地”完成的,这意味着当这条指令执行时,系统中没有其他东西可以执行(让我们保持这种方式),或者这条指令的执行不能被抢占。这个代码看起来像这样 -
function cas(p : pointer to int, old : int, new : int) returns bool {
if *p ≠ old {
return false
}
*p ← new
return true
}
为什么从锁定的角度来看这很重要?假设你有一个互斥“锁”并且两个线程想要访问锁,每个线程都需要检查互斥值是否为 1,如果为 1,则线程必须将其设置为 0。如果线程 1 和线程 2 都尝试同时执行此操作,然后对于指令不是原子的情况,线程 1 可能会将值视为 1。线程 1 会尝试将值设置为 0,但在到达该语句之前,它会被抢占,线程 2 然后将值设置为 0,然后线程 1 再次设置它。然后,两个线程都可以获取锁,认为它们是唯一获得锁的线程,这确实是不正确的行为。
但是,如果比较和交换是原子的,则意味着如果一个线程在上面描述的 cas 函数内,则在完成该函数的完整执行或保证执行在 1 个周期内完成之前,没有其他线程将执行。因此线程 1 会将内存位置的值更新为 0,然后线程 2 将返回 false。
推荐阅读
- sql - 在数据库中复制 csv 文件
- php - API GET 请求值无法在 PHP 中使用 curl json_decode 设置为变量和回显
- python - OpenCV 匹配图像上的多个帧
- asp.net-core-webapi - Ocelot 缓存:AddCacheManager 尝试显式指定类型参数错误
- sql-server - 将 React 集成到现有的 ASP.NET Core MVC Web 应用程序
- vue.js - 如何在 Vue Vuetify 中使用单个添加节点按钮添加树视图节点?
- rabbitmq - 如何使用 QPid 生成 basic.return
- python - PyCUDA 中的内存分配顺序是否重要?
- javascript - 数字显示为 NaN
- tensorflow - tf.keras.layers.Conv2D 获取内核值