ubinos
뮤텍스 예제

간단한 뮤텍스 사용 예제 Simple mutex example

이 예제는 하위 예제 두개로 구성된다. 하위 예제들은 각각 데이터 하나를 경쟁적으로 사용하는 태스크를 두개 생성한다. 첫 번째 하위 예제는 상호 배제적mutual exclusive이 아닌 방식으로 데이터를 사용하며, 두 번째 하위 예제는 뮤텍스를 이용해 상호 배제적mutual exclusive 방식으로 데이터를 사용한다. 각 하위 예제의 첫 번째 태스크(태스크 1)는 루프loop 반복 횟수 만큼 데이터에 1을 더하며, 두 번째 태스크(태스크 2)는 루프loop 반복 횟수 만큼 데이터에 1을 뺀다. 데이터의 초기값은 0이며, 두 태스크의 루프loop 반복 횟수는 동일하다. 따라서 데이터의 최종값은 0이어야 한다. 그러나 첫 번째 하위 예제는 경쟁 상태race condition 문제를 발생시킨다. 따라서 데이터의 최종값은 0이 아닌 값이 된다. 두 번째 하위 예제는 뮤텍스를 이용해 상호 배제적mutual exclusive 방식으로 데이터를 사용하기 때문에 경쟁 상태race condition 문제를 발생시키지 않는다. 따라서 데이터의 최종값은 0이 된다.

뮤텍스 기본 기능 시험 Test on basic functions of mutex

이 예제는 아래에 나열된 뮤텍스의 기본 기능들을 시험한다.

  • 잠그기 기능
  • 잠금 해제 기능

시점 1에서 중간 우선순위로 태스크 2를 생성한다.
그리고 생성된 태스크 2는 뮤텍스를 잠근다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 2가 수행 중이어야 한다.

시점 2에서 높은 우선순위로 태스크 1을 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이어야 한다.

시점 3에서 태스크 1이 뮤텍스 잠그기를 시도한다.
그러면 뮤텍스가 이미 태스크 2에 의해 잠겨졌으므로 태스크 1은 잠든다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 2가 수행 중이어야 한다.

시점 4에서 태스크 2가 뮤텍스 잠그기를 다시 한번 시도한다.
뮤텍스가 이미 잠겨졌지만, 잠근 태스크가 태스크 2 자신이므로 뮤텍스는 이 잠금 시도를 허용한다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 2가 수행 중이어야 한다.

시점 5에서 태스크 2가 뮤텍스 잠금 해제를 시도한다.
뮤텍스는 태스크 2에 의해 두번 잠겨졌다.
따라서 이 시도가 성공하더라도 뮤텍스는 여전히 잠겨진 상태에 머무른다.
여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크2가 수행 중이어야 한다.

시점 6에서 태스크 2가 다시 한번 뮤텍스 잠금 해제를 시도한다.
그러면 뮤텍스는 잠겨진 상태에서 벗어난다.
뮤텍스가 잠금 해제되면 태스크 1이 뮤텍스를 잠그고 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 6에서 태스크 1이 수행 중이어야 한다.

시점 7에서 태스크 1이 뮤텍스를 잠금 해제하고, 시점 8까지 휴면sleep을 시도한다.
그러면 태스크 2가 깨어나서 뮤텍스를 잠근다.
여기까지 성공적으로 진행되었다면 확인 지점 7에서 태스크 2가 수행 중이어야 한다.

시점 8이 되면 태스크 1이 휴면sleep 시간이 다해서 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 8에서 태스크 1이 수행 중이어야 한다.

시점 9에서 태스크 1이 시점 10까지를 제한 시간으로 두고 뮤텍스 잠그기를 시도한다.
그러면 뮤텍스가 이미 태스크 2에 의해 잠겨졌으므로 태스크 1은 잠든다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 9에서 태스크 2가 수행 중이어야 한다.

시점 10이 되면 태스크 1이 제한 시간이 다해서 뮤텍스를 잠그지 못했더라도 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 10에서 태스크 1이 수행 중이어야 한다.

시점 11에서 태스크 1이 종료된다.

시점 12에서 태스크 2가 뮤텍스를 잠금 해제하고 종료된다.


뮤텍스에 의한 우선순위 역전priority inversion 상황 시험 Test for priority inversion situation by mutex

이 예제는 우선순위 상속priority inheritance 특성이 비활성화된 뮤텍스를 사용해서 뮤텍스에 의한 우선순위 역전priority inversion 상황을 시험한다.
우선순위 상속priority inheritance 특성이 비활성화된 뮤텍스는 뮤텍스 생성 함수 확장형(mutex_create_ext 함수)을 우선순위 상속priority inheritance 특성 비활성화 선택 사항(MUTEX_OPT__NOPRIORITYINHERITANCE)과 함께 호출하면 생성된다.

시점 1에서 낮은 우선순위로 태스크 3을 생성한다.
그리고 생성된 태스크 3은 뮤텍스를 잠근다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 3이 수행 중이어야 한다.

시점 2에서 높은 우선순위로 태스크 1을 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이어야 한다.

시점 3에서 태스크 1이 뮤텍스 잠그기를 시도한다.
그러면 뮤텍스가 이미 태스크 3에 의해 잠겨졌으므로 태스크 1은 잠든다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 3이 수행 중이어야 한다.

시점 4에서 중간 우선순위로 태스크 2를 생성한다.
생성된 태스크 2의 우선순위가 태스크 3의 우선순위보다 높다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 2가 수행 중이어야 한다.

시점 5에서 태스크 2가 종료된다.
여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크 3이 수행 중이어야 한다.

그런데 여기까지 성공적으로 진행되었더라도 시점 4와 5 사이의 상황은 이상하다. 태스크 2가 우선순위가 더 높은 태스크 1보다 먼저 수행되었다. 이에 앞서 발생한 태스크 3이 태스크 1보다 먼저 수행되는 상황은 태스크 1이 태스크 3이 가진 자원(뮤텍스)을 필요로 하기 때문에 발생하는 어쩔 수 없는 상황이다. 그러나 태스크 2는 태스크 1과 아무런 관계가 없다. 그럼에도 불구하고 태스크 2가 우선순위가 더 높은 태스크 1보다 먼저 수행되었다. 이 이상한 상황은 우선순위 역전priority inversion 상황이라 불리며, 문제 상황으로 간주 된다.

시점 6에서 태스크 3이 뮤텍를 잠금 해제한다.
그러면 태스크 1이 뮤텍스를 잠그고 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 6에서 태스크 1이 수행 중이어야 한다.

시점 7에서 태스크 1이 뮤텍스를 잠금 해제하고 종료된다.

시점 8에서 태스크 3이 종료된다.


우선순위 역전priority inversion 상황을 방지하는 뮤텍스의 우선순위 상속priority inheritance 특성 시험 Test on priority inheritance feature of mutex preventing priority inversion situation

이 예제는 우선순위 역전priority inversion 상황을 방지하는 뮤텍스의 우선순위 상속priority inheritance 특성을 시험한다.

시점 1에서낮은 우선순위로 태스크 3을 생성한다.
그리고 생성된 태스크 3은 뮤텍스를 잠근다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 3이 수행 중이어야 한다.

시점 2에서 높은 우선순위로 태스크 1을 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이어야 한다.

시점 3에서 태스크 1이 뮤텍스 잠그기를 시도한다.
그러면 뮤텍스가 이미 태스크 3에 의해 잠겨졌으므로 태스크 1은 잠든다(대기blocked 상태가 된다).
그리고 태스크 3이 태스크 1의 우선순위를 상속 받는다. (태스크 3의 우선순위가 태스크 1의 우선순위와 같아진다.)
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 3이 수행 중이어야 한다.

시점 4에서 중간 우선순위로 태스크 2를 생성한다.
태스크 3이 태스크 1의 우선순위를 상속 받았기 때문에 태스크 3의 우선순위가 태스크 2의 우선순위보다 높다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 3이 수행 중이어야 한다.

뮤텍스에 의한 우선순위 역전priority inversion 상황 시험 예제에서는 이 시점에서 우선순위 역전priority inversion 상황이 발생했다. 그러나 이 예제에서는 우선순위 상속priority inheritance 특성을 가진 뮤텍스를 사용하기 때문에 그러한 문제 상황이 발생하지 않는다.

시점 5에서 태스크 3이 뮤텍스를 잠금 해제 한다.
그러면 태스크 1이 뮤텍스를 잠그고 깨어난다.
그리고 태스크 3의 우선순위는 본래 우선순위로 복원 된다.
여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크 1이 수행 중이어야 한다.

시점 6에서 태스크 1이 뮤텍스를 잠금 해제하고 종료된다.
여기까지 성공적으로 진행되었다면 확인 지점 6에서 태스크 2가 수행 중이어야 한다.

시점 7에서 태스크 2가 종료된다.

시점 8에서 태스크 3이 종료된다.


뮤텍스에 의한 메모리 누수 시험 Test for memory leak by mutex

이 예제는 뮤텍스에 의한 메모리 누수를 시험한다.
시험 과정은 다음과 같다.

먼저 힙heap의 할당된 메모리 총량과 메모리 블록 수를 가져와 저장한다.
그리고 뮤텍스 생성과 제거를 여러 번 반복한다.
그 다음 힙heap의 할당된 메모리 총량과 메모리 블럭 수를 다시 가져와 저장했던 값과 비교한다.
메모리 누수가 발생하지 않았다면 저장했던 값과 다시 가져온 값이 같아야 한다.

Content is available under Attribution-Noncommercial-No Derivative Works 3.0 Unported.