공유 메모리 버스가 다중 프로세서에서 실행되는 여러 스레드의 공유 데이터 읽기 및 쓰기를 어떻게 처리 하는지를 높은 수준에서 이해하고 싶습니다.
추신 : 구현 관련 세부 사항이 분명하기 때문에 피투성이의 세부 사항은 필요하지 않습니다. 나는 뒤에서 일어나는 일들에 대한 고차원적인 개요가 필요하다.
공유 메모리 버스가 다중 프로세서에서 실행되는 여러 스레드의 공유 데이터 읽기 및 쓰기를 어떻게 처리 하는지를 높은 수준에서 이해하고 싶습니다.
추신 : 구현 관련 세부 사항이 분명하기 때문에 피투성이의 세부 사항은 필요하지 않습니다. 나는 뒤에서 일어나는 일들에 대한 고차원적인 개요가 필요하다.
답변:
"버스"는 구성 요소 자체가 아니라 구성 요소 사이의 전선 집합입니다. 따라서 CPU와 메모리 사이의 배선을 메모리 버스라고합니다. 확장 카드에 대한 배선은 PCI 버스 등입니다.
한 번에 하나씩 만 드라이브 할 수 있지만 버스를 구동하는 여러 구성 요소가있을 수 있으며 신호는 버스의 다른 모든 구성 요소로 전달됩니다. 버스에 대한 액세스를 제어하는 구성 요소를 버스라고합니다 석사 . 어떤 구성 요소가 버스 마스터인지를 변경할 수 있습니다. 중재 .
멀티 코어 시스템에서 캐시 일관성이 중요합니다. 따라서 하나의 코어가 공유 메모리 버스에 쓸 때 다른 코어는 탐정 버스 (다른 코어에서 메모리로가는 경우에도 쓰기를 검사). 쓰기가 해당 코어에 의해 캐시 된 위치에 대한 것이면, 코어는 캐시 항목을 축출하거나 대체합니다. 그렇게하면 오래된 정보가 없습니다.
메모리 모듈 (DIMM)은 한 번에 한 가지만 할 수 있습니다 : 읽기 또는 쓰기. 이것은 DIMM의 에지 커넥터에있는 프로토콜에 의해 결정됩니다. DIMM에 읽기 또는 쓰기 명령을 보내면 이전 명령이 완료 될 때까지 다른 메모리를 "들리게"할 수 없습니다.
공통 메모리 버스에있는 모든 DIMM은 한 번에 한 번씩 제한됩니다. 하지만 많은 PC 플랫폼에는 2 ~ 3 개의 메모리가 있습니다. 채널 하나의 채널에있는 모든 RAM은 한 번에 한 가지만 할 수 있습니다.
NUMA 머신 (CPU 소켓이 여러 개이고 각 소켓에 대해 "개인"메모리)에서이 모든 것이 nCPU로 곱 해집니다. 즉, 각 CPU는 다른 CPU가 무엇을하고 있든지 관계없이 로컬 메모리에 액세스 할 수 있습니다 그... 기억. 그러나 모든 CPU는 모든 RAM에 액세스 할 수 있습니다. 다른 CPU를 거치려면 시간이 조금 걸립니다.
기본적으로 공유 데이터에 액세스하기 위해 필요한 직렬화 요구 사항을 구현하는 것은 응용 프로그램의 코드에 달려 있습니다. 이것은 운영 체제의 도움으로 수행되며, 다양한 동기화 개체와 응용 프로그램에서 사용할 기능을 제공합니다. 이러한 객체는 세마포어 (철도 신호에서 빌린 이름), 뮤텍스 (상호 배제의 약자) 등과 같은 이름을 가지고 있습니다. OS에 따라 한 번에 1 개씩 구현할 수 있으며, 독점적 인 쓰기 대 공유 된 읽기, 등등의 의미론을 포함한다. 이러한 함수는 대개 "대기 중"또는 "차단"과 관련이 있습니다. 의도 적으로 공유 자원을 "보호"하는 뮤텍스를 얻습니다. 뮤텍스가 이미 다른 스레드에 의해 소유되어 있다면, 두 번째 (및 _n_th) 요청 스레드는 차단되며, 즉, 이전 소유자가 해제 할 때까지 대기하고 획득 호출에서 복귀하지 않습니다.
필요한 경우 이러한 기술을 사용하는 것은 응용 프로그램에 달려 있습니다. 운영 체제는이를 필요로하지 않습니다. 뮤텍스를 보호하려는 데이터에 액세스하기 전에 특정 뮤텍스를 소유해야합니다. 이것은 올바른 결과를 얻고 고성능을 얻기가 매우 어려울 수있는 프로그램 디자인 영역입니다.
데이터베이스와 같은 상위 수준의 하위 시스템은 관리하는 데이터를 위해이 코딩을 내장하고 동기화 객체보다는 데이터베이스 요소 측면에서 "말하는"프로그래머에게 인터페이스를 제공합니다. 프로그래머는 테이블 행을 잠그는 함수를 호출하거나 개별 셀 또는 행 세트 또는 전체 테이블 일 수 있습니다. 데이터베이스 엔진 아래에 앞서 설명한 OS 기능이 사용됩니다.
내부적으로 운영 체제는 일반적으로 메모리 하위 시스템에서 구현되는 일종의 원자 테스트 및 수정 작업을 통해 이러한 동기화 기능을 구현합니다. "원자"란 일단 시작되면 다른 모든 원자 작업이 영향을받는 메모리에서 시작되기 전에 작업이 완료된다는 것을 의미합니다. Windows에서 일반적으로 사용되는 예는 "인터 로킹 된 비교 및 교환"명령입니다. x86 / x64는 실제로 다양한 데이터 크기에서 작동하는 이러한 일련의 명령을 제공합니다.
이러한 기술을 사용하지 않고 공유 데이터에 대한 안전한 직렬화 액세스를 허용하는 메소드가 있지만 몇 가지 특수한 경우 (예 : "단 하나의 리더와 단 하나의 작성자") 또는 특정 유형의 데이터에 대해서만 작동합니다.