2, 4, 8 코어와 같은 멀티 코어 시스템에서 일반적으로 공유 메모리에 액세스하기 위해 뮤텍스와 세마포를 사용합니다. 그러나, 나는이 방법들이 많은 코어를 가진 미래의 시스템에 높은 오버 헤드를 유발할 것이라고 예견 할 수있다. 공유 메모리에 액세스하기위한 미래의 많은 핵심 시스템을 위해 더 나은 대체 방법이 있습니까?많은 코어 시스템에서 공유 메모리에 액세스하는 방법
답변
미래에 얼마나 멀리 가고 싶은지 잘 모르겠습니다. 그러나 장기간에 걸쳐 우리가 알고있는 공유 메모리 (모든 코어에서 액세스 할 수있는 단일 주소 공간)는 확장 할 수 없습니다. 따라서 프로그래밍 모델은 어느 시점에서 변경되어야하며 멀티 코어로 갈 때와 마찬가지로 프로그래머의 삶을 더 힘들게 만듭니다.
그러나 현재 (아마도 10 년 동안) 트랜잭션 메모리 및 기타 하드웨어/소프트웨어 트릭을 얻을 수 있습니다.
왜냐하면 내가 말한 이유는 공유 메모리가 장기적으로 확장 성이 없다는 이유는 단순히 물리 때문일뿐입니다. (싱글 코어/고주파가 어떻게 장벽에 부딪 치는 것과 유사)
요약하면 트랜지스터는 원자 크기보다 작게 축소 할 수없고 (신기술 제외) 신호가 빛의 속도. 따라서 메모리는 프로세서에 비해 느려지고 느려지고 어떤 시점에서는 메모리를 공유 할 수 없게됩니다.
멀티 소켓 시스템에서 이미 NUMA를 사용하여이 효과를 확인할 수 있습니다. 대규모 수퍼 컴퓨터는 공유 메모리도 아니고 캐시 일관성도 아닙니다.
Transactional memory 중 하나입니다.
1) 전체 테이블이 아닌 액세스중인 메모리 부분 만 잠그십시오! 이것은 큰 해시 테이블을 사용하여 수행됩니다. 테이블이 클수록 잠금 장치가 더 세밀 해집니다.
2) 가능한 경우 읽기가 아닌 쓰기 만 잠급니다 (업데이트하는 동안 "이전 값"을 읽는 데 문제가 없어야 함). 이는 대개 유효한 경우입니다.
멀티 프로세서/코어/스레드 응용 프로그램 동기화에서 가장 낮은 수준의 공유 메모리에 대한 액세스는 버스 잠금에 따라 다릅니다. 이러한 잠금은 DMA를 포함한 버스 마스터 링 장치가있는 I/O 버스를 잠그는 것을 포함하므로 수백 개의 (CPU) 대기 상태가 발생할 수 있습니다. 이론적으로 프로그래머가 잠긴 메모리 영역이 I/O 버스의 영향을받지 않을 것이라고 확신 할 수있는 상황에서 호출 할 수있는 중간 수준의 잠금을 구상하는 것이 가능합니다. 이러한 잠금은 CPU 캐시를 주 메모리와 동기화 할 필요가 있기 때문에 훨씬 빠릅니다. 적어도 가장 느린 I/O 버스의 대기 시간과 비교하면 빠릅니다. 프로그래머가 어떤 버스 잠금 장치를 사용해야하는지 결정할 능력이 있는지 여부가 주류 실현 가능성에 대한 걱정의 의미를 추가하는지 여부 이러한 잠금 장치는 다른 프로세서와의 동기화를 위해 전용 외부 핀이 필요할 수도 있습니다.
다중 프로세서 Opteron 시스템에서 각 프로세서에는 설치된 모든 프로세서가 "볼 수있는"전체 메모리의 일부가되는 자체 메모리가 있습니다. 다른 프로세서에 연결될 수있는 메모리에 액세스하려는 프로세서는 고속 인터커넥트 버스 (HyperTransport)를 통해 해당 메모리를 담당하는 프로세서 (NUMA 개념)에 액세스를 투명하게 완료합니다. 프로세서와 코어가 물리적으로 연결된 메모리와 함께 작동하는 한 처리 속도는 빠릅니다. 또한 많은 프로세서에는 여러 외부 메모리 버스가 장착되어있어 전체 메모리 대역폭을 늘릴 수 있습니다.
이론적 인 중간 수준 잠금은 Opteron 시스템에서 HyperTransport 상호 연결을 사용하여 구현할 수 있습니다.
가능한 미래에는 가능한 한 거의 사용하지 않는 잠금 방식과 잠금 장치가있을 때 사용되는 효율적인 알고리즘 (및 관련 데이터 구조)을 구현하여 가능한 한 짧은 시간 동안 고전적인 방식으로 잠금을 유지합니다.
- 1. 공유 메모리 세그먼트를 물리적 메모리에 고정하는 방법
- 2. 공유 메모리에 쓰기
- 3. 멀티 코어 시스템에서 다중 인스턴스 프로그램
- 4. 멀티 코어 프로세서에서 CRx 레지스터에 액세스하는 방법
- 5. 많은 메모리에 UIWebView 할당을 방지합니다.
- 6. 많은 양의 텍스트를 메모리에 저장합니다.
- 7. C++의 공유 라이브러리 (공유) 내에서 공유 메모리에 객체 생성
- 8. 멀티 코어 또는 분산 시스템에서 프로그램 컴파일
- 9. 코어 데이터의 많은 관계로
- 10. 코어 데이터에 많은 텍스트를 저장하는 방법
- 11. SQL 서버에서 공유 목록에 액세스하는 방법
- 12. 창 핸들없이 창 클래스 추가 메모리에 액세스하는 방법?
- 13. 내부 장치 메모리에 다운로드 된 파일에 액세스하는 방법
- 14. 사용자 모드 메모리에 액세스하는 방법은 무엇입니까?
- 15. mmap과 마찬가지로 Java에서 메모리에 액세스하는 가장 좋은 방법은 무엇입니까?
- 16. 듀얼 코어 시스템에서 우분투를위한 PETSc 및 MPI
- 17. 코어 데이터 저장소 백업/공유
- 18. SOLR 멀티 코어 공유 구성
- 19. C++에서 공유 메모리에 어떻게 기록합니까?
- 20. wcf 서비스를 자체 호스팅하고 다른 시스템에서 외부에 액세스하는 방법
- 21. 메모리에 너무 많은 레코드가있는 LINQ to SQL
- 22. 어셈블리를 메모리에 저장하는 방법
- 23. 여러 CPU 및 많은 메모리에 대한 Eclipse 성능 튜닝?
- 24. 코어 데이터를 사용하여 Objective-C 2.0에서 가져온 속성에 액세스하는 방법
- 25. dll을 메모리에 임베드하는 방법
- 26. 데이터를 메모리에 저장하는 방법
- 27. 메모리에 얼굴을 저장하는 방법
- 28. 멀티 코어 시스템에서 사용 가능한 스레드 수를 확인하기위한 어셈블리 지침
- 29. 하나의 가져온 엔티티를 많은 코어 데이터로 복원합니다. 코어 데이터
- 30. Java 프로그래밍에서 시스템에서 다른 시스템으로 파일에 액세스하는 방법은 무엇입니까?
하지만 느린가요? 가장 빠른 구현은 무엇입니까? – MetallicPriest
이 페이지는 자세한 정보와 함께 도움이 될 수도 있습니다 : http://www.haskell.org/haskellwiki/Software_transactional_memory –
@MetallicPriest - 현재 속도는 느리지 만 부분적으로 적은 수의 코어로 인한 것 같습니다. 자물쇠 접근법, 그리고 그것이 새로운 방법 일지라도, 그것은 아마도 지금 아마도 가장 좋은 접근법 일 것입니다. –