IPC - Semaphore

Jongwon·2021년 12월 18일
0

Linux Programming

목록 보기
24/25

세마포어

여러 프로세스가 도시에 접근을 제어하기 위한 카운터

세마포어 동작: 원자적 연산(여러명이 동시에 up/down 시도시 하나만 성공)

  1. 세마포어 초기값을 설정(1, 2 등): 이는 동시에 접근 가능한 프로세스 수를 의미
  2. 세마포어 획득 시도를 할 때, 현재 값이 양수라면 1감소하고 자원 사용. 0 이하이면 양수일 때까지 sleep. 깨어나면 재시도
  3. 자원 사용이 종료되면 세마포어 증가시키고, sleep하고있는 프로세스를 깨워줌.
struct semid_ds {
	struct ipc_perm sem_perm;   /* 접근 허가 */
	struct sem *sem_base;       /* sem_base 포인터 */
	unsigned short sem_nsems;   /* 세마포어 값 */
	time_t sem_otime;           /* 마지막 semop 호출 시간 */
	time_t sem_ctime;           /* 마지막 수정 시간 */
}


<sem.h> 헤더

  • int semget(key_t key, int nsems, int semflag)
    세마포어 집합 생성, 성공 시 ID반환, 실패는 -1. nsems는 세마포어 개수(이미 생성된 건 0으로 설정)
  • int semop(int semid, struct sembuf sops[], size_t nops)
    sops에 적혀있는대로 각각의 세마포어에 대해 연산 수행
struct sembuf {
    ushort sem_num;   //세마포어 번호
    short sem_op;     //연산. samval과 연산. +면 up(증가), -면 down 연산(감소)
    short sem_flg;    //옵션
}
sem_flg는 옵션
- IPC_NOWAIT: 즉시 실행 불가능하면 -1리턴
- SEM_UNDO: 세마포어 연산 후 프로세스 종료 시 다시 원래대로 되돌림.(down한 만큼 다시 up함)

size_t nops: sembuf개수
  • int semctl(int semid, int semnum, int cmd, union semun arg)
    세마포어 제어. semnum은 세마포어 집합 내 특정 세마포어 번호
union semun {
    int val;                        //setval 설정
    struct semid_ds *buf;           //IPC_STAT이나 IPC_SET에서 이용
    unsigned short int *array;      //세마포어 모든 값들 가져올 수 있음.
}

int cmd
- IPC_STAT: 세마포어 정보를 arg.buf로 복사
- IPC_SET: 접근 허가와 소유권 변경 가능
- IPC_RMID: 세마포어 제거
- GETVAL: 특정 세마포어의 현재값 얻기
- SETVAL: semnum이 가리키는 세마포어값 설정
- GETPID: 세마포어 마지막으로 접근한 프로세스ID 반환
- GETNCNT: 세마포어 값이 증가되기를 기다리는 프로세스의 수 반환
- GETZCNT: 세마포어 값이 0이 되기를 기다리는 프로세스의 수 반환
- GETALL: 모든 세마포어 값을 가져옴
- SETALL: 모든 세마포어 집합의 세마포어 값을 arg.array에 지정된 값으로 설정
profile
Backend Engineer

0개의 댓글