rep; nop意思?pause指令一样吗?rep nop(没有分号)相同?nop指令有什么区别?在另一个问题的评论中进行了一些讨论后,我意识到我不知道rep; nop;x86(或x86-64)汇编中的含义.而且我也无法在网上找到一个好的解释.
我知道这rep是一个前缀,意味着"重复下一个指令cx时间"(或至少它是,在旧的16位x86汇编中).根据这一维基百科汇总表,似乎rep只能与使用movs,stos,cmps,lods,scas(但也许是对新的处理器去掉这个限制).因此,我认为rep nop(没有分号)将重复nop操作cx时间.
然而,经过进一步搜索,我更加困惑.它似乎rep; nop并pause 映射到完全相同的操作码,并且pause有一些不同的行为nop.2005年的一些旧邮件说不同的东西:
有了这些不同的意见,我无法理解正确的含义.
我正在尝试创建一个自旋锁的哑版.浏览网页时,我在x86中遇到了一个名为"PAUSE"的汇编指令,该指令用于向处理器提供当前在此CPU上运行自旋锁的提示.英特尔手册和其他可用信息说明了这一点
在大多数情况下,处理器使用此提示来避免内存顺序违规,从而大大提高了处理器性能.因此,建议在所有自旋等待循环中放置PAUSE指令.文档还提到"等待(一些延迟)"是指令的伪实现.
上段的最后一行很直观.如果我没有成功抓住锁,我必须等待一段时间然后再抓住锁.
但是,在旋转锁定的情况下,内存顺序违规是什么意思?"内存顺序违规"是否意味着旋转锁定后指令的错误推测加载/存储?
关于堆栈溢出之前已经询问了自旋锁定问题但是内存顺序违规问题仍未得到解决(至少对于我的理解).
暂停指令通常用于测试自旋锁的循环,当一些其他线程拥有自旋锁时,以缓解紧密循环.据说这相当于一些NOP指令.有人能告诉我它是如何适用于自旋锁优化的吗?在我看来,即使是NOP指令也浪费了CPU时间.它们会降低CPU使用率吗?
另一个问题是我可以将暂停指令用于其他类似目的.例如,我有一个忙线程,它不断扫描一些地方(例如队列)以检索新节点; 但是,有时队列是空的,线程只是在浪费cpu时间.睡眠线程并通过其他线程唤醒它可能是一个选项,但线程是关键的,所以我不想让它睡觉.可以暂停指令工作以减轻CPU使用率吗?目前它使用100%cpu的物理核心?
谢谢.