2017-08-10 73 views
3

据我所知,同步可以在单核处理器使用旗语轻松完成。但是,如果我们有多核心,如果多个进程想要在相同的时刻进入临界区,那么它们全部进入临界区还是只有一个胜出?赢家流程赢得了什么标准?同步在多处理器系统

回答

0

信号量只是在一个系统中通过线程进行信号传递的方式之一。您可以在一个或多个核心CPU中使用不影响其使用情况的信号量。

现在让我们回到你的问题。如果你有关键部分,并且多个线程想要进入该区域,他们将全部进入该区域。您需要了解主线程(例如)或其他可以启动它们的线程,它们之间会有一定的时间间隔(几个ns周围的时间空间非常小)。 因此,这就是为什么我们使用信号化,因为我们不想要“胜利者”,而另一方面,在几乎所有情况下,线程都可以在该关键部分进行不必要的更改。

在单核系统只能实现的,因为不同的胎面用刚刚并发进程调度(假的平行度,经由的TaskScheduler)必须通过分配的时隙共用芯。

+0

感谢您的回答。其实我是在讲关于Process而不是线程。因此,对于几个不同的过程,它们是彼此独立的,我们不能在这些过程之间做出很小的时间差异,就像你说的应用于线程一样。 –

1

当两个内核试图在同一时间进入临界区,它们都尝试写入信号量内存的同时,使用锁定读 - 修改 - 写操作。为了使核心完成写入,缓存必须独占访问包含信号量的缓存行。这迫使另一个核心将该行标记为无效。缓存协议确保只有一个内核可以获得独占访问权限,并且该内核进入关键部分。

同时,其他核心,这也尝试写入信号量,必须等待,因为它仍然需要高速缓存行的独占访问。只要第一个内核完成其写入操作,另一个内核便获得独占访问权并可完成其读取 - 修改 - 写入。但是读 - 修改 - 写的结果告诉它信号量很忙,所以它只有在检测到信号量​​已被释放后才能进入临界区。

1

即使多个内核都存在,信号量(或互斥,或大多数其他的同步原语)的工作原理一样的 - 只有线程指定数目可以输入信号量。如果它只适用于单处理器机器,那它确实是一个糟糕的信号量!

有使这项工作所需的多种机制,我会尽量给一个高水平的视图。

请注意,内存仍然在不同的内核之间共享。了解如何使用共享内存同步核心的简化但IMO有用的方法是CMPXCHG instruction。这条指令可以自动地(见下面的更多细节)比较并设置一个存储器地址。如果内存地址有你正在比较的值,它也会将零标志设置为1。

考虑下面的代码:

wait: 
mov eax, 0 
mov ecx, 1 
lock cmpxchg [address of lock], ecx 
jne wait 
// We now own the lock 

代码逻辑回路执行以下操作:设置仅当值为0

此代码可以由多个内核运行,并且cmpxchg的原子性保证只有一个核心会胜出。

如果每个内核都有自己的缓存(现在通常如此),情况会变得更加复杂。对于单独的缓存,每个核心都有自己的内存视图,因此必须小心确保这些内存视图一致。简短的回答是,这可以通过在数据更改时让缓存通知对方来完成,以便其他缓存可以在需要时使其副本无效或更新。查看snooping和MESI协议以获取更多细节。请注意,如果内核位于同一个物理芯片上,那么它们都将竞争内存总线,并且有在内核之间共享它的机制(例如仲裁机制;也可以查询LOCK指令)。

+0

cmpxchg有两个操作数。那么,其实三个,但EAX是隐含的。 – prl