多线程/多处理器程序的交互是如何在硬件层面实现的,即 我想想象它是如何发生的,2+ 电荷沿着电路从 2+ 核处理器“运行”,他们都想访问磁盘,他们相遇的地方以及如何达成这样的理解:某人是第一个,某人是第二、第三等 ? 如果它们绝对同时发生会怎样?或者,例如,相同的事情,但写入 RAM,每个进程如何设法为自己占据一个位置,但保证不会在同一毫秒内被其他人占据。
多线程/多处理器程序的交互是如何在硬件层面实现的,即 我想想象它是如何发生的,2+ 电荷沿着电路从 2+ 核处理器“运行”,他们都想访问磁盘,他们相遇的地方以及如何达成这样的理解:某人是第一个,某人是第二、第三等 ? 如果它们绝对同时发生会怎样?或者,例如,相同的事情,但写入 RAM,每个进程如何设法为自己占据一个位置,但保证不会在同一毫秒内被其他人占据。
多线程程序的交互主要是在逻辑同步原语的基础上实现的,而这些原语又是使用非常容易理解的逻辑节点来实现的。无需深入到单个电子元件的水平。
一个小的具体示例是逻辑原语“原子变量(C++ 中的 std::atomic)”。为了在没有缓存和指令流水线的原始处理器中实现它,对该变量的读取和写入在一条机器指令中执行。
在原子变量的基础上,已经可以构造更复杂的同步原语——互斥体和信号量。有了这样的武器库,你可以做很多事情。
为了以某种方式将其系统化和标准化,具有多线程的严格编程语言(C、C++ 等)引入了内存和机器的正式模型,并在该模型内以标准描述它们的工作。模型在特定硬件上的实现取决于编译器开发人员,而他们又拥有处理器机器代码的部分规范。
同时,该规范的某些部分是硬件开发人员非常昂贵的知识产权,并且是在严格的 NDA 下发布的。
磁盘和内存有很大的不同。唯一对磁盘和内存都适用的是最后一次进入的人——那个和运动鞋。那些。如果您不使用强制锁定 - 可能会证明在您写入信息的地址处 - 它已经被并行工作的线程擦除。
关于内存。有三个因素——CPU、CACHE、OS、多通道。有了 RAM,一切都变得更简单,而一个 CPU 可以访问物理内存——其余的 CPU 正在等待。等待优先级究竟是如何组织的——我很难说。很可能是处理器编号,并且可能与 CPU 版本不同。由于该程序通常不会专门使用内存,因此在等待之后,另一个 CPU 将获得对 RAM 的访问权限。我们不能忘记,如果操作系统需要并行执行一些其他任务,包括操作系统维护,它可以限制/抑制过多的线程活动。因此,优先级还取决于操作系统的版本、它的工作量和同时运行的程序的数量以及哪些程序(因为一个程序可以将 CPU 加载到满,而另一个程序可以休眠)。相同的缓存CPU内置内存——极大地方便了内存操作。现代 PC 不再有外部缓存。禁用高速缓存时,CPU 会慢得多。启用缓存时访问 RAM - 如果所有内容都适合缓存,则可能不会发生。当使用双通道内存或多通道时 - 可以将两个线程对 RAM 的访问打包成一个访问,这也会带来性能上的小幅提升(因为这种可能性的概率具有一定的 % 概率) .
使用磁盘,一切都会复杂得多。首先,与磁盘的工作不是直接进行的,而是通过驱动程序进行的,因此访问的优先级或同时性由驱动程序决定。考虑到磁盘操作经常组合在一起并被缓存,线程很可能会在不同的时间进入等待,但等待磁盘操作的时间大约会在同一时间结束。在物理 I/O 操作之后,控制权将传递给 I/O 驱动程序,而 I/O 驱动程序将控制权传递给操作系统。最有可能的是,操作系统会优先考虑最被剥夺的线程,以平衡性能偏差(如果线程具有相同的优先级)。直接绕过驱动程序使用磁盘是一项非常复杂的任务 - 实际上不使用它。
在多线程环境下工作时,针对不同的情况采用不同的方法来加快工作速度。我认为铁的知识在这里没有多大帮助。最好阅读有关多线程排序的文章,例如,还有其他多线程进程的描述 - 并阅读那里的功能。这些特征有些是由于铁,有些是通过实验获得的。