개요
공유 메모리(Shared memory)는 컴퓨터 환경에서 여러 프로그램이 동시에 접근할 수 있는 메모리이다. 과다한 복사를 피하거나 해당 프로그램 간 통신을 위해 고안되었다. 환경에 따라 프로그램은 하나의 프로세서에서나 여러 개의 프로세서에서 실행할 수 있다. (예를 들어 여러 개의 스레드 간에) 하나의 프로그램 안에서 통신을 위해 메모리를 사용하는 일은 일반적으로 공유 메모리로 부르지 않는다.
각각의 프로세스는 하나의 큰 가상 메모리 공간을 할당 밥는다. 스레드간의 통신은 메모리를 통해서 일어나는데, 이는 thread shared memory를 통해서 이루어 지는 것이다. 그러나 thread는 힙 영역을 공유할 수 있음으로 이 경우는 특별히 shared memory라고 부르지는 않는다. 그러나 여러 프로세스가 하나의 shared memory를 통해서 통신한다면, 이를 shared memory라고 말한다. 또한 하드웨어 적으로도 shared memory를 위해서 특별히 공간을 할당 할 수도 있는데, 예를 들어서 커널의 per cpu와 같은 경우를 들 수 있다. per cpu공간에 진입하기 위해서 segmentation을 이용하여 이러한 영역에 접근하며 이러한 정보는 ESR에 적혀있다.
Coherence / Consistency
공유 메모리의 통일성 (하나의 공간에 작성한 내용은 서로 다른 곳에서 읽어들이더라도 같아야 한다.)와 일관성 (서로 다른 공간에 작성한 내용은 그 순서에 맞추어서 다른 곳에서도 읽어야 한다.)는 메모리를 공유할 경우 반드시 지켜주어야 하는 법칙이다. 메모리 일관성, 메모리 통일성 참조.
Multicore환경에서의 문제점
Shared Memory는 각각 Core의 CPU cache에 대한 coherency를 맞추기 위해서, cache coherence protocol을 이용하여 모든 cache line들을 동기화 시켜주어야 한다. Single 혹은 core수가 적으면 몇십사이클안에 해결할 수 있지만, 16코어만 같은 메모리에 접근하여도 대략 12,000 cycles들을 소비하는 것으로 나타난다 [paper - multikernel]. 즉 Multicore 환경에서 Message passing을 이용하는 것이 적합하다.