shared memory
둘 이상의 프로세스가 물리적 메모리의 일부를 공유한다.
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
- return 값 : 공유 메모리 영역의 id
shmat 시스템 호출
shmget 호출에 의해 할당된 메모리 영역을 자신의 논리적 자료 공간에 부착
사용법
#include <sys/shm.h>
int *shmat(int shmid, const void *addr, int shmflag);
- addr
- process address space내의 부착 위치
- NULL인 경우 시스템이 위치 결정
- shmflag
- SHM_RDONLY : 공유 메모리에 대해 읽기만 가능
- 0: 공유 메모리에 대해 읽기/쓰기 가능
- return 값 : process 내의 유효주소
shmctl 시스템 호출
사용법
#include <sys/shm.h>
int shmctl(int shmid, int command, struct shmid_ds *shm_stat);
record locking
특정 record에 대한 다른 프로세스의 읽기/쓰기 제한
- read lock : 읽기는 허용, 쓰기는 제한
- write lock : 읽기, 쓰기 모두 제한
사용법
#include <fcntl.h>
int fcntl(int filedes, int cmd, struct flock *ldata);
- filedes : lock을 설정하려는 file의 descriptor
- read-lock은 O_RDONLY/O_RDWR로 open된 file에 한해서 적용 가능
- write-lock은 O_WRONLY/O_RDWR로 open된 file에 한해서 적용 가능
- cmd
- F_GETLK : lock 정보 얻기
- F_SETLK : non-blocking locking or unlocking
- F_SETLKW : blocking locking
- struct flock *ldata
- short l_type : lock의 type(F_RDLCK, F_WRLCK, F_UNLCK)
- short l_whence : SEEK_SET, SEEK_CUR, SEEK_END
- off_t l_start : l_whence로부터의 변위로 표현된 locked record의 시작 위치
- off_t l_len : locked record의 길이
교착상태
두 프로세스가 작업하다 동기화 과정에서 코드가 꼬인 상태. = 두 프로세스 둘 다 block되는 상황