시스템 프로그래밍-뮤텍스와 세마포

YuWan·2024년 7월 3일

linux

목록 보기
13/26

뮤텍스 초기화(두 가지 방법)

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  • Parameter
    • mutex:mutex instance
    • attr:mutex 속성(일반적으로 NULL, NULL로 초기화할 경우 하단 초기화 구문과 같음)
  • Return
    • 성공시 0
    • 실패시 errno

뮤텍스 락/언락

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • Parameter
    • mutex:mutex instance
  • Return
    • 성공시 0
    • 실패시 errno

뮤텍스 락 여부 확인

int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • Parameter
    • mutex:mutex instance
  • Return
    • 성공시 0
    • 실패시 errno
  • 다른 스레드가 lock을 점유했을 경우:
    • lock(): sleep -> lock을 점유했을 때 리턴
    • trylock(): 곧바로 errno 리턴 후 코드 실행

세마포

  • unnmaed sempaphore
    • 공유 메모리에 대한 동기화 수행 시 활용
    • 공유 메모리의 일부를 세마포로 간주, 접근
  • named semaphore
    • 일반적인 자원에 대한 동기화 수행 시 활용
    • (세마포에 ID를 부여) 세마포를 파일과 같이 간주, 접근
  • unnmaed sempaphore
    • sem_init(), sem_destroy()
  • named semaphore
    • sem_open(), sem_close(), sem_unlink()
  • unnamed semaphore & named semaphore
    • sem_wait(), sem_trywait(), sem_timedwait(), sem_post()

unnamed semaphore:초기화

int sem_init(sem_t *sem, int pshared, unsigned int value);
  • Parameter
    • sem:초기화할 세마포 객체 포인터
    • pshared:공유 옵션(0일 경우 프로세스 내 스레드 간 공유, 1일 경우 프로세스 간 공유)
    • value:세마포 초기값
  • Return
    • 성공시 0
    • 실패시 -1

unnamed sempahore:해제

int sem_destory(sem_t *sem);
  • Parameter
    • sem:해제할 세마포 객체
  • Return
    • 성공시 0
    • 실패시 1

named semaphore: 생성/열기

sem_t *sem_open(const char *name, int oflag); 열기
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); 생성하기
  • Parameter
    • name:세마포 ID(슬래시로 시작: e.g./sempahoreid)
    • oflag:O_CREAT(세마포 생성) 혹은 O_EXCL(중복된 이름의 세마포 체크)
    • mode: 권한
    • value: 세마포 초기값
  • Return
    • 성고시 sempahore 포인터
    • 실패시 SEM_FAILED

named semaphore: 닫기

int sem_close(sem_t *sem);
  • Parameter
    • sem:닫을 세마포 객체
  • Return
    • 성공시 0
    • 실패시 SEM_FAILED

named semaphore: 삭제

int sem_unlink(const char *name);
  • Parameter
    • name:삭제할 semaphore 객체
  • Return
    • 성공시 0
    • 실패시 SEM_FAILED
  • 모든 프로세스가 semaphore를 닫아야 삭제

unnamed & named semaphore:세마포 자원 요청

int sem_wait(sem_t *sem); 공유 자원에 접근할 임계 구역을 실행하고 싶을때
  • Parameter
    • sem:요청할 세마포 객체
  • Return
    • 성공시 0
    • 실패시 -1
  • semaphore value 1 감소, 0 이하일 경우 block

unnamed & named semaphore: 세마포 자원 요청 시도

int sem_trywait(sem_t *sem); blocking 없이 자원 요청, 즉시 반환
  • Parameter
    • sem:요청할 세마포 객체
  • Return
    • 성공시 0
    • 실패시 -1

unnamed & named semaphore:세마포 자원 요청 시도(타임아웃 조건부)

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
  • Parameter
    • sem:요청할 세마포 객체
    • abs_timeout:timeout 설정값
  • Return
    • 성공시 0
    • 실패시 -1

unnamed & named semaphore:세마포 자원 해제

int sem_post(sem_t *sem);
  • Parameter
    • sem:자원을 해제할 semaphore 객체
  • Return
    • 성공시 0
    • 실패시 -1
  • semaphore value 1증가, 0 이상일 경우 blocked된 프로세스/스레드 깨어남
profile
공부 블로그

0개의 댓글