K 개발자
세마포어 본문
세마포어의 기본 개념
세마포어semaphore는 프로세스 사이의 동기synchronization를 맞추는 기능을 제공한다.
예를 들어, 공유 메모리에 여러 프로세스가 동시에 쓰기를 시도한다면 데이터가 손상되는 현상이 발생한다.
따라서 여러 프로세스 사이의 동작 순서를 지정해야 한다.
프로세스들이 공유 영역에 대한 접근 순서를 정하는 방법 중 하나가 세마포어다.
세마포어의 기본 동작 구조
세마포어는 중요한 처리 부분critical section에 들어가기 전에 p 함수를 실행해 잠금 기능을 수행하고, 처리를 마치면 다시 v 함수를 실행해 잠금을 해제한다.
잠금 기능을 수행 중인 동안에는 다른 프로세스가 처리 부분의 코드를 실행할 수 없다.
sem은 세마포어 값을 의미한다.
p(sem); /* 잠금 */
중요한 처리 부분(critical section)
v(sem); /* 잠금 해제 */
p 함수의 기본 동작 구조
p(sem) {
while sem = 0 do wait;
sem 값을 1 감소;
}
초기 sem 값은 1이다.
p 함수는 sem이 0이면 다른 프로세스가 처리 부분을 수행하고 있다는 의미므로, 값이 1이 될 때까지 기다려야 한다.
sem이 0이 아니면 0으로 만들어 다른 프로세스가 들어오지 못하게 한다.
v 함수의 기본 동작 구조
v 함수는 sem을 1만큼 증가시키고, 처리 부분을 수행하려고 대기 중인 프로세스가 있으면 첫 번째 대기 프로세스를 동작시킨다.
v(sem) {
sem 값을 1 증가;
if (대기 중인 프로세스가 있으면)
대기 중인 첫 번째 프로세스를 동작시킨다.
}
세마포어 관련 함수
세마포어 생성 : semget(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
// key : IPC_PRIVATE 또는 ftok 함수로 생성한 키, nsems : 생성할 세마포어 개수, semflg : 세마포어 접근 속성
세마포어 제어 : semctl(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, …);
// semid : semget 함수로 생성한 세마포어 식별자, semnum : 기능을 제어할 세마포어 번호
// cmd : 수행할 제어 명령, … : 제어 명령에 따라 필요시 사용할 세마포어 공용체의 주소(선택 사항)
세마포어 연산 : semop(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, size_t nsops);
// semid : semget 함수로 생성한 세마포어 식별자, sops : sembuf 구조체의 주소, nsops : sops가 가리키는 구조체의 크기
Comments