학교수업

시스템 프로그래밍 - XSI 세마포어(P,V operation)

3년안에 내집 마련 2019. 6. 4. 01:51
반응형

- 시스템에서 생성된 세마포어는 semop나 semtimedop 함수를 이용해 P,V 오퍼레이션 가능

- P오퍼레이션 : 세마포어 감소

- V오퍼레이션 : 세마포어 증가

- P,V 오퍼레이션은 +-1이 아닌 +-n까지 가능

int semop(int semid, struct sembuf *sops, unsigned nsops); // (IPC_ID, 세마포어 작동 버퍼 구조체 주소, 버퍼 구조체 개수)
int timedop(int semid, struct semmbuf *sops, unsigned nsops, struct timespec *timeout); 

- semop의 struct sembuf 구조체

struct sembuf{
	unsigned short sem_num;  // 세마포어 세트 내 개별 세마포어의 인덱스 번호, 0부터 시작
    short sem_op;   // 세마포어에 더할 값(0,양수, 음수)
    shor sem_flg;  // 작동 옵션플래그(sem_undo, IPC_NOWAIT)
 }

- sem_flg 옵션 플래그

SEM_UNDO

세마포어 조작 프로세스 종료시 조작된 작업 취소대고 대기하던 다음 세마포어 OP 실행

SEM_UNDO 사용시 무한 대기 빠지는 것을 방지 -> 신뢰성 높여줌

성능상 약간의 불이익 존재

IPC_NOWAIT

사용 가능 자원 없을시 기다리지 않고 바로 에러 리턴

(리턴 에러 : EAGAIN)

struct sembuf sem_buf[2];
ㆍㆍㆍㆍㆍㆍ생략ㆍㆍㆍㆍㆍㆍ
sem_buf[0].sem_num = 0;
sem_buf[0].sem_op = -1;   //P operation(세마포어 감소)
sem_buf[0].semflg = SEM_UNDO;
sem_buf[1].sem_num = 4;
sem_buf[1].sem_op = 1;   // V operation(세마포어 증가)
ㆍㆍㆍㆍㆍㆍ생략ㆍㆍㆍㆍㆍㆍ
if(semop(sem_id,sem_buf,2) == -1){
/*error*/
}

 

반응형