Existe a placa-mãe Supermicro X10DAi e o manual está aqui . Na página 1-11 você pode ver que cada CPU tem sua própria RAM.
Digamos que program A
está oferecendo uma API por meio de um soquete local /var/run/socketapi
. Este programa é iniciado na CPU 1.
Em seguida, há program B
conexão com este soquete e é iniciado na CPU 2.
Quando program B
escreve um comando no soquete, o kernel normalmente copia os dados do espaço de memória de program B
para o de program A
.
Mas como os programas são executados em CPUs diferentes e a memória não é compartilhada entre as CPUs, há um problema.
Como isso é resolvido no Linux recente? Talvez toda a memória da CPU 1 esteja mapeada para a CPU 2 usando a interface QPI mostrada no manual?
Ou talvez o programa IPC não funcione e ocorra um erro?
Forneça alguma referência ao código-fonte ou à documentação do Linux.
Sim, as CPUs mapeiam a memória umas das outras por meio da interconexão da CPU.
Em arquiteturas compatíveis com Intel, esse é um mapeamento coerente , portanto, o software percebe principalmente na forma de maior latência ao acessar a memória conectada à outra CPU.
Como a memória do sistema tem um pouco de latência por conta própria, a diferença não é tão grande. O sistema operacional ainda otimiza em tempo real e pode decidir mover dois processos com muito tráfego IPC para o mesmo nó.
Arquiteturas diferentes também podem ter mapeamentos não coerentes, o que exige que o software seja mais explícito sobre a localidade da memória, mas escala melhor com mais soquetes.