Shared Memory
여러 프로세스가 동일한 메모리를 매핑
- 특징
- 빠름
- 데이터 복사 없음
- 동기화 문제
System V
- 함수
- ftok(pathname, project_id) - 파일의 inode와 id를 활용해 key를 생성
- shmget: key 생성
- shmat: attach
- shmdt: dettach
- shmctl
- shmctl(shm_id, IPC_RMID, NULL)
- 삭제 표시, 모든 process가 dt 후에 실제로 삭제됨
- shmctl(shm_id, IPC_RMID, NULL)
- 코드
key_t key = ftok("shmfile", 65);
int shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);
if (shmid == -1) {
perror("shmget");
return 1;
}
char *data = (char *)shmat(shmid, NULL, 0);
if (data == (char *)-1) {
perror("shmat");
return 1;
}
strcpy(data, "Hello from writer process");
printf("writer wrote: %s\n", data);
shmdt(data);
posix
file interface를 활용
named shared memory
- 함수
- shm_open - key가 아닌 file 이름을 사용
- mmap
- shm_unlink - 이름을 삭제 (새로운 연결을 못 하도록, 참조 유지는 기능)
- 코드
int fd = shm_open(
SHM_NAME,
O_CREAT | O_RDWR,
0666
);
if (fd == -1) {
perror("shm_open");
return 1;
}
// shared memory 크기 설정
if (ftruncate(fd, SHM_SIZE) == -1) {
perror("ftruncate");
return 1;
}
// memory mapping
char *ptr = mmap(
NULL,
SHM_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd,
0
);
if (ptr == MAP_FAILED) {
perror("mmap");
return 1;
}
strcpy(ptr, "Hello POSIX shared memory");
printf("writer wrote: %s\n", ptr);
munmap(ptr, SHM_SIZE);
close(fd);
unnamed shared memory
이름 없이 부모 자식 프로세스 간에 공유
- mmap + MAP_SHARED
mmap(NULL, size, PROT_*, MAP_SHARED | MAP_ANONYMOUS, -1, 0)- fork 전체 생성
- MAP_SHARED가 아닌 MAP_PRIVATE을 하면 copy on write로 동작
- munmap으로 해제