[FreeRTOS] MUTEX (뮤텍스)

 임계영역(Critical Section)을 보호 하는 방법에는 세마포어를 사용하는 방법과 뮤텍스를 사용하는 방법이 있는데 둘의 차이는 뭘까?



아래와 같이 Task1, Task2, Task3 이 있는 경우에, Task1의 우선순위가 높은데도 불구하고 Task2에 밀리는 경우가 발생한다. 이를 우선순위 역전 현상이라고 한다.


이러한 우선순위 역전 현상을 방지 하기 위한 방법으로 우선순위 상속이 있다.

높은 우선순위의 task가 block 상태인 동안, 그 task를 block 상태로 들어가게 만든 task의 우선 순위를 임시적으로 올려 다른 task로부터의 선점을 방지 하는 방법이다.

즉, 그러니까 Task1의 우선순위를 Task3이 상속 받게 되어 Task2로부터 선점을 당하지 않게 되는 것이다.


이러한 우선순위 상속의 메커니즘은 Mutex를 사용한다.


Task3 가 임계영역을 벗어나, Mutex를 반납하게 되면 원래의 우선순위로 돌아가게 된다.



세마포어는 우선순위 상속을 하지 않으므로, 우선순위 역전 현상이 발생하게 된다.

따라서 뮤텍스(MUTEX) 는 다음과 같이 정리 할 수 있다.

상호배제를 목적으로 하는 '바이너리 세마포어 + 우선순위 상속'


Mutex용 세마포어 사용 예제

SemaphoreHandle_t xSemaphore;

void Task(void *pvParameters)
{

	xSemaphore = xSemaphoreCreateMutes();
    
    /* Mutex 생성이 실패 할 수 있으므로 체크 필요 함*/
    if(xSeamphore == NULL)
    {
    	/* There was insufficient heap memory available for the mutex to be created. */
    }

}


이 블로그의 인기 게시물

Crusader Kings 3 - Converting DNA code using Portrait Editor