스레드간에 공유되는 데이터의 읽기 및 쓰기에 공유 메모리 버스가 어떻게 안전하고 올바르게 사용됩니까?


1

공유 메모리 버스가 다중 프로세서에서 실행되는 여러 스레드의 공유 데이터 읽기 및 쓰기를 어떻게 처리 하는지를 높은 수준에서 이해하고 싶습니다.

추신 : 구현 관련 세부 사항이 분명하기 때문에 피투성이의 세부 사항은 필요하지 않습니다. 나는 뒤에서 일어나는 일들에 대한 고차원적인 개요가 필요하다.


1
당신은 당신 자신의 연구로 어딘가에 갇혀 있습니까? 지금까지 당신의 이해는 무엇입니까?
Dave

@DaveRook 내가 아는 한 메모리 버스는 프로세서와 RAM (주 메모리)간에 통신하는 데 필요합니다. 그것은이라고 공유 된 동시에 여러 코어에서 사용되기 때문입니다. 질문은이 공유 버스가 어떻게 공유 데이터가 서로간에 공유 데이터가 손상되지 않고 사용되는지에 관한 것입니다. 나는 여기에 높은 수준의 대답을 찾고있다.
Geek

이제는 더 좋은 질문입니다 :)! 잘하면 더 많은 답변을 얻으므로 원본 게시물을 편집하면 좋습니다.
Dave

@DaveRook은 귀하의 제안에 따라 질문을 업데이트했습니다. 다행히 지금은 많은 양질의 답변을받을 수 있습니다.
Geek

답변:


1

"버스"는 구성 요소 자체가 아니라 구성 요소 사이의 전선 집합입니다. 따라서 CPU와 메모리 사이의 배선을 메모리 버스라고합니다. 확장 카드에 대한 배선은 PCI 버스 등입니다.

한 번에 하나씩 만 드라이브 할 수 있지만 버스를 구동하는 여러 구성 요소가있을 수 있으며 신호는 버스의 다른 모든 구성 요소로 전달됩니다. 버스에 대한 액세스를 제어하는 ​​구성 요소를 버스라고합니다 석사 . 어떤 구성 요소가 버스 마스터인지를 변경할 수 있습니다. 중재 .

멀티 코어 시스템에서 캐시 일관성이 중요합니다. 따라서 하나의 코어가 공유 메모리 버스에 쓸 때 다른 코어는 탐정 버스 (다른 코어에서 메모리로가는 경우에도 쓰기를 검사). 쓰기가 해당 코어에 의해 캐시 된 위치에 대한 것이면, 코어는 캐시 항목을 축출하거나 대체합니다. 그렇게하면 오래된 정보가 없습니다.


"하나만 버스를 운전할 수 있지만 버스의 다른 모든 구성 요소에 신호가 전달되는 경우에도 여러 개의 구성 요소가 버스를 구동 할 수 있습니다." - 여러 구성 요소가 메모리 버스 ?
Geek

@ Geek PC 칩셋에서 나는 우리가 하나 이상의 칩셋을 가지고 있다고 생각하지 않는다. 이전에는 "노스 브리지"(메모리 컨트롤러 / 허브) 이었지만 이제는 CPU에 내장 된 메모리 컨트롤러입니다. 항상 그런 것은 아닙니다. 원래의 PDP-11과 같은 고전적인 미니 컴퓨터에서는 메모리가 I / O 장치와 함께 Unibus에 앉아 있었고 CPU와 DMA 장치 모두가이를 "구동"할 수있었습니다. 간단한 버스 중재 프로토콜은 한 번에 하나의 장치 만 그렇게 할 수 있도록했으며, 또한 우선 순위가 높은 우선 순위 (BR, "버스 요청"수준)의 인터럽트를 구현하는 데 사용되었습니다.
Jamie Hanrahan

1

메모리 모듈 (DIMM)은 한 번에 한 가지만 할 수 있습니다 : 읽기 또는 쓰기. 이것은 DIMM의 에지 커넥터에있는 프로토콜에 의해 결정됩니다. DIMM에 읽기 또는 쓰기 명령을 보내면 이전 명령이 완료 될 때까지 다른 메모리를 "들리게"할 수 없습니다.

공통 메모리 버스에있는 모든 DIMM은 한 번에 한 번씩 제한됩니다. 하지만 많은 PC 플랫폼에는 2 ~ 3 개의 메모리가 있습니다. 채널 하나의 채널에있는 모든 RAM은 한 번에 한 가지만 할 수 있습니다.

NUMA 머신 (CPU 소켓이 여러 개이고 각 소켓에 대해 "개인"메모리)에서이 모든 것이 nCPU로 곱 해집니다. 즉, 각 CPU는 다른 CPU가 무엇을하고 있든지 관계없이 로컬 메모리에 액세스 할 수 있습니다 그... 기억. 그러나 모든 CPU는 모든 RAM에 액세스 할 수 있습니다. 다른 CPU를 거치려면 시간이 조금 걸립니다.

기본적으로 공유 데이터에 액세스하기 위해 필요한 직렬화 요구 사항을 구현하는 것은 응용 프로그램의 코드에 달려 있습니다. 이것은 운영 체제의 도움으로 수행되며, 다양한 동기화 개체와 응용 프로그램에서 사용할 기능을 제공합니다. 이러한 객체는 세마포어 (철도 신호에서 빌린 이름), 뮤텍스 (상호 배제의 약자) 등과 같은 이름을 가지고 있습니다. OS에 따라 한 번에 1 개씩 구현할 수 있으며, 독점적 인 쓰기 대 공유 된 읽기, 등등의 의미론을 포함한다. 이러한 함수는 대개 "대기 중"또는 "차단"과 관련이 있습니다. 의도 적으로 공유 자원을 "보호"하는 뮤텍스를 얻습니다. 뮤텍스가 이미 다른 스레드에 의해 소유되어 있다면, 두 번째 (및 _n_th) 요청 스레드는 차단되며, 즉, 이전 소유자가 해제 할 때까지 대기하고 획득 호출에서 복귀하지 않습니다.

필요한 경우 이러한 기술을 사용하는 것은 응용 프로그램에 달려 있습니다. 운영 체제는이를 필요로하지 않습니다. 뮤텍스를 보호하려는 데이터에 액세스하기 전에 특정 뮤텍스를 소유해야합니다. 이것은 올바른 결과를 얻고 고성능을 얻기가 매우 어려울 수있는 프로그램 디자인 영역입니다.

데이터베이스와 같은 상위 수준의 하위 시스템은 관리하는 데이터를 위해이 코딩을 내장하고 동기화 객체보다는 데이터베이스 요소 측면에서 "말하는"프로그래머에게 인터페이스를 제공합니다. 프로그래머는 테이블 행을 잠그는 함수를 호출하거나 개별 셀 또는 행 세트 또는 전체 테이블 일 수 있습니다. 데이터베이스 엔진 아래에 앞서 설명한 OS 기능이 사용됩니다.

내부적으로 운영 체제는 일반적으로 메모리 하위 시스템에서 구현되는 일종의 원자 테스트 및 수정 작업을 통해 이러한 동기화 기능을 구현합니다. "원자"란 일단 시작되면 다른 모든 원자 작업이 영향을받는 메모리에서 시작되기 전에 작업이 완료된다는 것을 의미합니다. Windows에서 일반적으로 사용되는 예는 "인터 로킹 된 비교 및 ​​교환"명령입니다. x86 / x64는 실제로 다양한 데이터 크기에서 작동하는 이러한 일련의 명령을 제공합니다.

이러한 기술을 사용하지 않고 공유 데이터에 대한 안전한 직렬화 액세스를 허용하는 메소드가 있지만 몇 가지 특수한 경우 (예 : "단 하나의 리더와 단 하나의 작성자") 또는 특정 유형의 데이터에 대해서만 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.