ubinos
|
이 예제는 대표적인 태스크간 동기화 문제인 생산자 소비자 문제를 세마포어를 사용해 해결한다. 생산자(태스크 1)는 자원이 생산되었음을 알리는 신호를 세마포어를 통해 소비자들(태스크 2와 3)에게 전달하고, 소비자들(태스크 2와 3)은 그 신호에 동기되어 자원을 소비한다. 다시 말해 소비자들이 자원 소비 시점을 생산자의 자원 생산 시점에 맞춘다.
이 예제는 아래에 나열된 세마포어의 기본 기능들을 시험한다.
시점 1에서 태스크 1을 높은 우선순위로, 태스크 2를 중간 우선순위로 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 1이 수행 중이어야 한다.
시점 2에서 태스크 1이 P 명령(sem_take 함수)을 수행한다.
그러면 세마포어의 값이 0이므로 태스크 1이 세마포어의 대기 태스크 큐에 추가되고 잠든다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 2가 수행 중이어야 한다.
시점 3에서 태스크 2가 V 명령(sem_give 함수)을 수행한다.
그러면 세마포어의 대기 태스크 큐가 비어있지 않으므로 대기 태스크 큐에 들어있던 태스크 1이 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 1이 수행 중이어야 한다.
시점 4에서 태스크 1이 시점 7까지를 제한 시간으로 두고 휴면sleep을 시도한다.
여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 2가 수행 중이어야 한다.
시점 5에서 태스크 2가 V 명령(sem_give 함수)을 수행한다.
그러면 세마포어의 대기 태스크 큐가 비어있으므로 세마포어의 값이 1 증가한다(1이 된다).
여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크 2가 수행 중이어야 한다.
시점 6에서 태스크 2가 V 명령(sem_give 함수)을 다시 한번 수행한다.
그러면 세마포어의 대기 태스크 큐가 비어있으므로 세마포어의 값이 다시 1 증가한다(2가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 6에서 태스크 2가 수행 중이어야 한다.
시점 7이 되면 태스크 1이 휴면sleep 시간이 다해서 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 7에서 태스크 1이 수행 중이어야 한다.
시점 8에서 태스크 1이 P 명령(sem_take 함수)을 수행한다.
그러면 세마포어의 값이 0이 아니므로(2이므로) 1 감소한다(1이 된다).
여기까지 성공적으로 진행되었다면 확인 지점 8에서 태스크 1이 수행 중이어야 한다.
시점 9에서 태스크 1이 P 명령(sem_take 함수)을 다시 한번 수행한다.
그러면 세마포어의 값이 0이 아니므로(1이므로) 1 감소한다(0이 된다).
여기까지 성공적으로 진행되었다면 확인 지점 9에서 태스크 1이 수행 중이어야 한다.
시점 10에서 태스크 1이 시점 11까지를 제한 시간으로 두고 P 명령(sem_take 함수)을 다시 한번 수행한다.
그러면 세마포어의 값이 0이므로 태스크 1이 세마포어의 대기 태스크 큐에 추가되고 잠든다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 10에서 태스크 2가 수행 중이어야 한다.
시점 11이 되면 태스크 1이 제한 시간이 다해서 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 11에서 태스크 1이 수행 중이어야 한다.
시점 12에서 태스크 1이 종료된다.
시점 13에서 태스크 2가 종료된다.
이 예제는 세마포어에 의한 메모리 누수를 시험한다.
시험 과정은 다음과 같다.
먼저 힙heap의 할당된 메모리 총량과 메모리 블록 수를 가져와 저장한다.
그리고 세마포어 생성과 제거를 여러 번 반복한다.
그 다음 힙heap의 할당된 메모리 총량과 메모리 블럭 수를 다시 가져와 저장했던 값과 비교한다.
메모리 누수가 발생하지 않았다면 저장했던 값과 다시 가져온 값이 같아야 한다.
Content is available under Attribution-Noncommercial-No Derivative Works 3.0 Unported.