문서 편집 권한이 없습니다. 다음 이유를 확인해주세요: 요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다: 사용자. 문서의 원본을 보거나 복사할 수 있습니다. [[분류: 동시성 프로그래밍]] == 개요 == 공유 메모리(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]]을 이용하는 것이 적합하다. == 라이브러리 == # [[pthread]] # [[OpenMP]] Shared memory 문서로 돌아갑니다.