스터디 - 세마포어&뮤텍스

정상화·2023년 5월 10일
0

스터디

목록 보기
9/10

상호배제(Mutual Exclusion)


하나의 자원에는 하나의 context만 접근하는 걸 보장하는 개념

여러 스레드가 공유자원에 동시접근한다면?
스레드의 작업결과가 부정확할 수 있다.

Race Condition을 피하기 위해 임계 영역을 상호배제적으로 만드는 것이 동기화의 목적이다.

세마포어


Concurrent 시스템의 일반적인 동기화 방법

세마포어변수: 자원의수, 상태를 의미하는 정수값

P(): 임계영역에 들어가기 전의 작업, 세마포어를 감소시킴, 대기
V(): 임계영역에서 나온 후의 작업, 세마포어를 증가시킴, 호출

세마포어에는 busy waiting이 없다. 세마포어 자원이 없는 경우 스레드는 대기큐로 들어간다.

세마포어의 분류

  • binary semaphore: 세마포어변수가 0아니면 1, 뮤텍스와 같다
  • counting semaphore: 세마포어변수의 크기제한이 없음. 흔히 세마포어라고 하면 일반적인 형태의 counting semaphore를 의미

counting semaphore의 스도코드

struct semaphore{
	int count; 			//세마포어 자원
    queueType queue;	//프로세스 큐
};

void semWait(semaphore s){
	// 세마포어 자원 감소
	s.count--; 
    
    // 자원이 없는 경우
    if(s.count < 0){ 
    	/* 현재 프로세스를 s.queue에 push */
        /* 프로세스를 block 상태로 만듦 */
    }
}

void semSignal(semaphore s){
	// 세마포어 자원 증가
	s.count++;

	// 누군가 임계영역앞에서 대기중임
    if(s.count <= 0){
    	/* s.queue에서 프로세스를 pop */
        /* pop한 프로세스를 ready 상태로 전이 */
    }
}

실제 세마포어와 상호배제의 구현은 하드웨어적으로 이루어진다. 소프트웨어로 동기화를 구현하는 것은 불가능하다.

s.count가 음수이면 abs(s.count)가 대기중인 프로세스의 수이다.

profile
백엔드 희망

4개의 댓글

comment-user-thumbnail
2023년 5월 11일

세마포어라는 걸 처음 들어봤는데 알아갈 수 있는 글이였던것 같습니당!!

답글 달기
comment-user-thumbnail
2023년 5월 11일

세마포어에 대한 개념이 모호했는데 잘 알아가는것 같아요

답글 달기
comment-user-thumbnail
2023년 5월 11일

세미포어의 개념을 알 수 있어서 좋았습니다!

답글 달기
comment-user-thumbnail
2023년 5월 11일

간단하게 설명되어있어 쉽게 이해할 수 있었습니다.

답글 달기