CS(Computer Science)/UNIX

UNIX - [Shared memory]

seongmik 2023. 1. 2. 11:15
728x90
반응형

shared memory (공유 메모리)

  • 둘 이상의 프로세스가 물리적 메모리의 일부를 공유
  • 가장 효율적인 IPC기법이다.

 

shmget 시스템 호출

#include<sys/types.h>
#include<sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int permflag);

/*
> key : 공유 메모리 영역의 identifier
> size : 공유 메모리 영역의 최소 크기
> permflag : access permission|IPC_CREAT|IPC_EXCL
> return 값 : 공유 메모리 영역의 identifier
*/

 

공유 메모리 생성 예

  • 512byte의 문자를 저장 할 공유 메모리 생성
    • shmid1 = shmget(0111, 512, 0600|IPC_CREAT);
  • 10개의 정수를 저장할 공유 메모리 생성
    • shmid2 = shmget(0112, 10*sizeof(int), 0600|IPC_CREAT);
  • struct databuf의 데이터 5개를 저장 할 공유 메모리 생성
    • shmid3 = shmget(0113, 5*sizeof(struct databuf), 0600|IPC_CREAT);

 

shmat 시스템 호출

  • shmget 호출에 의해 할당된 메모리 영역을 자신의 논리적 자료 공간에 부착

사용법

#include <sys/shm.h>
int *shmat (int shmid, const void *daddr, int shmflag);

// > shmid : 공유 메모리 identifier
  • daddr :
    • process address space 내의 부착 위치
    • NULL인경우시스템이위치결정
  • shmflag :
    • SHM_RDONLY : 공유 메모리에 대해 읽기만 가능
    • 0 : 공유 메모리에 대해 읽기/쓰기 가능
  • return 값 : process 내의 유효주소
    • 실패시:(void*)-1

 

shmdt 시스템 호출

  • 공유메모리 영역을 프로세스의 논리적 주소 공간으로부터 떼어낸다.

사용법

int shmdt (memptr);

/*
> memptr : 공유 메모리 영역에 대한 유효주소 
> return값:0or-1
*/

 

shmat를 이용한 공유 메모리 부착 예

  • 512byte의 문자를 저장 할 공유 메모리 생성 후. 부착
    • buf1 = (char *)shmat(shmid1,0,0);
  • 10개의 정수를 저장 할 공유 메모리 생성 후 부착.
    • buf2 = (int *)shmat(shmid2,0,0);
  • struct databuf의 데이터 5개를 저장 할 공유 메모리 생성 후 부착
    • buf3 = (struct databuf *)shmat(shmid3,0,0);

 

공유 메모리 사용 예

  • 표준 입력으로 읽은 문자열을 공유 메모리 공간에 저장 후 출력
n=read(0, buf1, 512);
write(1, buf1, n);
  • 표준 입력으로 읽은 10개의 정수를 공유 메모리 공간에 저장 후 출력
for (i=0; i<10; i++)
		scanf("%d", buf2+i);
for (i=0; i<10; i++)
		printf("%d\\n", *(buf2+i));
  • struct databuf의 데이터 중 d_nread에 10씩 더하기
for (i=0; i<5; i++)
		(buf3+i)->d_nread+=10;
  • struct databuf의 데이터 중 d_nread와 d_buf 출력하기
for (i=0; i<5; i++)
		printf("%d ... %s", (buf3+i)->d_nread, (buf3+i)->d_buf);

 

shmctl 시스템 호출

사용법

#include <sys/shm.h>
int shmctl (int shmid, int command, struct shmid_ds *shm_stat);

/*
> command
	> IPC_STAT
	> IPC_RMID
*/

 

728x90
반응형