POSIX 공유 메모리
POSIX 공유 메모리
■ 개요
POSIX shared memory는 여러 프로세스가 공통된 메모리 영역을 통해 데이터를 공유할 수 있도록 하는 기능이다. 이 메커니즘은 shm_open()
을 통해 공유 메모리 객체를 만들고, mmap()
을 통해 이를 프로세스의 주소 공간에 매핑하여 사용된다.
■ 주요 시스템 콜 및 흐름
shm_open(name, flag, mode)
공유 메모리 객체 생성 또는 열기
name
: "/myregion"과 같이/
로 시작하는 이름flag
:O_CREAT | O_RDWR
mode
:0666
권한 등
ftruncate(fd, size)
생성된 공유 메모리 객체의 크기 지정
mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)
메모리 공간을 프로세스 주소 공간에 매핑
munmap(ptr, size)
메모리 매핑 해제
shm_unlink(name)
공유 메모리 객체 삭제 (언링크)
■ 프로세스 간 공유 흐름 예시
생성자 프로세스:
shm_open()
→ftruncate()
→mmap()
→ 쓰기소비자 프로세스:
shm_open()
→mmap()
→ 읽기
■ 특징
커널의 개입은 최초 설정 시에만 필요
이후 접근은 일반 메모리 접근 속도로 처리
동기화는 별도로 구현 필요 (세마포어 등)
POSIX 메시지 큐
■ 개요
POSIX message queue는 커널 수준의 메시지 큐로, 메시지를 구조체 형태로 송수신 가능하며, 이름 기반으로 관리된다. 프로세스 간 데이터 교환 시 유용하며, 공유 메모리보다 동기화 구현이 간편하다.
■ 주요 시스템 콜 및 흐름
mq_open(name, flag, mode, attr)
메시지 큐 생성 및 열기 (
O_CREAT | O_RDWR
등)attr
은mq_attr
구조체로, 큐 속성 지정 가능
mq_send(mqd, msg_ptr, msg_len, priority)
메시지 전송
priority
는 우선순위 지정 가능
*mq_receive(mqd, msg_ptr, msg_len, priority)
메시지 수신, 블로킹/논블로킹 가능
mq_getattr() / mq_setattr()
큐 속성 조회 및 변경
mq_close() / mq_unlink()
큐 종료 및 삭제
■ 메시지 큐 구조
메시지는 FIFO 또는 우선순위 기반으로 저장
mq_attr
구조체mq_maxmsg
: 큐에 저장 가능한 최대 메시지 수mq_msgsize
: 각 메시지의 최대 크기
■ 특징
커널이 직접 동기화 및 메시지 순서 관리 수행
비동기식 신호 처리도 가능 (예:
SIGEV_SIGNAL
)공유 메모리보다 초기 설정은 복잡하지만 관리가 안정적
결론: 공유 메모리 vs 메시지 큐 비교
성능
효율고 (메모리 접근)
비교적 느림 (커널 호출 수반)
동기화
프로그래머 직접 구현 필요
내장 큐 관리로 간편함
사용 용도
대용량 연속 데이터 전송
이벤트 알림, 구조화된 통신
설정 복잡도
간단
속성 지정 등 복잡함
Last updated