各位大佬,请教一下这个问题,多核cpu下的线程切换极端情况可以实现最小值为2,这个我大概理解了,但是多核这种调度情况为什么单核不能做到,单核在调度的时候存不存在什么限制。这个问题在网上很常见,但是都没有怎么解释为什么单核为什么最小值是100.
按照汇编指令:
mov eax,dword ptr[a]
add eax,1
mov dword ptr[a],eax
麻烦帮忙解释下最小值为100时,是怎么样调度的
结果是100到200之间的某个不确定的数字。这是因为++操作并非原子性造成的。
线程1执行
mov eax,dword ptr[a]
add eax,1
以后,线程如果被中断,切换到另一个线程,并且执行了
mov eax,dword ptr[a]
add eax,1
mov dword ptr[a],eax
注意,此时ptr[a]相比线程1的eax,因为已经被+1了,所以相等
然后线程1执行以下:
mov dword ptr[a],eax
结果是实际上线程1并没有对a实现+1
这种情况会使得结果偏小。
第一个线程先执行,但是不一定等到100次a++执行完之后,第二个线程才开始执行,第二个线程的执行时间是任意的,多线程条件下线程执行时抢占式的
这里说的一组不是物理上的,而是逻辑上的,说每个线程都需要有一块地址用来做线程让出CPU所有权时保存cpu各个寄存器的值,好在线程重新拥有cpu的时候恢复运行状态。------http://bbs.csdn.net/topics/320063988 yoogera
按照这个逻辑的话,上文的调度情况就不会发生了,重新思考
这个还真不好说 建议去看下线程对CPU资源获取的问题
你可以实际看下CPU,最终资源,这个不能太确定
操作系统会给每个线程分配20ms时间运行之后进行切换,当切换回源线程时,原来在栈中存储的值将会重新赋给变量,因此当有线程间的切换时,这个变量实际上少加了几次,所以最终的值会比200小