시스템 프로그래밍(9)

조권휘·2022년 8월 24일
0

시스템 프로그래밍

목록 보기
9/14
post-thumbnail

Semaphore

  • process / thread의 동기화 방법
  • 자원 공유(critical section 포함) 시 사용한다.
  • block / wake-up 알고리즘을 사용(mutual exclusion)
  • process가 critical section에 접근할 때, 이미 다른 process가 접근해 있다면 block
  • semaphore를 가지고 있는 process가 critical section에서 빠져 나오면 아까 block된 process를 wake up
  • 기본적으로 mutex 기능을 포함하고, +@가 가능하다.
  • CPU의 낭비가 없다.
  • waiting queue가 존재한다.
  • wait / signal 동작으로 나뉜다.
  • 두 process 사이의 synchronize도 가능하다.
  • pthread library를 linked해야 사용이 가능하다.

wait 동작

  • 자원을 1개 가져간다.
  • 자신의 pid를 waiting queue에 넣는다.
  • 만일 가져갈 자원이 없다면 block을 하고 대기한다.

signal 동작

  • 가져간 value 1개를 돌려놓는다.
  • value <= 0 : 기다리는 p가 있다는 것으로, queue의 맨 앞에 있는 process를 호출한다.

Semaphore(n)

  • n = 0일 때 : process 사이의 synchronize
  • n = 1일 때 : binary semaphore
    • mutex와 동일하게 사용이 가능하다.
  • n > 1일 때 : value가 0보다 작거나 같아질 때까지 계속 사용한다.

Semaphore function

Semaphore initialization

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);
  • semaphore 개체를 먼저 선언한 뒤 초기화 하는 함수
  • sem : 초기화 할 semaphore
  • pshared :
    • 0 : 현재 process에서만 사용 / 주로 많이 사용한다.
    • non-zerd : 여러 process에 공유되는 semaphore
  • value : semaphore의 초기 value

Semaphore wait

#include <semaphore.h>

int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
  • sem_wait() : blocking call
  • sem_trywait() : non-blocking call
    • value가 양수 값이면 성공, value가 0 이하면 EAGAIN을 return한다.

Semaphore post(signal)

#include <semaphore.h>

int sem_post(sem_t *sem); 
int sem_getvalue(sem_t *sem, int *sval);
  • sem_post() : block을 할 일이 없다.
    • signal handler로 값을 전달하고 조작할 수 있다.
  • set_getvalue() : 조작 없이 현재 count를 가져와서 sval에 저장한다.

Semaphore destruction

#include <semaphore.h>

int sem_destroy(sem_t *sem);
  • 생성된 semaphore를 제거
  • sem : 제거할 semaphore
profile
안녕하세요 :) Data/AI 공부 중인 한국외대 컴퓨터공학부 조권휘입니다.

0개의 댓글