본문 바로가기
한국으로/임베디드 리눅스

3.2 세마포어

by 영킴. 2018. 6. 27.

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