공유 메모리

Shared memory
3개의 프로세서로 구성된 공유 메모리 시스템의 그림입니다.

컴퓨터 과학에서 공유 메모리는 여러 프로그램 간에 통신을 제공하거나 중복 복사를 방지하기 위해 동시에 액세스할 수 있는 메모리입니다.공유 메모리는 프로그램 간에 데이터를 효율적으로 전달하는 방법입니다.콘텍스트에 따라서는, 프로그램은 1개의 프로세서 또는 복수의 개별의 프로세서상에서 동작하는 경우가 있습니다.

예를 들어 여러 스레드 간의 단일 프로그램 내 통신에 메모리를 사용하는 것을 공유 메모리라고도 합니다.

하드웨어 내

HSA는 메모리 공유의 특별한 경우를 정의합니다.여기서 CPU의 MMU와 GPU의 IOMMU는 페이지 가능한 동일한 가상 주소 공간을 가집니다.

컴퓨터 하드웨어에서 공유 메모리는 멀티프로세서 컴퓨터 시스템의 여러 다른 중앙처리장치(CPU)에서 액세스할 수 있는 랜덤액세스 메모리(RAM)의 (일반적으로 큰) 블록을 말합니다.

공유 메모리 시스템은 다음을 [1]사용할 수 있습니다.

  • 균일 메모리 액세스(UMA): 모든 프로세서가 물리 메모리를 균일하게 공유합니다.
  • NUMA(Non-Uniform Memory Access): 메모리 액세스 시간은 프로세서에 대한 메모리 위치에 따라 달라집니다.
  • 캐시 전용 메모리 아키텍처(COMA): 각 노드의 프로세서의 로컬 메모리가 실제 메인 메모리가 아닌 캐시로 사용됩니다.

공유 메모리 시스템은 모든 프로세서가 단일 데이터 뷰를 공유하고 프로세서 간의 통신이 동일한 위치에 대한 메모리 액세스만큼 빠르기 때문에 상대적으로 프로그래밍이 용이합니다.공유 메모리 시스템의 문제는 많은 CPU가 메모리에 빠르게 액세스해야 하고 메모리를 캐시할 가능성이 높기 때문에 다음 두 가지 문제가 있습니다.

  • 액세스 시간 저하: 여러 프로세서가 같은 메모리 위치에 액세스하려고 하면 경합이 발생합니다.주변 메모리 위치에 액세스하려고 하면 잘못된 공유가 발생할 수 있습니다.공유 메모리 컴퓨터는 잘 확장되지 않습니다.대부분은 10개 이하의 프로세서를 탑재하고 있습니다.
  • 데이터의 일관성이 결여되어 있는 경우: 1개의 캐시가 다른 프로세서에서 사용할 수 있는 정보로 갱신될 때마다 변경 내용을 다른 프로세서에 반영해야 합니다.그렇지 않으면 서로 다른 프로세서가 일관성이 없는 데이터로 동작하게 됩니다.이러한 캐시 일관성 프로토콜은 잘 작동하면 여러 프로세서 간의 공유 정보에 대한 매우 높은 성능의 액세스를 제공할 수 있습니다.한편, 과부하가 되어 퍼포먼스의 보틀 넥이 되는 경우가 있습니다.

크로스바 스위치, 오메가 네트워크, HyperTransport 또는 프론트 사이드 버스 등의 기술을 사용하여 병목현상을 완화할 수 있습니다.

이기종 시스템 아키텍처(CPUGPU 등 다양한 종류의 프로세서를 공유 메모리와 통합하는 프로세서 아키텍처)의 경우 CPU의 메모리 관리 유닛(MMU)과 GPU의 입출력 메모리 관리 유닛(IOMMU)은 공통 주소 공간 등의 특정 특성을 공유해야 합니다.

공유 메모리의 대체 방법으로는 분산 메모리와 분산 공유 메모리가 있으며, 각각 유사한 문제가 있습니다.

소프트웨어 내

컴퓨터 소프트웨어에서 공유 메모리는 다음 중 하나입니다.

  • 프로세스 간 통신(IPC) 방법, 즉 동시에 실행되는 프로그램 간에 데이터를 교환하는 방법입니다.하나의 프로세스에 의해 RAM에 다른 프로세스가 액세스할 수 있는 영역이 생성됩니다.
  • 가상 메모리 매핑을 사용하거나 문제의 프로그램을 명시적으로 지원함으로써 일반적으로 단일 인스턴스로 데이터 복사본인 액세스를 유도함으로써 메모리 공간을 절약하는 방법.공유 라이브러리 및 XIP(Execute in place)에 가장 많이 사용됩니다.

두 프로세스 모두 일반 작업 메모리처럼 공유 메모리 영역에 액세스할 수 있기 때문에 이는 매우 빠른 통신 방법입니다(이름 있는 파이프, Unix 도메인 소켓, CORBAIPC의 다른 메커니즘과는 다릅니다).한편, 예를 들어 통신 프로세스는 같은 머신(다른 IPC 방식에서는 Unix 도메인 소켓이 아닌 인터넷 도메인 소켓만 컴퓨터 네트워크를 사용할 수 있음)에서 실행되어야 하므로 확장성이 떨어집니다.메모리를 공유하는 프로세스가 다른 CPU와 기본 아키텍처에서 실행되는 경우 문제가 발생하지 않도록 주의해야 합니다.re는 캐시에 일관성이 없습니다.

공유 메모리에 의한 IPC는 예를 들어 응용 프로그램과 Unix 시스템 상의 X 서버 간에 이미지를 전송하거나 CoMarshalInter에 의해 반환되는 IStream 객체 내에서 사용됩니다.ThreadInterfaceInStream은 Windows의 COM 라이브러리에 있습니다.

동적 라이브러리는 일반적으로 메모리에 한 번 보관 유지되고 여러 프로세스에 매핑되며 개별 프로세스에 맞게 커스터마이즈해야 하는 페이지만 복제됩니다(기호가 다르게 해결되기 때문에). 일반적으로 쓰기 시도 시 페이지를 투과적으로 복사하고 쓰기를 허용하는 Copy-on-Write라고 하는 메커니즘에 의해 복제됩니다.사재를 쓰다

메모리 공유(특히 공유 프로시저나 포인터 베이스의 구조)는, 복수의 주소 공간 operating [2]system에 비해 심플합니다.

Unix 계열 시스템에서 지원

POSIX는 공유 메모리 사용을 위한 표준화된 API인 POSIX 공유 메모리를 제공합니다.이것은 기능을 사용합니다.shm_openprom sys/mman.h.[3] POSIX 프로세스 간 통신(POSIX:XSI Extension의 일부)에는 공유 메모리 기능이 포함됩니다.shmat,shmctl,shmdt그리고.shmget.[4][5] Unix System V는 공유 메모리용 API도 제공합니다.이는 sys/shm.h의 shmget을 사용합니다.BSD 시스템은 여러 프로세스에서 사용할 수 있는 "익명의 매핑 메모리"를 제공합니다.

에 의해 생성된 공유 메모리shm_open지속적입니다.프로세스에 의해 명시적으로 삭제될 때까지 시스템에 남아 있습니다.이 경우 프로세스가 크래시하여 공유 메모리를 청소하지 못할 경우 시스템이 셧다운될 때까지 남아 있다는 단점이 있습니다.

또한 POSIX는mmap파일을 메모리에 매핑하기 위한 API. 매핑을 공유하여 파일 내용을 공유 메모리로 사용할 수 있습니다.

2.6 커널 이후를 기반으로 한 Linux 디스트리뷰션에서는 /dev/shm을 RAM 디스크 형태로 공유 메모리로 제공합니다.구체적으로는, 메모리에 격납되어 있는 월드 라이트 가능 디렉토리(시스템내의 모든 유저가 파일을 작성할 수 있는 디렉토리)로서 사용합니다.RedHat 기반 배포와 Debian 기반 배포 모두 기본적으로 포함됩니다.커널 컨피규레이션파일 [6]내에서는 이 유형의 RAM 디스크에 대한 지원은 완전히 옵션입니다.

Windows에서의 지원

Windows 에서는, 다음을 사용할 수 있습니다.CreateFileMapping그리고.MapViewOfFile여러 프로세스에서 [7]파일의 영역을 메모리에 매핑하는 함수입니다.

크로스 플랫폼 지원

일부 C++ 라이브러리는 공유 메모리 기능에 대한 포터블 및 객체 지향 액세스를 제공합니다.예를 들어 Boost에는 Boost가 포함되어 있습니다.프로세스 C++ 라이브러리와[8] Qt는 QShared Memory [9]클래스를 제공합니다.

프로그래밍 언어 지원

POSIX 바인딩(예를 들어 C/C++)을 사용하는 프로그래밍 언어의 경우 운영 체제에서 제공하는 함수를 호출하여 공유 메모리 영역을 생성하고 액세스할 수 있습니다.다른 프로그래밍 언어에는 유사한 효과를 위해 이러한 운영 기능을 사용하는 고유한 방법이 있을 수 있습니다.를 들어 PHP는 POSIX [10]함수와 유사한 공유 메모리를 만들기 위한 API를 제공합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ El-Rewini, Hesham; Abd-El-Barr, Mostafa (2005). Advanced Computer Architecture and Parallel Processing. Wiley-Interscience. pp. 77–80. ISBN 978-0-471-46740-3.
  2. ^ 제프리 S.체이스; 헨리 M.레비; 마이클 J.필리, 그리고 에드워드 D.라조스카."단일 주소 공간 운영체제에서의 공유와 보호".doi:10.1145/195792.195795 1993.3 페이지
  3. ^ 단일 Unix 사양의 shm_open 문서
  4. ^ Robbins, Kay A.; Robbins, Steven (2003). Unix systems programming: communication, concurrency, and threads (2 ed.). Prentice Hall PTR. p. 512. ISBN 978-0-13-042411-2. Retrieved 2011-05-13. The POSIX interprocess communication (IPC) is part of the POSIX:XSI Extension and has its origin in Unix System V interprocess communication.
  5. ^ 단일 UNIX 사양의 공유 메모리 기능.
  6. ^ Christoph Rohland; Hugh Dickins; KOSAKI Motohiro. "tmpfs.txt". kernel.org. Retrieved 2010-03-16.
  7. ^ MSDN에서 이름 있는 공유 메모리 생성
  8. ^ Boost. 프로세스 간 C++ 라이브러리
  9. ^ "QSharedMemory Class Reference".
  10. ^ PHP-API의 공유 메모리 함수

외부 링크

  • IPC: Dave Marshall의 공유 메모리
  • 공유 메모리 소개, 12장 (Richard Stevens의 저서) "UNIX Network Programming, Volume 2, Second Edition:프로세스 간 통신"을 참조하십시오.
  • Shared Hash File, 오픈소스 공유 메모리 해시 테이블입니다.