Shared Memory - 코드로 이해하기

두비니

·

2021. 6. 1. 03:30

 

 

 

 

 

저번 글에서는 shared memory에 대한 이론적인 부분을 보았습니다.

이번 글에서는 공유메모리에 관련한 함수들을 알아보고, 코드를 통해 직접 이해를 해보는 걸로 합시다.

 

1. 관련 함수 파악

 

우선 크게 4가지 함수가 있습니다. 하나하나 알아보도록 하겠습니다.

 #include <sys/shm.h> 
 #include <sys/ipc.h> 

공유메모리 관련 

 

1) shmget

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

shmget함수는 처음 공유메모리를 생성하고, shmid를 얻을 때 사용하는 함수입니다.

앞선 글에서 공유메모리는 생성만 하면 다른 과정은 할 필요가 없다고 언급했었습니다.

그 과정을 담당하는 함수입니다.

다음은 매개변수에 대한 설명입니다.

  • key : 공유메모리를 설정할 때 사용하는 고유 key입니다.
  • size : 메모리의 최소 size를 의미합니다. 새로운 공유메모리를 할당받는다면 size를 명시하고 이미 존재하는 메모리면 0을 주면 됩니다.
  • shmflg : 생성할 때 옵션을 뜻하는데, 그건 다음과 같습니다.
    • IPC_CREAT : 새로운 메모리 세그먼트는 만드는 함수로, 이 flag를 사용하지 않는다면 shmget은 명시된 key와 연관된 찾고 접근할 수 있는 권한이 있는지 확인합니다.
    •  IPC_EXCL : IPC_CREAT과 함께쓰는 플래그로 만약 메모리 세그먼트가 존재하면 shmget은 실패하게 됩니다.
  • 리턴값 : shmid를 리턴합니다.

 

2) shmat

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

공유메모리를 프로세스에 attach할 때 사용하는 함수입니다.

  • shmid : shmget함수를 호출할 때 리턴값으로 받는 id값입니다. attach할 공유 메모리를 뜻합니다.
  • shmaddr : attach할 주소를 뜻합니다. 이때, 0인 경우에는 kernel이 적절한 주소를 알아서 할당합니다.
  • 리턴값 : attach한 주소를 리턴합니다.

 

3) shmdt

int shmdt(const void *shmaddr);

shmat와는 반대로, 프로세스에서 공유메모리를 detach할때 사용하는 함수입니다.

  • shmaddr : 해재할 주소로, shmat의 리턴값입니다.

 

4) shmctl

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

공유 메모리를 컨트롤하는 함수입니다. 공유메모리의 정보를 얻거나 어떤 값을 쓰거나 공유메모리를 삭제하는 등의 조작이 있습니다.

  • cmd : 실행할 컨트롤을 뜻합니다. 각 컨트롤은 공식 링크 참조 부탁드립니다.

buf : 컨트롤할 버퍼를 뜻합니다. 이것 또한 공식문서 참조 부탁드립니다.

 

 

참고

https://www.ibm.com/docs/en/i/7.2?topic=ssw_ibm_i_72/apis/ipcshmct.htm 

 

 

2. 코드로 이해하기

 

그럼 이제 코드로 이해해 봅시다.

 

다음은 단순한 코드입니다.

첫 번째 if문을 통해서 공유메모리를 할당받고, shmid에 id를 저장합니다.

그리고 두 번째 if문을 통해 memory segment에 attach를 합니다.

 

실행 결과는 다음과 같습니다.

key는 코드상에서 아예 박아놓았기 때문에 shmid는 동일하고, 공유메모리이기때문에 num자체는 증가하는걸 볼 수 있습니다.

참고로, 현재 공유메모리를 확인할 수 있는 명령어는 ipcs -m입니다.

 

 

저는 프로그램을 몇개 돌리고있는 덕분에, 되게 많이 나왔는데 마지막 줄을 보면 위에 예시와 동일한 key, shmid, perms, bytes인걸 볼 수 있습니다.

 

코드를 하나만 더 봅시다.

 

사실 위 예제랑 거의 동일합니다

마지막 if문만 추가되었어용

위에서 이야기했다시피, shmctl은 공유메모리를 control하는 함수입니다.

그리고 IPC_RMID의 경우에는 제거하도록 하는 커맨드입니다. 그러면 이론상 실행시켰을 때 할당한 공유메모리를 삭제하겠죠? 프로그램 실행 후 공유메모리 현황을 봅시다.

 

 

잘 없어진 것을 볼 수 있습니다.