공유 메모리(Shared Memory)
공유 메모리(Shared Memory)는 운영체제의 프로세스 간 통신(IPC) 기법 중 하나로, 여러 프로세스가 동시에 접근할 수 있는 메모리 영역이며, 커널에 의해 생성되고 관리되는 공통 메모리 공간이다.
이는 여러 프로세스가 동일한 물리적 메모리 영역에 접근할 수 있게 해주며, IPC 메커니즘 중에서 가장 빠른 통신 방법을 제공한다.
작동 원리
- 프로세스가 커널에 공유 메모리 할당을 요청
- 커널이 해당 프로세스에 메모리 공간을 할당
- 이후 다른 프로세스들도 해당 메모리 영역에 접근 가능
공유 메모리의 생성과 관리
공유 메모리를 사용하는 일반적인 단계는 다음과 같다:
- 공유 메모리 세그먼트 생성
- 공유 메모리 접근 및 데이터 교환
장점
- 높은 성능: 커널의 개입 없이 직접 메모리에 접근하여 빠른 IPC 가능
- 효율성: 불필요한 데이터 복사를 방지하여 오버헤드 감소
- 유연성: 프로그램 레벨에서 자유로운 통신 가능
주의사항
- 동기화 이슈: 여러 프로세스가 동시에 접근할 수 있어 데이터 일관성 문제 발생 가능
- 세마포어 등의 동기화 메커니즘과 함께 사용 필요
공유 메모리의 동기화
여러 프로세스가 동시에 공유 메모리에 접근할 때 발생할 수 있는 문제를 해결하기 위해 동기화가 필요하다:
|
|
실제 활용 예시
데이터베이스 캐싱:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
class SharedCache: def __init__(self, size=1024*1024): # 1MB 캐시 self.shared_memory = mmap.mmap(-1, size) self.index = {} # 캐시 인덱스 def cache_data(self, key, value): """데이터를 캐시에 저장""" position = len(self.shared_memory.read()) self.shared_memory.write(value.encode()) self.index[key] = (position, len(value)) def get_cached_data(self, key): """캐시된 데이터 조회""" if key in self.index: position, length = self.index[key] self.shared_memory.seek(position) return self.shared_memory.read(length).decode() return None
실시간 데이터 처리:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
class RealTimeDataProcessor: def __init__(self): self.shared_buffer = self.create_shared_memory(1024*1024) self.write_position = 0 self.read_position = 0 def process_data_stream(self, data): """실시간 데이터 스트림 처리""" # 데이터 쓰기 self.write_to_buffer(data) # 다른 프로세스에서 데이터 처리 processed_data = self.read_from_buffer() return processed_data
구현
- 공유 메모리 생성 및 접근을 위한 시스템 콜 사용 (예: shmget, shmat)
- 프로세스 간 공유 메모리 식별자를 통한 접근