shared-memory

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 후에 실제로 삭제됨
  • 코드
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으로 해제