■ 개념
  
   공유메모리는 단어 뜻에서 알 수 있듯이 하나의 프로세스에서가 아니라 여러 프로세스가 함께 사용하는 메모리를 말한다.
   이 공유 메모리를 이용하면 프로세스끼리 통신을 할 수 있으며, 같은 데이터를 공유할 수 있다.
   이렇게 같은 메모리 영역을 공유하기 위해서는 공유메모리를 생성한 후 프로세스의 자신의 영역에 첨부를 한 후에
   마치 자신의 메모리를 사용하듯 사용한다.


■ shmget() - 공유메모리 생성 or 접근

   shmget()은 주어진 인자 key를 접근번호로 하는 공유메모리 공간할당을 커널에 요청한다.
   커널에서 성공적으로 공유메모리 공간을 할당하게 되면 공유 메모리를 가리키는 식별자를 리턴한다.
   생성될 공유메모리 공간의 크기는 size를 통해서 byte 단위 크기로 지정할 수 있다.
   
공간의 할당은 shmflg가 IPC_PRIVATE이거나 key 를 가지는 공유메모리영역이 존재하지 않거나,
   IPC_CREAT가 지정되었을 경우 (shmflg&IPC_CREAT가 0이 아닌)에 이루어진다.


   #include <sys/ipc.h>

   #include <sys/shm.h>

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

   - key_t key : 공유 메모리를 구별하는 식별 번호
   - int size : 공유 메모리 크기
   - int shmflg : 동작 옵션
                      1) IPC_CREATE
                         : key에 해당하는 공유 메모리가 없다면 새로 생성한다.
                           IPC_CREAT 값을 입력 한 후 | 연산자를 덧붙혀 허용권한을 설정한다.
                           만약있다면 무시하며
생성을 위해 접근 권한을 지정해 주어야 한다.
                      2) IPC_EXCL
                         : 공유 메모리가 이미 있다면 실패로 반환하며 공유 메모리에 접근하지 못한다.
                          
이 옵션이 없어야 기존 공유 메모리에 접근할 수 있다.

   반환 -1 : 실패
   shmget() 함수는 공유메모리의 확인자(ID)값을 리턴한다.


ex) shmget(7530, 1028, IPC_CREAT|0660) ;


■ shmat() - 공유 메모리를 프로세스에 첨부

   shmat()는 공유메모리 식별자인shmid에 공유 메모리 세그먼트를 붙이기 위해서 사용한다.
   붙이는 영역은
shmaddr
로 결정할 수 있다. 만약 shmaddr가 NULL이라면 시스템은 적당한 사용하지 않는 메모리 영역을 붙이게 된다.
  

   #include <sys/type.h>

   #include <sys/shm.h>

    void *shmat(int shmid, const void* shmaddr, int shmflg);
 
   - int 
shmid : 공유 메모리를 구별하는 식별번호
   - void *shmaddr : 첨부되는 어드레스 주소, 일반적으로 NULL을 지정(0으로 설정하면 커널에 매핑되지 않은 지역을 자동으로 찾는다.)
   - int shmflg : 동작옵션

  
SHM_RDONLY : 공유 메모리를 읽기 전용으로
  
SHM_RND : shmaddr이 NULL이 아닌 경우일 때만 사용되며, shmaddr을 반올림하여 메모리 페이지 경계에 맞춘다.

  
반환 (void *)-1 : 실패
   shmat() 함수는 해당 공유 메모리 id값에 대한 어드레스를 리턴해준다. 
   
   ex) shmat(shmid, NULL, 0);


■ shmdt() - 공유 메모리를 분리

   shmdt()는 공유 메모리 영역으로 부터 shmaddr주소를 분리 시키기 위해서 사용한다.
   공유메모리 영역의 분리는 shmat 시스템 콜로 연결된 값과 동일한 shmaddr을 가지고 있는 연결된 영역들중 하나여야 한다.

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

   int shmdt(const void *shmaddr);

   -
void *shmaddr : 분리할 공유 메모리 주

   반환 -1 : 실패 (
0 : 공유 메모리 분리 성공 )


■ shmctl() - 공유메모리를 제어

   
shmctl()은 공유메모리에 대한 정보를 구하거나 변경 또는 제거하기 위해서 사용한다.

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

   int shmctl(int shmid, int cmd, struct shmid_ds *buf);
   
   - shmid : 공유 메모리 식별 번호
   - cmd : 제어명령
   - shmid_ds *buf :  공유메모리 정보를 구하기 위한 버퍼 포인터

  ○ cmd 제어명령
   - IPC_RMID : shmid로 지정한 공유 메모리를 제거하고 구조체를 제거한다.
   - IPC_SET : 공유메모리의 정보 내용중 shm_perm.uid, shm_perm.gid, shm_perm.mode 값을 세번째 인자로 지정한 값으로 치환한다.
   - IPC_STAT : 현재 공유 메모리의 정보를 buf로 지정한 메모리에 저장한다.
   - SHM_LOCK : 공유 메모리 세그먼트를 잠근다.
   - SHM_UNLOCK : 공유 메모리 세그먼트의 잠금을 해제한다.

 

'P rogramming > Linux System' 카테고리의 다른 글

라이브러리 함수 목록  (0) 2011.09.29
시스템 콜 목록  (0) 2011.09.29
시스템콜 과 라이브러리 함수  (0) 2011.09.29
리눅스 시스템 프로그래밍  (0) 2011.09.29
mmap(), munmap(), msync() - 메모리맵  (1) 2011.04.19
by 민트앤라떼 2011. 4. 6. 13:54