저는 Supermicro X10DAi 마더보드를 가지고 있습니다. 설명서는 다음과 같습니다.여기. 1-11페이지에서 각 CPU에는 자체 RAM이 있는 것을 볼 수 있습니다.
program A
API가 로컬 소켓을 통해 제공된다고 가정합니다 /var/run/socketapi
. 프로그램은 CPU 1에서 시작됩니다.
program B
그런 다음 소켓에 연결 하고 CPU 2에서 시작합니다.
program B
소켓에 명령을 쓸 때 커널은 일반적으로 메모리 공간에서 program B
메모리 공간으로 데이터를 복사합니다 program A
.
하지만 프로그램이 서로 다른 CPU에서 실행되고 메모리가 CPU 간에 공유되지 않기 때문에 문제가 있습니다.
최근 Linux에서는 이 문제가 어떻게 해결됩니까? 아마도 매뉴얼에 표시된 QPI 인터페이스를 사용하여 CPU 1의 전체 메모리가 CPU 2의 메모리에 매핑되어 있는 것일까요?
아니면 IPC 프로그램이 실행되지 않고 오류가 발생하는 경우도 있나요?
Linux 소스 코드나 문서에 대한 참조를 제공해 주세요.
답변1
예, CPU는 CPU 상호 연결을 통해 서로의 메모리를 매핑합니다.
Intel 호환 아키텍처에서는 다음과 같습니다.일관성 있는매핑하므로 소프트웨어는 주로 다른 CPU에 연결된 메모리에 액세스할 때 대기 시간이 길어지는 형태로 이를 알아차립니다.
시스템 메모리 자체의 레이턴시가 꽤 있기 때문에 그 차이는 크지 않습니다. 운영 체제는 여전히 동적으로 최적화하며 IPC 트래픽이 많은 두 프로세스를 동일한 노드로 이동하기로 결정할 수 있습니다.
서로 다른 아키텍처에는 연결되지 않은 매핑이 있을 수도 있으며, 이를 위해서는 소프트웨어가 메모리 위치에 대해 더 명확해야 하지만 소켓이 많을수록 더 잘 확장되어야 합니다.