能力值:
(RANK:50 )
2 楼
印象中大多数指令是原子操作的,但是似乎有些指令不是……具体可能得翻遍手册的每一个角落才能查明白……
具体想不起来了,就记得几个描述符是有“隐藏”部分的
能力值:
( LV8,RANK:120 )
3 楼
所有的机器指令是都原子操作,且在机器指令的执行过程中,是不会被中断的。cpu会在每条指令“执行阶段的最后时刻”检测是否有中断请求,如果有,且中断请求的优先级较高,那么才转而去处理这个中断请求。
cpu执行程序的最小单位是“指令周期”,包括取值周期,间指周期,执行周期和中断周期。不过间址周期和中断周期不一定包含在没个指令中期中。
更详细的可以参考唐朔飞《计算机组成原理第二版》p342.
能力值:
( LV4,RANK:40 )
4 楼
CPU的指令寄存器把整条指令送入运算区,待执行完后再根据新esp值圧入新指令,如果切换线程的指令都没执行,又怎么被中断?
能力值:
( LV2,RANK:10 )
5 楼
谁跟你说所有的机器指令都是原子操作的?
在x86体系下只有一部分指令是原子操作的:比如向对齐地址mov[Vol3 8.1.1 Guaranteed Atomic Operations]
还有一部分需要用LOCK前缀锁总线才行:ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, CMPXCHG16B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, and XCHG[Vol2 3.2.LOCK]
剩下的指令就都不是原子操作了,难道rep movsb也是原子操作?
CPU执行程序的最小单位就是单条指令.CPU可以在内部分多级流水线执行,但是这不能说是执行程序的最小单位,而是执行指令的最小单位.这就好比我们吃饭的最小单位是一口而不是一个蛋白质分子
能力值:
( LV8,RANK:120 )
6 楼
[QUOTE=誓言剑;1243469]谁跟你说所有的机器指令都是原子操作的?
在x86体系下只有一部分指令是原子操作的:比如向对齐地址mov[Vol3 8.1.1 Guaranteed Atomic Operations]
还有一部分需要用LOCK前缀锁总线才行:ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG...[/QUOTE]
对,我的表述的确有问题。我是对单核而言的。真正的表述应该是这样:
硬件级的原子操作:在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只发生在指令边缘(即中断周期)。在多处理器结构中(Symmetric Multi-Processor)就不同了,由于系统中有多个处理器独立运行,即使能在单条指令中完成的操作也有可能受到干扰。在X86平台生,CPU提供了在指令执行期间对总线加锁的手段。CPU上有一根引线#HLOCK pin连到北桥,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。对于其他平台的CPU,实现各不相同,有的是通过关中断来实现原子操作(sparc),有的通过CMPXCHG系列的指令来实现原子操作(IA64)。
综上,说每条机器指令都是原子操作并无不可,因为在多核中可以使用前缀“LOCK”锁来确保每一条指令都是原子的。当然也有可能是因为我没看到过“可以中断的机器指令”,你要有例子的话,感谢分享。
对于cpu执行程序的最小单位是“单条指令”还是“指令周期”我个人认为后者更为恰当,因为单条指令只是一个笼统的概念,它并不能揭示cpu在执行过程中的真正过程。其实两者都是一个意思,但是后者更加详细的揭露了单条指令是如何执行的,因为单条指令的执行也要分取值,间址等阶段。
从你的意思来看,是认为 单条指令 = n 个指令周期,所以才会做出“一口饭”和“蛋白质分子”的比喻。我认为是不恰当的,建议你认真看一下什么是指令周期。
PS:(正确的理解应该是 单条指令的执行 = 1个指令周期)
能力值:
( LV2,RANK:10 )
7 楼
我已经在#5列出了所有可以使用LOCK前缀的指令,除此以外的都不能使用这个前缀,也都不能保证是原子操作.
不使用LOCK的话只有如下行为是被保证为原子操作的:
• Reading or writing a byte
• Reading or writing a word aligned on a 16-bit boundary
• Reading or writing a doubleword aligned on a 32-bit boundary
• Reading or writing a quadword aligned on a 64-bit boundary
• 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
• Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
抱歉,第二个问题我在看的时候想的是时钟周期和多级流水线去了.但我们所说的是执行程序的最小单位,就程序而言它们只有指令这个概念而没有指令周期这个概念
能力值:
( LV8,RANK:120 )
8 楼
感谢指正!不过关于执行的最小单位,我还是坚持自己的观点。当然,其实两者都是一个意思,只是看的角度不一样而已。