Shared memory

  • 같은 메모리 공간을 프로세스들이 공유
  • 동시에 Read/Write가 가능
  • Synchronization(동기화 필요)
  • Dynaminc allocation -> fork()인 경우, 공유되지 않고 메모리 영역의 복사본이 생성됨

allocation shared memory segment

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

int shmget(key_t key, size_t size, int shmflg);
  • key : IPC key
    • IPC_PRIVATE : private shared memory 생성
  • size : 공유할 메모리 크기(bytes)
  • shmflg : 생성 방법 및 접근 권한
    • IPC_CREAT : key에 대한 shared memory가 없으면, 생성
    • IPC_EXCL : key에 대한 shared memory가 있으면, error
  • return : 생성된 shared memory 객체의 identifier

attaching shared memory

#include <sys/types.h>
#incldue <sys/shm.h>

void* shmat(int shmid, const void* shmaddr, int shmflg);
  • Shared mem.을 프로세스의 address space로 매핑
  • shmid : shared memory segment ID
  • shmaddr : shared memory를 연결할 주소
    • Generally, 0(NULL) : 시스템이 적절한 주소 선택
  • shmflg : shared memory에 대한 접근 권한
    • 0 : Read/Write
    • SHM_RDONLY : Read only
  • return :  매핑된 주소, -1 : error

detaching shared memory

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

int shmdt(const void* shmaddr);
  • Address mapping 해제
  • shmaddr : 연결을 해제할 메모리 주소
  • return
    • 0 : success
    • -1 : error

controlling shared memory

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

int shmctl(int shmid, int cmd, struct shmid_ds* buf);
  • shmid : shared memory segment ID
  • cmd : 수행할 제어기능
    • IPC_STAT : shmid에 해당하는 shmid_ds를 읽어옴
    • IPC_RMID : shmid에 해당하는 shared memory 삭제
  • buf : 제어기능에 사용되는 구조체
    • cmd에 따라 용도가 지정됨
  • return
    • 0 : success
    • -1 : fail

Example

server

#include <sys/types.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void handler(int dummy) {}

int main(void) {
        key_t key;
        int shmid;
        void* shmaddr;
        char buf[1024];
        sigset_t mask;

        key = ftok("shmfile", 1);
        shmid = shmget(key, 1024, IPC_CREAT|0666);

        sigfillset(&mask);
        sigdelset(&mask, SIGUSR1);
        sigset(SIGUSR1, handler);

        printf("Listener wait for Talker\n");
        sigsuspend(&mask);

        printf("Listener Start ====\n");
        shmaddr = shmat(shmid, NULL, 0);
        strcpy(buf, shmaddr);
        printf("Lister received : %s\n", buf);

        strcpy(shmaddr, "Have a nice day\n");
        sleep(3);
        shmdt(shmaddr);

        return 0;
}

client

#include <sys/types.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
        key_t key;
        int shmid;
        void* shmaddr;
        char buf[1024];

        key = ftok("shmfile", 1);
        shmid = shmget(key, 1024, 0);

        shmaddr = shmat(shmid, NULL, 0);
        strcpy(shmaddr, "Hello, I'm talker\n");

        kill(atoi(argv[1]), SIGUSR1);
        sleep(2);
        strcpy(buf, shmaddr);

        printf("Listener said : %s\n", buf);
        system("ipcs -m");
        shmdt(shmaddr);
        shmctl(shmid, IPC_RMID, NULL);

        return 0;
}

'💻 Computer Science > System' 카테고리의 다른 글

[System] Socket  (0) 2024.02.02
[System] Semaphore  (1) 2024.01.26
[System] Named Pipe  (1) 2024.01.26
[System] 메모리 맵핑  (1) 2024.01.26
[System] 시그널  (1) 2024.01.25