shared memory란 서로 다른 process 간에도 memory를 공유하는 것을 의미한다.
이 때 shared memory의 정보(ID, addr 등)는 kernel에서 관리 해 준다.
linux에서는 shared memory의 생성, 삭제, 접근 및 해제 등의 함수가 구현되어 있다.
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
Description
shmget()은 key값을 통해 shared memory의 id를 얻어오는 함수이다. 이 때, 동일 key로 생성된 shared memory가 없으면 새로 할당하는 것도 가능하다.
Parameter
- key: shared memory의 id를 얻어오기 위해 사용할 key 이다.
- size: 얻어올 shared memory의 크기이다.
- shmflg: shared memory를 얻어올 때 사용할 flag이다. 자주 사용하는 flag는 다음과 같다.
* IPC_CREATE: key 값에 해당하는 shared memory가 없다면 새로 생성한다. 생성 시에는 권한을 설정 해 주어여 한다.
* IPC_EXCL: key 값에 해당하는 shared memory가 있다면 실패를 반환한다.
* 0666: IPC_CREATE시 사용할 권한이다.
Return Value
- success: shared memory의 id를 return한다.
- fail: -1을 return 하며, errno에 error type을 저장해 준다.
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
Description
shmat()는 shared memory에 attach(가상메모리에 공유메모리 위치할당) 하는 역할을 하는 함수이다.
Parameter
- shmid: 공유 자원으로 사용할 shared memory ID 이다. ID를 통해 각 process 간 동일한 shared memory에 접근할 수 있도록 한다.
- shmaddr:
* NULL로 설정할 경우, dynamic attach를 하게 되며 kernel에서 가상 메모리 주소를 자동으로 할당하게 된다.
이 때 주의할 점은 각 process 별 접근하는 실제 메모리 주소는 같지만, 가상 메모리 주소는 각각 다르게 할당된다.
그렇기 때문에 해당 shared memory 내에서 pointer 사용은 하지 말아야 한다.
* shmaddr에 주소값을 지정하면, static attach를 하게 되어 가상 메모리상의 shmaddr 위치에 shared memory가 attach 된다.
만일 shared memory 내에서 pointer를 사용하고 싶을 경우, static attach를 하면 된다.
단, 이때도 주의할 점은 dynamic attach 후 static attach를 하게 되면 dynamic attach 했던 주소 범위에 static attach를 할 수 있으며,
그때는 static attach 실패할 수 있으므로, 항상 static attach를 모두 완료한 후에 dynamic attach를 해야 한다.
- shmflag: attach시 사용할 flag이다.
* SHM_RND : 공유 메모리 주소를 프로세스에 맞게 따로 할당
* SHM_RDONLY : 공유 메모리를 읽기 전용으로 설정. shmaddr가 NULL이 아닌 경우에만 사용
Retuen value
- success: attach된 가상 메모리상의 주소값이다.
- fail: -1을 return 하며, errno에 error type을 저장해 준다.
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
Description
shmdt() 는 shared memory에 attach 되어있는 메모리를 detach(virtual memory에서 공유메모리 위치할당 해제) 하는 역할을 수행하는 함수이다.
Parameter
- shmaddr: detach 할 virtual memory 상의 address
Retuen value
- success: return 0
- fail: return -1, errno에 error type 저장
Example
'C Programming' 카테고리의 다른 글
strcmp 사용 시 buffer overflow 가능성? (0) | 2016.02.16 |
---|