메모리와 동시성 (Memory and Concurrency)
이 문서는 동시성 프로그래밍에서 메모리와 동시성(Concurrency) 문제를 다룹니다. 특히, 공유 메모리의 일관성 문제와 이를 해결하기 위한 메모리 장벽(Memory Barriers)에 대해 자세히 설명합니다.
공유 메모리 (Shared Memory)
- 유형:
- 동일 스레드, 다른 시간: 동일한 프로세스 내에서 하나의 스레드가 서로 다른 시간에 사용하는 메모리 (비동기적으로 사용될 수 있음) → 문제X
- 다른 스레드, 동일 프로세스: 동일한 프로세스 내에서 여러 스레드가 사용하는 메모리 (동시에 사용될 수 있음) → 문제 가능성 O
- 다른 프로세스: 여러 프로세스가 사용하는 메모리 (동시에 사용될 수 있음)
→ 문제 가능성 O
- 획득 방법:
- 프로세스 내 공유: 특별한 설정 없이 공유 가능
- 프로세스 간 공유: 커널의 지원 필요
fork()
자식프로세스를 만들기 전에 shared 메모리 영역을 설정한다.
- 실행중인 프로세스들 사이에서 매핑
shm_open()
- 메모리에 매핑된 파일을 같이 사용함
일관성 문제 (Consistency Problem)
- 전통적인 기대: 메모리 위치에 대한 쓰기는 즉각적이고 지속적입니다.
- 여러 흐름이 동시에 메모리에 접근하면 안될 수 있다.
- 해결책: 동기화를 통해 접근 타이밍을 제어하고, 메모리 장벽을 사용하여 데이터 가시성을 보장합니다. 하드웨어 가까운 lower level에서 지켜줘야되는 부분들이 많다.
Temporal Synchronization
: 실행흐름에서만 고려하는 일시적인 동기화 문제 가 아니다.
→ 메인 메모리 말고도 여러가지 부품이 사용되기 때문에 완벽히 순서가 보장되지 않을뿐더러 saptial concern 공간 문제도 있다.
캐싱 (Caching)
- 캐시의 역할: 메모리 접근 성능을 향상시키기 위해 사용됩니다.
- 다양한 캐시 계층: CPU 코어별, 코어 그룹별, 프로세스별 등 다양한 수준의 캐시가 존재합니다.
- 공유 및 지역 캐시: 일부 캐시는 공유되지만, 일부는 지역적 (특정 CPU 코어나 프로세스에만 국한)
- 쓰기 전파 문제: 지역 캐시에 쓰기 작업이 발생하면 다른 코어나 프로세스에서 해당 변경 내용을 즉시 볼 수 없게 됩니다.

- Lower level 일수록 더 빠르고 크기가 작다.
- 보통 L1 이 cpu에 연결된 것이다. → 자주 사용하면 성능이 좋다.
- 자주사용하는 데이터는 지역적으로 담아두면 좋다.
Caching Structure

: 특정 코어 그룹에서만 지원해 줄 수 있는 레이어가 있다.