IPC - Shared Memory

Jongwon·2021년 12월 18일
0

Linux Programming

목록 보기
23/25

공유 메모리

관련이 없는 다수의 프로세스가 공유하는 메모리 영역. 효율적인 데이터 전달 방법.
한 프로세스가 공유메모리에 데이터 기록하면, 다른 프로세스가 즉시 기록한 내용 읽을 수 있다.
데이터 기록을 확인하기 위한 동기화는 프로그래머가 해결

struct shmid_ds {
	struct ipc_perm shm_perm;      /* 접근 권한 */
	int shm_segsz;                 /* 세그먼트 크기(바이트) */
	time_t shm_atime;              /* 마지막 접근 시간 */
	time_t shm_dtime;              /* 마지막 제거 시간 */
	time_t shm_ctime;              /* 마지막 변경 시간 */
	unsigned short shm_cpid;       /* 생성한 프로세스 ID */
	unsigned short shm_lpid;       /* 마지막으로 동작한 프로세스 ID */
	short shm_nattach;             /* 부착한 프로세스 수 */
	unsigned short shm_npages;     /* 공유메모리 크기(페이지 수) */
	unsigned long *shm_pages;      /* 페이지 테이블 항목을 위한 필드 */
	struct shm_desc *attaches;     /* 접근을 위한 기술자들 */
}

공유 메모리 동작

  1. shmget()으로 공유 메모리 생성 후 ID 반환
  2. shmat(0)으로 프로세스의 특정 주소 공간에 공유 메모리를 배정. 그 주소에 접근 시 공유메모리에 작성 가능하다. 프로세스마다 공유 메모리를 지정한 주소 공간은 다르다.
  3. 프로세스가 그 주소에서 기록 시 다른 프로세스에서 변경된 내용 읽을 수 있다.
  4. 사용이 끝나면 프로세스의 주소에서 공유 메모리를 detach하고 커널에 공유 메모리 해체 요청


<sys/shm.h> 헤더

  • int shmget(key_t key, size_t size, int shmflg)
    공유 메모리 생성 후 ID 반환, key에 해당하는 공유 메모리 존재 시 ID 반환, 인자들은 msgget과 동일하게 동작
  • void shmat(int shmid, const void shmaddr, int shmflg)
    *shmaddr에 shmid(shared memory)지정, 보통은 주소인자에 0으로 준다. 성공시 메모리 주소, 실패 -1(내가 준 주소가 사용중일때)
int shmflg
- SHM_RDONLY: 공유 메모리를 읽기 전용으로 사용
- SHM_RND: shmaddr이 NULL이 아닐 때, shmaddr을 반올림하여 페이지 크기 경계에 맞춤(주소 정렬)
  • int shmdt(void *shmaddr)
    프로세스 주소 공간에서 공유메모리 분리. 0이면 성공, -1은 실패

  • int shmctl(int shmid, int cmd, struct shmid_ds *buf)
    공유메모리 제어. 성공 0, 실패 -1. cmd는 msg queue와 동일
    IPC_SET의 경우엔 shm_perm과 shm_ctime 멤버만 변경가능

profile
Backend Engineer

0개의 댓글