3.2 세마포어
3.2.1 개요
프로세스의 동기화 문제
두 개 이상의 프로세스가 하나의 자원에 동시에 접근하면 문제가 발생한다.
이러한 문제를 막기 위해 정해진 개수의 프로세스만 해당 자원에 접근할 수 있도록 만들어주어야 한다.
"임계영역"을 구성해 정해진 개수의 프로세스만 코드 영역에 진입할 수 있도록 만들자!
세마포어로 해결
세마포어는 코드의 특정 영역을 임계영역으로 만들어준다.
1) 세마포어 값이 1 이상인 경우 프로세스는 세마포어 값을 1 감소시킨 후 임계영역에 진입한다.
2) 세마포어 값이 0인 경우 임계영역에 하나 이상의 프로세스가 진행중이므로 그 밖에 있는 프로세스는 자면서 기다린다.
3) 세마포어 값이 다시 1 이상이 됐을 때 (임계영역에 있던 프로세스가 임계영역에서 탈출하면서 세마포어 값을 1 증가시킴)
4) 임계영역 밖에서 자고있던 프로세스가 깨어나 임계영역에 진입한다. (반복)
위와 같은 세마포어 획득/반납 과정을 통해 프로세스 간 스케줄링이 가능하다.
3.2.2 세마포어 함수
int semget(key_t key, int nsems, int semflg);
기능: 세마포어 배열 생성
리턴: 성공 시 세마포어 배열의 ID, 실패 시 errno 설정 후 -1 리턴
key: 세마포어 배열에 접근하기 위한 키
nsems: 필요한 세마포어 개수
semflg: IPC_CREAT (세마포어 배열이 없으면 새로 생성), IPC_CREAT | IPC_EXCL (세마포어 배열이 있으면 에러)
int semctl(int semid, int semnum, int cmd, ...);
기능: 세마포어 제어
리턴: 성공 시 cmd 리턴값, 실패 시 errno 설정 후 -1 리턴
semid: 세마포어 배열 ID
semnum: 세마포어 배열 내 세마포어 번호
cmd: IPC_STAT (union semun의 buf에 세마포어 정보 얻어오기), IPC_RMID (세마포어 배열 제거), SETVAL (세마포어 값 설정)
int semop(int semid, struct sembuf* sops, unsigned nsops);
기능: 세마포어 배열 내 세마포어 동장 구현
리턴: 성공 시 0, 실패 시 errno 설정 후 -1 리턴
semid: 세마포어 배열 ID
sops: 적용할 세마포어 동작
nsops: 동작을 적용할 세마포어 개수
'한국으로 > 임베디드 리눅스' 카테고리의 다른 글
4.2 스레드 동기화 (0) | 2018.06.28 |
---|---|
4.1 스레드란? (0) | 2018.06.27 |
3.4 메시지 큐 (0) | 2018.06.27 |
3.3 공유 메모리 (0) | 2018.06.27 |
3.1 파이프 (0) | 2018.06.27 |
2.2 시그널 (0) | 2018.06.27 |
2.1 프로세스 (0) | 2018.06.27 |
1.6 파일 입출력 (0) | 2018.06.27 |