Process 多处理机系统中的同步

Process 多处理机系统中的同步,process,parallel-processing,x86,operating-system,Process,Parallel Processing,X86,Operating System,我知道在单核处理器中使用信号量可以轻松地完成同步。但是,如果我们有多个核,如果多个进程希望在同一个时间瞬间进入关键部分,它们是全部进入关键部分还是只有一个获胜?优胜者进程以什么标准获胜?信号量只是在一个系统中通过线程发出信号的一种方法。您可以在一个或多核CPU中使用不影响其使用的信号量 现在让我们回到你的问题上来。如果您有关键部分,并且多个线程想要进入该区域,那么它们将全部进入该区域。您需要了解主线程(例如)或将启动它们的其他线程在它们之间有一定的时间间隔(非常小的时间间隔,大约是两个N)。 所

我知道在单核处理器中使用信号量可以轻松地完成同步。但是,如果我们有多个核,如果多个进程希望在同一个时间瞬间进入关键部分,它们是全部进入关键部分还是只有一个获胜?优胜者进程以什么标准获胜?

信号量只是在一个系统中通过线程发出信号的一种方法。您可以在一个或多核CPU中使用不影响其使用的信号量

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


在单核系统中,您只能实现并发进程调度(通过TaskScheduler实现伪并行),因为不同的进程必须通过分配的时隙共享内核。

当两个内核试图同时进入关键部分时,它们都试图同时写入内存中的信号量,使用锁定的读修改写操作。为了让内核完成写操作,缓存必须以独占方式访问包含信号量的缓存线。这将强制另一个磁芯将该线标记为无效。缓存协议确保只有一个核心可以获得独占访问,并且该核心进入关键部分


同时,另一个内核也在尝试写入信号量,它必须等待,因为它仍然需要对缓存线的独占访问。一旦第一个内核完成其写操作,另一个内核就获得独占访问权并可以完成其读-修改-写操作。但是读-修改-写的结果告诉它信号量正忙,因此在检测到信号量已被释放之前,它无法进入关键部分。

即使存在多个核心、一个信号量(或互斥体,或大多数其他同步原语)工作原理相同-只有指定数量的线程才能输入信号量。如果它只在单处理器机器上工作,那么它将是一个糟糕的信号量

这需要多种机制来实现,我将尝试给出一个高级视图

请注意,内存仍在不同的内核之间共享。了解如何使用共享内存同步内核的一种简单但有用的方法是。此指令可以自动(参见下面的更多详细信息)比较和设置内存地址。如果内存地址具有您要比较的值,它还会将零标志设置为1

考虑以下代码:

wait:
mov eax, 0
mov ecx, 1
lock cmpxchg [address of lock], ecx
jne wait
// We now own the lock
代码逻辑循环执行以下操作:仅当
lock
为0时,才将
lock
的值设置为1

此代码可以由多个核运行,而
cmpxchg
的原子性保证了只有一个核将获胜

如果每个核心都有自己的缓存,情况就会变得更加复杂(现在通常就是这样)。对于单独的缓存,每个核心都有自己的内存视图,所以必须注意确保这些内存视图是一致的。简单的回答是,这可以通过让缓存在数据更改时相互通知来实现,以便其他缓存可以在需要时使其副本无效或更新。有关这方面的更多详细信息,请查看窥探和MESI协议


请注意,如果内核位于同一个物理芯片上,那么它们都在争夺内存总线,并且存在在内核之间共享内存总线的机制(例如仲裁机制;还可以查看
LOCK
指令)。

谢谢您的回答。实际上我讲的是进程而不是线程。因此,对于几个不同的进程,它们是相互独立的,我们不能像您所说的应用于线程的那个样,在这些进程之间产生微小的时间差。