[OS] System-V shared Memory API

Hα ყҽσɳɠ·2020년 4월 20일
0

Operating system

목록 보기
5/10

이전 포스팅에서 설명한 IPC의 방법 중 하나인 Shared-Memory를 구현하는 방법에 대해 알아보겠습니다!


System V

✅ shmget() - create shared memory

int shmget(key_t key, int size, int shmflg);

🔍parameter

key : Key of shared memory segment

  • key는 ftok()함수를 통해서 생성된 값이나, 또는 임의의 숫자를 사용한다.
  • IPC_PRIVATE : key를 IPC_PRIVATE로 설정하면, key값은 중복되지 않는 임의의 값으로 자동으로 생성된다.

size : size of shared memory segment

  • 할당할 메모리의 byte단위 크기
  • 주로 Buffer size가 들어간다.

shmflg : flags

  • shared memory에 대한 설정값으로 IPC_CREAT, IPC_EXCL, access권한 9 bit의 bit or 연산으로 설정한다.
  • S_IRUSR : 사용자 읽기 (사용자가 파일과 디렉토리 항목들을 읽을 수 있다.
  • S_IWUSR : 사용자 쓰기 (사용자가 파일을 기록, 제거, 생성할 수 있다.)
  • IPC_CREAT : shared memory를 생성한다.
  • IPC_EXCL : key로 생성된 shared memory segment가 없는 경우에만 생성하고, 이미 같은 key로 shared memory가 생성되어 있다면 오류가 발생한다.
  • ❓ 둘다 포함되어 있지 않은 경우 ❓ 이미 만들어진 shared memeory에 대한 shm id를 return한다.


✅ shmat() - attach shared memory to address space of process

void shmat(int shmid, char *shmaddr, int shmflg);

🔍parameter

shmid

  • shmget() 리턴으로 얻은 세그먼트 ID

shmaddr

  • attach 되도록 기대되는 메모리 주소 (보통 NULL)

shmflg

  • attach flags

공유메모리는 attach된 주소부터 쓰여지게 된다.

shared_mem = (char *)shmat(seg_id, NULL, 0);
sprintf(shared_mem, "writing to shared memory");

✅ shmdt() - detach shared memory from address space of process

void shmdt(char *shmaddr);

✅ shmctl() - deallocating a shared memory block

shmctl(shmid, IPC_RMID, NULL);

shm_attach가 0이 되었을 때, shared memory block을 deallocate한다.


POSIX

✅ shm_open() - process creates or open shared memory segment

shm_id = shm_open(name, O_CREAT | O_RDWR, 0666);

🔍parameter

O_CREAT

  • creat if it does not yet exist

O_RDWR

  • open for reading and writing


✅ ftuncate() - set the size of the object

ftuncate(shm_id, 4096);


✅ mmap() - map shared memory segment to process address space

mmap(0, 4096, PROT_WRITE, MAP_SHARE, shm_id, 0)

메모리를 매핑은 파일을 프로세스의 메모리에 매핑하는 것이다.

위의 예제는 매핑된 파일 읽기/쓰기 모두 가능하다.

MAP_SHARED: 다른 유저와 데이터의 변경 내용을 공유한다.
PROT_READ: 매핑된 파일을 읽기만 한다.
PROT_WRITE: 매핑된 파일에 쓰기를 허용한다.
PROT_EXEC: 매핑된 파일을 실행할 수 있다.
PROT_NONE: 매핑된 파일에 접근할 수 없다.

매핑이 성공하면, mmap은 공유메모리의 포인터를 리턴한다.


공유메모리 사용을 마쳤으면 위의 2개의 함수로 unmapping과 unlink를 하여야 한다.
만약, 수행하지 않는다면 프로세스는 종료되어도 메모리 영역에 공유메모리가 제거되지 않아 비정상적인 작동으로 이어질 수 있다.

profile
𝑯𝒐𝒏𝒆𝒔𝒕𝒚 𝑰𝒏𝒕𝒆𝒈𝒓𝒊𝒕𝒚 𝑬𝒙𝒄𝒆𝒍𝒍𝒆𝒏𝒄𝒆

0개의 댓글