운영체제 31 세마포어

zh025700·2022년 6월 9일
0

운영체제

목록 보기
19/20

운영체제

31 semaphore

mutex vs semaphore

mutex

  • 하나의 구간에 하나만 가능

semaphore

  • 자신이 정한 개수만큼 스레드가 들어갈 수 있게 해줌

semaphore: 정의

  • 정수 값을 가지는 객체
    • 두개의 루틴으로 조작할 수 있다
      • sem_wait()
      • sem post()

세마포어를 사용하기 전 값을 초기화 해야한다

  • sem_init()

sem_wait()

  • 세마포어 값이 1 이상이면 리턴, 아니면 세마포어 값이 1이 될 때 까지 대기

  • 0일때 wait을 호출하면

    • post 호출 전 까지 호출한 스레드를 중지시킨다
  • 세마포어가 음수일때는 대기중인 쓰레드의 개수와 절대 값이 같다

sem_post()

  • 세마포어 값을 증가시킨다
  • 만약 스레드가 대기중이라면 그 중 하나를 꺠운다

이진 세마포어(락)

  • 임계영역에서 실행할때 원자적 실행을 보장한다
  • 두개의 상태를 지닌다
    • lock, unlock
  • 이진 세마포어로 시행가능하다
    • 임계영역을 sem_wait과 sem_post로 감싼다
    • 세마포어 시작값은 1이어야 한다

시나리오

스레드 0:
sem_wait을 호출하면 값이 1->0으로 된다
그럼 임계영역은 호출한 스레드꺼가 됨


이때 인터럽트가 일어나서 스레드 1로 가게되어
쓰레드0은 running에서 ready state로 가게됨
쓰레드1이 sem_wait을 호출하면 값이 0->-1로 됨
그리고 state가 running에서 sleeping으로 가게됨

다시 인터럽트로 쓰레드0으로 돌아옴
그럼 ready -> running으로 state 바뀜
임계영역에 볼일 끝나 sem_post 호출하면 세마포어값이 -1 -> 0,
 스레드 1을 깨움 스레드 1 상태 sleeping에서 ready로
인터럽트로 다시 running-> ready로 바뀜

스레드 1로 돌아옴
ready에서 running으로
임계영역 차지함
동작 완료 후 sem_post 호출
세마포어값 0 -> 1로
profile
정리

0개의 댓글

관련 채용 정보