라운드 로빈 스케줄링과 우선순위 스케줄링

라운드 로빈 스케줄링 예시

태스크 간 우선 순위 없이, 일정 시간 간격마다 돌아가며 실행하는 스케줄링
여기서는 Time tick으로 일정 시간 간격마다 실행 태스크를 바꾼다.

freeRTOS 레퍼런스를 참고하여, 같은 우선 순위 두 개 태스크로 실행해보는 예시를 연습해본다.
uart로 태스크마다의 메시지를 출력하며 일정시간씩 번갈아 실행하고있음을 확인합니다.

 

 

우선 순위 스케줄링

우선 순위 높은 태스크가 readylist(준비된태스크)앞에 놓인다.
그래서 두 개 태스크를 생성하고, 우선 순위가 다르다면 높은 순위의 태스크만 계속 돌아가고, 끝나고나서야
낮은 순위의 태스크가 실행됩니다.

스케줄링 시 태스크의 상태에는
Running(실행 중),Ready(준비되어 실행 대기),Block(wait,sleep하며 이벤트를 기다리는 상태),Suspend(실행 중단된 상태)가 있다.

 

 

Not Running State 종류

1. Block State

실행 시간 한 주기가 끝났거나, Delay함수를 호출하게 된 경우 이벤트를 기다리는 상태로 sleep하게 된다.
wait한다고도 한다.
스케줄러가 이 태스크를 준비시커나, 인터럽트나 다른 태스크에 의해 호출받는 등의 이벤트를 기다린다.

Delay를 주어(태스크1에 100ms,태스크2에 1000ms),태스크를 잠시 block 상태에 놓이게 한 후, 실행해보았습니다.

 

출력 결과

 

 

2. Suspend State

스케줄러의 동작을 멈추는 것이다.

⇒컨텍스트 스위칭을 일시적으로 막는다.

태스크 레벨에서의 스케줄링은 멈추지만, 인터럽트 서비스 루틴(ISR)은 실행 가능한 상태

 

 

3. Ready State

이벤트 발생 후 cpu 점유 대기 상태이다.
코드를 들어가면, 같은 순위의 태스크들끼리 더블링크드 리스트로 연결되어, readylist에 저장되어있다.(이전 글 마지막참고)

 

 

Create, Delete, argument 이용해보기

Task1 : argument를 이용해 0~9까지의 숫자를 랜덤 출력(20개씩출력해 확인)
전역으로 int* 타입 argument를 선언

int하나를 넣을 메모리 할당 후 arg파라미터로 전달한다.

Task1에서 Task2생성한다.

Task2 : Task1에서 생성되어 0을 출력하고 자기삭제를 반복

출력 결과

 

 

+ Recent posts