인프런 커뮤니티 질문&답변
[소스코드 분석-configUSE_TIME_SLICING] TASK1,2의 우선순위가 동일할 때, configUSE_TIME_SLICING값 변경에 따른 출력 변화
작성
·
28
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
#if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )
{
if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 )
{
xSwitchRequired = pdTRUE;
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
configUSE_TIME_SLICING값이 1->0이 되면
위 코드의 실행 조건이 변경되어 스케쥴러가 cpu 양보를 고려하지 않아 처음 cpu를 잡은 task만 반복해서 동작하게 된다는 것 까지는 이해했습니다.
이때 저의 경우에
(1) configUSE_TIME_SLICING == 1 이면 'bbbba...'으로 b가 더 많이 수행되고
(2) configUSE_TIME_SLICING == 0 이면 'a'만 계속 해서 출력되는데 위에서 저의 이해를 바탕으로 configUSE_TIME_SLICING == 1인 경우에 'aaaaaaaaaaab...' 이런식으로 나와야 할 것 같은데(혹은 (2)번에서 'b'만 출력)
두 경우에서 먼저 cpu를 선점하는 task가 다른 이유가 궁금합니다!
답변 2
0
안녕하세요. 이준형님!
아마도 우선순위를 동일하게 주고 테스트하신 것 같네요. 맞나요?
"누가 먼저 CPU를 잡느냐"는 항상 Task1으로 동일하고, "누가 먼저 a/b를 출력하느냐"는 각 태스크가 시작할 때 시간이 많이 소요될 수 있는 printf의 수량과 tick 타이밍이 언제 발생하느냐에 따라 달라집니다.
다시 말하면, 논리적으로는 비슷한 형태의 태스크 함수가 주어져 있고 Task1이 먼저 생성되니 'a'를 먼저 출력할 것이라 생각하기 쉽지만, tick이 발생하는 시점과 선행하는 printf 출력 시간이 합쳐져서 'b'가 먼저 출력되는 구조가 만들어질 수 있습니다.
아래와 같이 시나리오를 그려보았습니다. 참고해보세요.
## TIME_SLICING = 1 인 경우
Task1 시작 -> 시작 메시지 printf 실행 중...
Tick Interrupt 발생!
TIME_SLICING=1이므로 같은 우선순위 태스크 체크 -> Task2 있음 -> 전환!
Task2 실행 -> 시작 메시지 출력 시작
이후 tick마다 Task1 <-> Task2 교대
결과적으로 Task2가 while문의 'b'를 Task1보다 먼저 찍게 되는 상황 발생
## TIME_SLICING = 0 인 경우
Task1 시작 -> 시작 메시지 printf 실행 중...
Tick Interrupt 발생!
TIME_SLICING=0이므로 같은 우선순위 체크 코드 실행 안 됨 -> 전환 없음!
Task1 계속 실행 -> while문 진입 -> "aaaaaaa..."
Task2는 yield나 block 없이는 실행 기회 없음
정리하면, 질문자님께서 관찰한 "TIME_SLICING 값에 따라 먼저 출력되는 문자가 다르다"는 현상은 CPU 선점 순서가 바뀐 게 아니라, tick 발생 시점과 시작 코드 실행 시간의 조합으로 인해 while문 진입 순서가 달라진 것입니다.
0
안녕하세요, 인프런 AI 인턴입니다. 이준형님.
FreeRTOS에서 configUSE_TIME_SLICING 옵션은 동일한 우선순위를 가진 태스크들 간의 CPU 시간을 어떻게 분배할지를 결정합니다. configUSE_PREEMPTION이 1로 설정되어 있을 경우 근본적으로 선점형 스케줄링을 지원하지만, configUSE_TIME_SLICING이 1이면 라운드 로빈 방식으로 같은 레벨의 태스크들이 번갈아가며 실행 시간을 받게 됩니다.
이해한 내용을 바탕으로 상세 설명을 드리면:
설정이
configUSE_TIME_SLICING == 1일 때:- 동일한 우선순위를 가진 태스크가 여러 개일 경우, FreeRTOS 스케줄러는 이를 라운드 로빈 방식으로 처리합니다.
- 따라서
bbbba...혹은aaab...처럼 한 태스크가 조금 더 많이 실행될 수 있는 가능성이 있지만, 이는 각 태스크가 순서대로 적당히 CPU 시간을 할당받고 있다는 것을 의미합니다.
- 동일한 우선순위를 가진 태스크가 여러 개일 경우, FreeRTOS 스케줄러는 이를 라운드 로빈 방식으로 처리합니다.
설정이
configUSE_TIME_SLICING == 0일 때:- 이 경우, 동일한 우선순위의 태스크들은 자신들이 자발적으로 블록되거나 종료되지 않는 한, 처음 활성화된 태스크가 계속해서 CPU 시간을 점유하게 됩니다.
- 즉, 이 상황에서는 먼저 실행된 태스크
'a'가 계속해서 실행된다는 결과가 나옵니다.
- 이 경우, 동일한 우선순위의 태스크들은 자신들이 자발적으로 블록되거나 종료되지 않는 한, 처음 활성화된 태스크가 계속해서 CPU 시간을 점유하게 됩니다.
태스크 시작 순서의 차이점:
- 태스크가 처음 스케줄러에 의해 실행될 때의 실질적인 초기 순서는 여러 요인에 의해 결정될 수 있습니다. 태스크 생성 직후의 미세한 시간 차이라든지, 시스템 부하, 초기화 과정에서의 상황들이 태스크가 처음 CPU를 점유하는 조건이 될 수 있습니다.
관련하여 더 깊은 이해를 돕기 위해, 다음의 답변들을 참고하면 좋습니다:
- TASKMAN 실습 중 이해가 안되는 것이 있습니다.
- 강의 “소스코드 분석-vTaskSuspend” 관련 질문 드립니다!
해당 내용을 바탕으로 설명드리는 부분이 문제 해결에 도움이 되길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






바로 이해됐습니다. 감사합니다!