페이지 선택

뮤텍스

뮤텍스는 쓰레드의 임계영역에 대한 진입(실행)을 잠금(lock)과 해제(unlock)로 제어하면서 공유데이터에 대한 의도치 않은 변경을 막는 방법이다.

뮤텍스에서는  Lock을 건 쓰레드 말고는 어떤 쓰레드도 자신의 임계영역을 실행하지 않도록 구현하여야 한다.

 

 

 

1. 뮤텍스 구현의 초안

뮤텍스를 이용해 공유자원을 보호하는 기본 구현은 아래의 예와 같이 Busy Waiting(바쁜대기) 방식으로 부터 시작한다.

전역변수 key가 lock 과 unlock 상태를 표시하고 있으며, Key=0(lock)으로 설정한 쓰레드만이 임계영역을 실행할 수 있다.

 

global int key=1; 배제(lock)→ key=0, 배제 해제(unlock)→ Key=1

void momo(void){

while((key=1) key=0;  //mutex lock 구현

momo의 공유자원엑세스(임계영역);

key=1;                       //mutex unlock 구현

}

void toto(void){

while(key=1) key=0;  }   //해제 까지 뺑뺑이 돈다. 기회 얻으면 lock 시키고 임계영역 진입.

 toto의 공유자원엑세스(임계영역);

key=1;       //unlock 시킨다, 다른 쓰레드가 자신의 임계영역을 실행할 수 있도록 조치한다.

}

Busy Waiting 방식은 MCU 자원을 계속해서 사용한다는 단점이 있지만 짧은 시간 이내에 자원을 점유할 수 있다는 자신이 있는 경우 유용하다.

 

 

 

 

2. 뮤텍스구현의 보완

RTOS 시스템에서는 통상적으로 Busy Waiting 방식을 보완하여 쓰레드에 대한 suspend, sleeping 또는 blocking 와 같은 기능을 제공하고 있다.

 

mutex_t mutex; ← mutex는 main 함수에서 초기화 해주는 것으로 가정

void momo(void){

mutex_lock(&mutex); 또는 mutex_try_lock(&mutex);

momo의 공유자원엑세스(임계영역);

mutex_unlock(&mutex);

}

void toto(void){

mutex_lock(&mutex); 또는 mutex_try_lock(&mutex);

toto의 공유자원엑세스(임계영역);

mutex_unlock(&mutex);

}

 

 

 

 

 

 

 

 

mutex_lock

locks the mutex, blocks if the mutex is not available

추가기능: mutex_lock을 호출한 쓰레드가 베제되었을 경우 이 쓰레드는 Block 대기상태로 빠진다.

mutex_try_lock

tries to lock the mutex, returns if the mutex is not available

추가기능: mutex_lock을 호출한 쓰레드가 베제되었을 경우 이 쓰레드는 실행을 종료하고 대기상태로 빠진다.

mutex_unlock

unlocks the mutex

추가기능: 베제되어 대기상태에 있는 쓰레드들에게 뮤텍스가 해제되었다는 신호를 보내 준비상태로 천이되도록 한다.

 

 

 

 

3. 문제해결 확인

 

Viewed Page List