- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
硬件提供原子指令,如测试和设置、比较和交换、加载链接存储条件。这些是特权指令吗?也就是说,只有操作系统才能执行它们(因此需要系统调用)吗?
我以为他们没有特权,可以在用户空间调用。但是http://faculty.salina.k-state.edu/tim/ossg/IPC_sync/ts.html似乎另有建议。但是,futex(7) ,在某些条件下,可以在没有系统调用的情况下实现锁定,这意味着它必须在没有特权的情况下执行指令(如测试和设置)。
矛盾?如果是这样,哪个是正确的?
最佳答案
该页面有误。它似乎声称无锁原子操作通常在 ISA 上享有特权,但事实并非如此。我从未听说过原子测试和设置或任何其他无锁操作需要内核模式。
如果是这样的话,它需要 C++11 lock-free atomic read-modify-write operations编译为系统调用,但它们不适用于 x86、ARM、AArch64、MIPS、PowerPC 或任何其他普通 CPU。 (试试 https://godbolt.org/ )。
这也会使“轻量级”锁定(试图在没有系统调用的情况下获取锁)变得不可能。 ( http://preshing.com/20111124/always-use-a-lightweight-mutex/ )
普通 ISA 允许用户空间执行原子 RMW 操作,在线程之间甚至不同进程之间共享的内存上。我不知道为用户空间禁用原子 RMW 的机制x86。即使在任何 ISA 上有这样的东西,也不是正常的操作模式。
只读或只写访问通常在所有 ISA 上的对齐位置自然是原子的,直到一定宽度(Why is integer assignment on a naturally aligned variable atomic on x86?),但原子 RMW 确实需要硬件支持。
在 x86 上,TAS 是 lock bts
,它是无特权的。 (Documentation for the lock
prefix)。 x86 具有范围的其他原子操作选择,例如lock add [mem]、reg/immediate
、lock cmpxchg [mem]、reg
、甚至 lock xadd [mem], reg
在需要返回值时实现 fetch_add
。 ( Can num++ be atomic for 'int num'? )
大多数 RISC 都有 LL/SC,包括 ARM、MIPS 和 PowerPC,以及所有不再常见的旧 RISC ISA。
futex(2)
是一个系统调用。如果您调用它,它所做的一切都在内核模式下。
这是轻量级锁定使用的后备机制,以防存在竞争,它提供操作系统辅助的 sleep /唤醒。因此,在用户空间中执行任何操作的不是 futex
本身,而是围绕 futex
构建的锁实现可以避免在无竞争或低竞争情况下进行系统调用。
(例如,在用户空间中旋转几次以防锁可用。)
这就是 futex(7)
手册页所描述的内容。但我觉得如果你实际上不进行系统调用,将其称为“futex 操作”有点奇怪。我猜它是在内存上运行的,内核代码可能会代表其他正在等待的线程查看内存,因此在用户空间代码中修改内存位置的必要语义取决于 futex
。
关于linux - 测试和设置(或其他原子 RMW 操作)是任何体系结构上的特权指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52133228/
我想用我的 C# 应用程序创建一个文件夹。我正在写代码,对我来说一切正常,但我的 friend 得到一个错误 Access to the path 'myfolder' is denied. 那我怎么
我遇到了这个非常大的工具,然后深入研究了一些不太漂亮的文档和/或购买了 ebook : 我只想问: Apache Nutch 如何处理 javascript 繁重的网站,以及它如何获取页面? 我的意思
在MySQL中,如何只撤销DROP DATABASE权限,而不撤销DROP TABLE权限? 最佳答案 只需为单个表分配 DROP 权限,而不是为整个数据库分配权限。 关于MySQL DROP DAT
我有一个 bash 脚本可以备份我的数据文件 (~50GB)。脚本基本上是这样的: sudo tar /backup/mydata1 into old-backup-1.tar sudo tar /b
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我在 Google 的 Cloud Composer 上运行 Airflow。我正在使用 KubernetesPodOperator并希望通过 gcsfuse 将谷歌存储桶挂载到 pod 中的目录中.
我需要从客户端机器加载一个 CSV 文件到 MySQL 服务器数据库。我正在尝试 LOAD DATA INFILE。 我的困惑是关于使用所需的访问权限- 加载数据文件- 加载数据本地 INFILE 之
我目前正在尝试在 Amazon Redshift 中创建一个新的只读用户。 我使用的 Redshift 版本是: PostgreSQL 8.0.2 on i686-pc-linux-gnu, comp
我正在尝试将 RackSpace 中的 MySQL 数据库 备份到 AWS。 我听从了这个 blog 的建议并在我的 AWS RDS 控制面板中设置了 log_bin_trust_function_c
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to force my .NET App to run as administrator on Wi
我是一名优秀的程序员,十分优秀!