从Linux上运行的C / C ++程序的角度来看,我对内存在双CPU机器中的含义感到有些困惑。
案例1(理解)
使用一个四核HT CPU ,32GB RAM,理论上我可以编写单个进程应用程序,使用多达8个线程和高达32GB RAM而无需进行交换或重载线程设施 - 为简单起见,我忽略了操作系统和其他过程。
案例2(混淆)
设置64GB RAM的双四核HT CPU 会发生什么?
开发方面,你是否需要编写一个应用程序来运行两个进程(8个线程,每个32GB)进行通信,或者你可以将它作为一个进程编写(16个线程,64GB全内存)?
如果答案是前者,那么利用整个硬件的一些有效的现代策略是什么? SHM? IPC?另外,如何指导Linux为每个进程使用不同的CPU?
答案 0 :(得分:7)
从应用程序的角度来看,物理CPU(管芯)的数量并不重要。只有虚拟处理器的数量。这些包括所有处理器上的所有内核,如果在内核上启用超线程,则为double。线程以相同的方式安排在它们上面。如果核心都在一个芯片上或分布在多个芯片上,则无关紧要。
一般来说,处理这些事情的最佳方法是不。不要担心在哪个核心上运行什么。只需为您的应用程序生成适当数量的线程(最多理论上的最大值等于系统中的核心总数),然后让操作系统处理调度。
当然,内存在系统中的所有内核之间共享。但同样,操作系统可以处理物理内存的分配。很少有应用程序真的需要担心它们使用多少内存,并在线程之间分配内存。让操作系统处理。
答案 1 :(得分:0)
内存模型与内核数量无关,而是与多核计算机上采用的架构有关。大多数主流计算机使用对称多处理模型,其中单个OS控制所有CPU,并且在这些CPU上运行的程序可以访问所有可用内存。每个CPU都有私有内存(缓存),但RAM都是共享的。因此,如果你有64位机器,无论你是编写1个进程还是两个进程,它都会产生zilch差异。编程方面,您最好使用单个进程。
正如其他人指出的那样,你需要担心线程的亲和力等,但这更多地与有效使用CPU资源有关,而与RAM的使用关系不大。但是,缓存使用会有一些影响。
与其他内存模型计算机(如NUMA(非统一内存访问))形成对比,其中每个CPU都有自己的内存块,并且在CPU之间进行通信则需要一些仲裁器。在这些计算机上,你需要担心在哪里放置你的线程,记忆明智。