SHH*_*SHH 12 synchronization locking smp multiprocessor
好的,所以我正在阅读有关同步的内容,并且我阅读了各种算法,例如自旋锁,信号量和互斥锁,以避免竞争条件.
但是,当多个进程完全同时访问数据时,这些算法无法阻止SMP中的竞争条件.
例如,假设处理器A中的线程1运行锁定(mutex1); 退出(1000); 解锁(mutex1);
处理器B中的线程2运行锁定(mutex1); 存款(1000); 存款(1000); 解锁(mutex1);
当两个线程在相同时间运行时,两个线程将同时处于临界区.
唯一的解决方案(应该是硬件级别)将使每个处理器彼此略微偏离,但它会破坏并行性的目的.
是否有任何硬件级别支持以避免多个处理器尝试在同一时间获取锁定的情况?
(这不是原子性问题,而是精确并行问题,我想知道SMP如何处理它).
Dav*_*rtz 13
互斥体的全部意义在于,即使两个核心同时尝试获取它,其中一个核心将被阻塞,直到另一个核心释放它为止.允许两个内核同时保存该互斥锁的互斥锁将完全被破坏,并且仅用于其唯一的预期目的.
在硬件的某处,有一个总线仲裁器,它只允许一个内核控制连接这两个内核的总线.如果任一核心已经拥有将互斥锁保存在私有缓存中的内存,则该核心将获胜.否则,无论谁先获得公共汽车都将获胜.
总线仲裁器可以以多种方式工作,但通常它会旋转.因此,如果内核为0,1,2和3,并且内核2具有总线最后,则总线将接下来如果它需要核心3,否则核心0如果需要它,否则核心1如果它想要它,否则回到核心2.根据确切涉及哪个总线(无论是两个核心的L2缓存之间还是内存本身或其他内容之间的争斗),某些核心可能会作为一个单元来对抗其他核心组,然后进行子竞争特定核心首先得到它.
可能是一个核心已经控制了总线,因此它将彻底赢得胜利.通常,仲裁器允许核心连续保持总线,只要它继续想要将其用于少数交易以避免浪费的切换,这些切换不允许核心进行前进.
具体细节可能因许多因素而异,包括如何排列核心,哪些核心在哪些状态下锁定其缓存,谁拥有总线最后以及总线仲裁器是否使用时间片,循环或某些其他机制,等等.但任何不能保证只有一个核心获得锁定的实现将被认为是可怕的破坏.