ubinos
|
이 예제는 간단한 메시지를 반복적으로 출력하는 태스크를 하나 생성한다.
Test on basic functions of task
이 예제는 아래에 나열된 태스크의 기본 기능을 시험한다.
이 예제는 태스크의 휴면sleep 기능을 시험한다.
시험 과정은 다음과 같다.
시점 1에서 태스크 1을 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 1이 수행 중이어야 한다.
시점 2에서 태스크 1이 시점 3까지 휴면sleep을 시도한다.
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이 아니어야(대기block 상태여야) 한다.
시점 3이되면 태스크 1이 휴면sleep 시간이 다해서 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 1이 수행 중이어야 한다.
시점 4에서 태스크 1이 종료된다.
이 예제는 태스크의 중지suspend 및 재시작resume 기능을 시험한다.
시험 과정은 다음과 같다.
시점 1에서 태스크 1을 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 1이 수행 중이어야 한다.
시점 2에서 태스크 1을 중지suspend한다.
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이 아니어야(중지suspended 상태여야) 한다.
시점 3에서 태스크 1을 재시작resume한다.
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 1이 수행 중이어야 한다.
시점 4에서 태스크 1이 스스로 중지suspend한다.
여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 1이 수행 중이 아니어야(중지suspended 상태여야) 한다.
시점 5에서 태스크 1을 재시작resume한다.
여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크 1이 수행 중이어야 한다.
시점 6에서 태스크 1이 종료된다.
이 예제는 우선순위 기반 멀티태스킹 기능을 시험한다.
시험 과정은 다음과 같다.
시점 1에서 낮은 우선순위로 태스크 4를 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 4가 수행 중이어야 한다.
시점 2에서 높은 우선순위로 태스크 1을 생성한다.
태스크 1의 우선순위가 태스크 4의 우선순위 보다 높다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이어야 한다.
시점 3에서 중간 우선순위로 태스크 2와 3을 생성한다.
태스크 1의 우선순위가 태스크 2와 3의 우선순위 보다 높다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 1이 수행 중이어야 한다.
시점 4에서 태스크 1이 종료된다.
그러면 태스크 2와 3이 가장 높은 우선순위를 가진 태스크가 된다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 2와 3이 수행 중이어야 한다.
태스크 2와 3은 같은 우선순위를 가지므로 라운드 로빈 방식으로 동시에 수행된다.
시점 5에서 태스크 2와 3이 종료된다.
시점 6에서 태스크 4가 종료된다.
이 예제는 태스크의 우선순위 설정 기능을 시험한다.
시험 과정은 다음과 같다.
시점 1에서 낮은 우선순위로 태스크 2를 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 2가 수행 중이어야 한다.
시점 2에서 중간 우선순위로 태스크 1을 생성한다.
태스크 1의 우선순위가 태스크 2의 우선순위보다 높다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이어야 한다.
시점 3에서 태스크 2의 우선순위를 높은 우선순위로 설정한다.
그러면 태스크 2의 우선순위가 태스크 1의 우선순위보다 높아진다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 2가 수행 중이어야 한다.
시점 4에서 태스크 2의 우선순위를 낮은 우선순위로 설정한다.
그러면 태스크 1의 우선순위가 태스크 2의 우선순위보다 높아진다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 1이 수행 중이어야 한다.
시점 5에서 태스크 1이 종료된다.
시점 6에서 태스크 2가 종료된다.
이 예제는 태스크에 의한 메모리 누수를 시험한다.
시험 과정은 다음과 같다.
먼저 힙heap의 할당된 메모리 총량과 메모리 블록 수를 가져와 저장한다.
그리고 태스크 생성과 제거를 여러 번 반복한다.
그 다음 힙heap의 할당된 메모리 총량과 메모리 블럭 수를 다시 가져와 저장했던 값과 비교한다.
메모리 누수가 발생하지 않았다면 저장했던 값과 다시 가져온 값이 같아야 한다.
이 예제는 태스크의 다수 신호 객체 기다리기 기능을 시험한다.
태스크의 다수 신호 객체 기다리기 기능은 세마포어, 뮤텍스, 메시지큐, 시그널, 조건변수condition variable, 입출력버퍼 등 다양한 종류의 신호 객체 여러 개로부터 신호를 동시에 기다려야 할 경우 사용한다.
이 기능을 사용해 다수 신호 객체를 기다리는 태스크는 기다림을 끝낼 조건으로 다음 두가지 중 하나를 선택할 수 있다.
첫 번째는 기다리는 신호 객체들 중 하나 이상으로부터 신호를 받는 것이고, 두 번째는 기다리는 신호 객체들 모두로부터 신호를 받는 것이다.
모두 기다리기 선택 사항(TASK_WAITOPT__ALL)을 선택하고 이 기능을 사용하면 두 번째가, 그렇지 않으면 첫 번째가 기다림을 끝낼 조건이 된다.
시험 과정은 다음과 같다.
시점 3에서 태스크 1이 모두 기다리기 선택 사항(TASK_WAITOPT__ALL)을 선택하지 않고 다수 신호 객체 기다리기를 시도한다.
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 2가 수행 중이어야 한다.
시점 4에서 태스크 2가 태스크 1이 기다리고 있는 신호 객체들 중 하나에게 신호를 보낸다.
그러면 태스크 1이 그 신호를 받고 깨어난다.
이는 태스크 1이 모두 기다리기 선택 사항(TASK_WAITOPT__ALL)을 선택하지 않고 다수 신호 객체를 기다리고 있기 때문이다.
여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 1이 수행 중이어야 한다.
시점 5에서 태스크 1이 모두 기다리기 선택 사항(TASK_WAITOPT__ALL)을 선택하고 다수 신호 객체 기다리기를 시도한다.
여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크 2가 수행 중이어야 한다.
시점 6에서 태스크 2가 태스크 1이 기다리고 있는 신호 객체들 중 하나에게 신호를 보낸다.
그러면 태스크 1이 그 신호를 받는다. 그러나 태스크 1이 깨어나지는 않는다.
이는 태스크 1이 모두 기다리기 선택 사항(TASK_WAITOPT__ALL)을 선택하고 다수 신호 객체를 기다리고 있기 때문이다.
여기까지 성공적으로 진행되었다면 확인 지점 6에서 태스크 2가 수행 중이어야 한다.
시점 7에서 태스크 2가 태스크 1이 기다리고 있는 나머지 모든 신호 객체들에게 신호를 보낸다.
그러면 태스크 1이 그 신호들을 받고 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 7에서 태스크 1이 수행 중이어야 한다.
시점 10에서 태스크 1이 모두 기다리기 선택 사항(TASK_WAITOPT__ALL)을 선택하고 시점 12까지를 제한 시간으로 두고 다수 신호 객체 기다리기를 시도한다.
여기까지 성공적으로 진행되었다면 확인 지점 10에서 태스크 2가 수행 중이어야 한다.
시점 11에서 태스크 2가 태스크 1이 기다리고 있는 신호 객체들 중 하나에게 신호를 보낸다.
그러면 태스크 1이 그 신호를 받는다. 그러나 태스크 1이 깨어나지는 않는다.
이는 태스크 1이 모두 기다리기 선택 사항(TASK_WAITOPT__ALL)을 선택하고 다수 신호 객체를 기다리고 있기 때문이다.
여기까지 성공적으로 진행되었다면 확인 지점 11에서 태스크 2가 수행 중이어야 한다.
시점 12가 되면 태스크 1이 제한 시간이 다해서 기다리는 모든 신호 객체들로부터 신호를 받지 못했더라도 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 12에서 태스크 1이 수행 중이어야 한다.
이 예제는 남은 제한 시간을 가져오는 기능을 시험한다.
제한 시간을 두고 신호 객체를 기다리는 태스크가 제한 시간이 다하기 전에 신호를 받고 깨어났을 때, 이 기능을 사용하면 남은 제한 시간을 알아낼 수 있다.
이 기능은 비 동기적으로 들어오는 신호 여러 개를 순차적으로 받아 처리하는 작업에 제한 시간을 두어야 할 경우 유용하다.
시험 과정은 다음과 같다.
시점 1에서 중간 우선순위로 태스크 2를 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 2가 수행 중이어야 한다.
시점 2에서 높은 우선순위로 태스크 1을 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이어야 한다.
시점 3에서 태스크 1이 시점 6까지를 제한 시간으로 두고 첫 번째 신호를 기다린다.
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 2가 수행 중이어야 한다.
시점 4에서 태스크 2가 첫 번째 신호를 보낸다.
그러면 태스크 1이 그 신호를 받고 깨어난다.
그리고 깨어난 태스크 1은 남은 제한 시간을 가져온다.
여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 1이 수행 중이어야 한다.
시점 5에서 태스크 1이 가져온 남은 제한 시간과 이미 알고 있는 시점 4와 5 사이의 작업 시간을 가지고 시점 6까지 남은 시간을 계산한다.
그리고 계산한 남은 시간을 활용해 다시 시점 6까지를 제한 시간으로 두고 두 번째 신호를 기다린다.
여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크 2가 수행 중이어야 한다.
시점 6이되면 태스크 1이 제한 시간이 다해서 신호를 받지 못했더라도 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 6에서 태스크 1이 수행 중이어야 한다.
시점 7에서 태스크 1이 종료된다.
시점 8에서 태스크 2가 종료된다.
이 예제는 태스크를 중지suspend했다가 재시작resume했을 때, 태스크 상태가 중지suspend하기 직전 상태로 돌아가는지를 시험한다.
시험 과정은 다음과 같다.
시점 1에서 중간 우선순위로 태스크 2를 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 2가 수행 중이어야 한다.
시점 2에서 높은 우선순위로 태스크 1을 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 1이 수행 중이어야 한다.
시점 3에서 태스크 1이 신호를 기다린다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 2가 수행 중이어야 한다.
시점 4에서 태스크 2가 태스크 1을 중지suspend한 후 신호를 보낸다.
중지suspend된 태스크는 신호를 받지 못한다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 2가 수행 중이어야 한다.
시점 5에서 태스크 2가 태스크 1을 재시작resume한다.
재시작resume되 태스크 1은 시점 4에서 보내진 신호를 받고 깨어난다(준비ready 상태가 된다).
따라서 여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크 1이 수행 중이어야 한다.
시점 6에서 태스크 1이 시점 8까지를 제한 시간으로 두고 신호를 기다린다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 6에서 태스크 2가 수행 중이어야 한다.
시점 7에서 태스크 2가 태스크 1을 중지suspend한다.
여기까지 성공적으로 진행되었다면 확인 지점 7에서 태스크 2가 수행 중이어야 한다.
시점 8에서 태스크 2가 태스크 1을 재시작resume한다.
재시작resume되 태스크 1은 중지suspend되기 직전 상태인 대기blocked 상태가 된다.
그리고 태스크 1이 이 시점까지를 제한 시간으로 두고 신호를 기다렸지만 중지suspend 상태에 머무른 시간은 지나간 시간으로 인정하지 않기 때문에 깨어나지 않는다.
제한 시간이 다하는 시점은 중지suspend 상태에 머무른 시간을 더한 시점 9가 된다.
따라서 여기까지 성공적으로 진행되었다면 확인 지점 8에서 태스크 2가 수행 중이어야 한다.
시점 9가 되면 태스크 1이 제한 시간이 다해서 신호를 받지 못했더라도 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 9에서 태스크 1이 수행 중이어야 한다.
시점 10에서 태스크 1이 종료된다.
시점 11에서 태스크 2가 종료된다.
Content is available under Attribution-Noncommercial-No Derivative Works 3.0 Unported.