공유 메모리는 IPC(Inter-Process Communication)의 한 가지 방법으로 프로세스간 통신이 필요할 경우 사용
공유 메모리를 통한 통신은 둘 이상의 프로세스가 공통 메모리에 액세스 할 수 있는 개념으로 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근 가능
공유 메모리의 생성 요청은 최초 공유 메모리 영역을 만드는 프로세스가 커널에 공유 메모리 공간의 할당을 요청함으로써 이루어지며 만들어진 공유 메모리는 커널에 의해서 관리됨
만들어진 공유 메모리는 시스템을 리부팅하거나 직접 공유 메모리의 공간을 삭제시키지 않는 한, 공유 메모리를 사용하는 모든 프로세스가 없어졌다고 하더라도 공유 메모리의 공간은 계속적으로 유지됨
프로세스가 커널에게 공유 메모리 공간을 요청하게 되면, 커널은 공유 메모리 공간을 할당시켜주고 공유 메모리 공간을 관리하기 위해 내부 자료구조를 사용
공유 메모리 정보들은 shmid_ds라는 구조체에 의해 관리되며 shm.h에 정의되어 있음
공유 메모리를 사용하지 위해서는 아래의 헤더파일을 include 해줘야됨
#include <sys/types.h>
#include <sys/shm.h>
shmget
함수 원형: int shmget(key_t key, int size, int shmflg)
커널에 공유 메모리 공간을 요청하기 위해 사용하는 시스템 호출 함수
KEY값은 고유의 공유 메모리임을 나타냄
Argument (KEY, MEMORY_MAX_SIZE, 접근권한 | 생성방식)
shmmat
함수 원형: void *shmat( int shmid, const void *shmaddr, int shmflg
공유 메모리 공간을 생성한 이후, 공유메모리에 접근할 수 있는 int형의 "식별자"를 얻음
공유 메모리를 사용하기 위해 얻은 식별자를 이용하여 현재 프로세스가 공유 메모리에 접근할 수 있도록 연결하는 작업
Argument (식별자, 메모리가 붙을 주소 (0을 사용할 경우 커널이 메모리가 붙을 주소를 명시), 읽기/쓰기 모드)
shmdt
함수 원형: int shmdt( const void *shmaddr)
프로세스가 더이상 공유 메모리를 사용하지 않을 경우 프로세스와 공유 메모리를 분리시키는 작업
해당 시스템 호출 함수는 현재 프로세스와 공유 메모리를 분리시킬 뿐, 공유 메모리의 공간을 삭제하지 않음
shmdt 가 성공적으로 수행되면 커널은 shmid_ds 의 내용을 갱신, 즉 shm_dtime, shm_lpid, shm_nattch 등의 내용을 갱신 하는데, shm_dtime 는 가장 최근에 dettach (즉 shmdt 를 사용한)된 시간, shm_lpid 는 호출한 프로세세의 PID, shm_nattch 는 현재 공유 메모리를 사용하는 (shmat 를 이용해서 공유 메모리에 붙어있는) 프로세스의 수를 돌려준다.
shmctl
함수 원형: int shmctl(int shmid, int cmd, struct shmid_ds *buf)
공유 메모리를 제어하기 위해 사용
shmid_ds 구조체를 직접 제어함으로써, 해당 공유 메모리에 대한 소유자, 그룹 등의 허가권을 변경하거나, 공유 메모리 삭제, 공유 메모리의 잠금을 설정하거나 헤제하는 작업
Option
IPC_STAT : 공유 메모리 공간에 관한 정보를 가져오기 위해서 사용됨, 정보는 buf 에 저장됨
IPC_SET: 공유 메모리 공간에 대한 사용자권한 변경을 위해서 사용됨. 사용자 권한 변경을 위해서는 슈퍼유저 혹은 사용자 권한을 가지고 있어야 함
IPC_RMID : 공유 메모리 공간을 삭제하기 위해서 사용됨. 이 명령을 사용한다고 해서 곧바로 사용되는건 아니며, 더이상 공유 메모리 공간을 사용하는 프로세스가 없을 때, 즉 shm_nattch 가 0일때 까지 기다렸다가 삭제됨.
2. (DB server) 정의 및 사용
1) 정의
Shared memory is an OS feature that allows the DB server threads and processes to share data by sharing access to pools of memory
2) 사용
DB server가 공유 메모리를 사용하는 목적:
to reduce memory usage and disk I/O
to perform high-speed communication b/w processes
shared memory enables the DB server to reduce overall memory usage b/c the participating processes (e.g., virtual processors) do not require maintaining private copies of the data that is in shared memory
shared memory reduces disk I/O, b/c buffers (i.e., managed as a common pool) are flushed on a DB server-wide basis instead of a per-process basis
Furthermore, a virtual processor can often avoid reading data from disk b/c the data is already in shared memory as a result of an earlier read operation
the reduction in disk I/O reduces execution time
shared memory provides the fastest method of interprocess communication, b/c it processes read and write messages at the speed of memory transfers