据我所知,同步可以在单核处理器使用旗语轻松完成。但是,如果我们有多核心,如果多个进程想要在相同的时刻进入临界区,那么它们全部进入临界区还是只有一个胜出?赢家流程赢得了什么标准?同步在多处理器系统
回答
信号量只是在一个系统中通过线程进行信号传递的方式之一。您可以在一个或多个核心CPU中使用不影响其使用情况的信号量。
现在让我们回到你的问题。如果你有关键部分,并且多个线程想要进入该区域,他们将全部进入该区域。您需要了解主线程(例如)或其他可以启动它们的线程,它们之间会有一定的时间间隔(几个ns周围的时间空间非常小)。 因此,这就是为什么我们使用信号化,因为我们不想要“胜利者”,而另一方面,在几乎所有情况下,线程都可以在该关键部分进行不必要的更改。
在单核系统只能实现的,因为不同的胎面用刚刚并发进程调度(假的平行度,经由的TaskScheduler)必须通过分配的时隙共用芯。
当两个内核试图在同一时间进入临界区,它们都尝试写入信号量内存的同时,使用锁定读 - 修改 - 写操作。为了使核心完成写入,缓存必须独占访问包含信号量的缓存行。这迫使另一个核心将该行标记为无效。缓存协议确保只有一个内核可以获得独占访问权限,并且该内核进入关键部分。
同时,其他核心,这也尝试写入信号量,必须等待,因为它仍然需要高速缓存行的独占访问。只要第一个内核完成其写入操作,另一个内核便获得独占访问权并可完成其读取 - 修改 - 写入。但是读 - 修改 - 写的结果告诉它信号量很忙,所以它只有在检测到信号量已被释放后才能进入临界区。
即使多个内核都存在,信号量(或互斥,或大多数其他的同步原语)的工作原理一样的 - 只有线程指定数目可以输入信号量。如果它只适用于单处理器机器,那它确实是一个糟糕的信号量!
有使这项工作所需的多种机制,我会尽量给一个高水平的视图。
请注意,内存仍然在不同的内核之间共享。了解如何使用共享内存同步核心的简化但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
指令)。
cmpxchg有两个操作数。那么,其实三个,但EAX是隐含的。 – prl
- 1. pthread_singal在多处理器系统上唤醒多个线程
- 2. 多个同步版本控制系统?
- 3. 多线程可以在单处理器系统上实现吗?
- 4. 多处理器和多线程 - 操作系统
- 5. ArangoDB同步系统集合
- 6. 文件系统同步库?
- 7. 同步系统活动
- 8. 处理ajax同步?
- 9. 同步与DFP广告管理系统中的异步
- 10. 处理多个AJAX请求同步
- 11. 多处理器系统上的POSIX线程
- 12. 为什么多处理器系统需要禁用中断
- 13. 处理点击android系统
- 14. 在多核处理器上实时操作系统中的多线程调度
- 15. 在多个系统上运行图形显示,保持同步
- 16. 是与python中的多处理器需要同步吗?
- 17. 在32位系统上处理PHP longint
- 18. 在Android操作系统中可以同时处理多少个手指?
- 19. 在不同操作系统下处理C文件
- 20. 在基于事件的系统中同时处理唯一性
- 21. 批处理功能同步?
- 22. 处理同步信号
- 23. 同步处理变为叉
- 24. Smartfoxserver2x处理响应同步
- 25. 在Linux系统上检查python多处理中的fork行为
- 26. 如何在Java中处理多类树型系统?
- 27. 多个异步Web请求来处理同步场景
- 28. Win32:计算多核/多处理器系统中的线程CPU利用率
- 29. 如何同步系统日期/时间?
- 30. 同步文件系统对象层次
感谢您的回答。其实我是在讲关于Process而不是线程。因此,对于几个不同的过程,它们是彼此独立的,我们不能在这些过程之间做出很小的时间差异,就像你说的应用于线程一样。 –