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
반응형
'CS(Computer Science) > UNIX' 카테고리의 다른 글
[UNIX] read() write() 시스템 콜의 사용법과 주의사항 (2) | 2023.02.05 |
---|---|
UNIX - [Record Locking] (0) | 2023.01.03 |
UNIX - [Semaphore] (0) | 2023.01.01 |
UNIX - [시스템 V의 프로세스간 통신 - Message queue] (0) | 2023.01.01 |
UNIX - [PIPE - 2] (0) | 2022.12.31 |