공유 메모리(Shared Memory)

공유 메모리(Shared Memory)는 운영체제의 프로세스 간 통신(IPC) 기법 중 하나로, 여러 프로세스가 동시에 접근할 수 있는 메모리 영역이며, 커널에 의해 생성되고 관리되는 공통 메모리 공간이다.
이는 여러 프로세스가 동일한 물리적 메모리 영역에 접근할 수 있게 해주며, IPC 메커니즘 중에서 가장 빠른 통신 방법을 제공한다.

Shared Memory
Source: https://www.geeksforgeeks.org/ipc-shared-memory/

작동 원리

  • 프로세스가 커널에 공유 메모리 할당을 요청
  • 커널이 해당 프로세스에 메모리 공간을 할당
  • 이후 다른 프로세스들도 해당 메모리 영역에 접근 가능

공유 메모리의 생성과 관리

공유 메모리를 사용하는 일반적인 단계는 다음과 같다:

  1. 공유 메모리 세그먼트 생성
  2. 공유 메모리 접근 및 데이터 교환

장점

  • 높은 성능: 커널의 개입 없이 직접 메모리에 접근하여 빠른 IPC 가능
  • 효율성: 불필요한 데이터 복사를 방지하여 오버헤드 감소
  • 유연성: 프로그램 레벨에서 자유로운 통신 가능

주의사항

  • 동기화 이슈: 여러 프로세스가 동시에 접근할 수 있어 데이터 일관성 문제 발생 가능
  • 세마포어 등의 동기화 메커니즘과 함께 사용 필요

공유 메모리의 동기화

여러 프로세스가 동시에 공유 메모리에 접근할 때 발생할 수 있는 문제를 해결하기 위해 동기화가 필요하다:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import threading

class SynchronizedSharedMemory:
    def __init__(self):
        self.lock = threading.Lock()
        self.shared_memory = self.create_shared_memory(1024)
    
    def safe_write(self, data):
        """동기화된 쓰기 연산"""
        with self.lock:
            self.write_to_shared_memory(self.shared_memory, data)
    
    def safe_read(self, size):
        """동기화된 읽기 연산"""
        with self.lock:
            return self.read_from_shared_memory(self.shared_memory, size)

실제 활용 예시

  1. 데이터베이스 캐싱:

     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
    
  2. 실시간 데이터 처리:

     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)
  • 프로세스 간 공유 메모리 식별자를 통한 접근

참고 및 출처