17. 멀티레벨 큐 스케줄러로 업그레이드하고 태스크 종료 기능을 추가하자

들어가기

태스크에 우선순위를 할당하고 이에 따라 태스크를 실행하는 빈도를 조절.

본론

17.1 태스크 우선순위와 멀티레벨 큐 스케줄러 알고리즘

17.1.1 멀티레벨 큐 스케줄러와 라운드 로빈 스케줄러의 관계

  • 멀티레벨 큐 스케줄러는 우선순위에 따라 구분된 여러 개의 큐를 사용.
  • 태스크가 대기하는 공간이 여러 개이므로, 멀티레벨 큐 스케줄러에는 두 가지 스케줄링 정책이 필요.
    • 여러 개의 큐 중에서 특정 큐를 선택하는 정책.
    • 선택된 큐에서 태스크를 선택하는 정책.

17.1.2 태스크 우선순위와 큐 스케줄링 정책

  • 구현할 OS의 태스크 우선순위는 가장 높음, 높음, 중간, 낮음, 가장 낮음 순으로 구성.
  • 가장 높은 단계의 큐는 긴급하고 주기적으로 수행해야하는 태스크를 설정, 무리하게 많은 태스크를 가장 높음으로 할당하면 시스템의 성능이 저하.

17.2 멀티레벨 큐 스케줄러 업그레이드

17.2.1 스케줄러 자료구조 업그레이드

// 태스크의 우선 순위
#define TASK_FLAGS_HIGHEST            0
#define TASK_FLAGS_HIGH               1
#define TASK_FLAGS_MEDIUM             2
#define TASK_FLAGS_LOW                3
#define TASK_FLAGS_LOWEST             4

// 스케줄러의 상태를 관리하는 자료구조
typedef struct kSchedulerStruct
{
    // 현재 수행 중인 태스크
    TCB* pstRunningTask;

    // 현재 수행 중인 태스크가 사용할 수 있는 프로세서 시간
    int iProcessorTime;

    // 실행할 태스크가 준비중인 리스트, 태스크의 우선 순위에 따라 구분
    LIST vstReadyList[ TASK_MAXREADYLISTCOUNT ];

    // 종료할 태스크가 대기중인 리스트
    LIST stWaitList;

    // 각 우선 순위별로 태스크를 실행한 횟수를 저장하는 자료구조
    int viExecuteCount[ TASK_MAXREADYLISTCOUNT ]; 
} SCHEDULER;
  • 이전의 작성한 스케줄러의 자료 구조를 수정.

17.2.2 스케줄러 함수 업그레이드

스케줄러 초기화 함수 업그레이드

  • 초기화 함수는 스케줄러의 초깃값을 설정, 추가된 준비 리스트와 대기 리스트, 큐별 태스크 실행 횟수를 초기화.

태스크 선택 함수 업그레이드

  • 라운드 로빈 방식때와는 달리 우선순위에 따라 큐를 선택해야함.
  • 높은 큐의 태스크가 모두 1회씩 수행해야 하위 큐의 태스크 1개를 수행하도록 설정.

태스크 등록 함수 업그레이드

  • 우선 순위는 TCB 자료구조에 있는 플래그 필드의 하위 8비트를 통해 해당 우선순위 큐에 삽입하도록 수정.

17.2.3 태스크 우선순위 제어

  • 태스크의 우선순위를 즉시 변경하려면 두 가지 경우를 고려.
    • 실행 중인 자신의 우선순위를 변경하는 경우.
    • 변경할 태스크가 준비 큐에 있는 경우.

17.2.4 콘솔 셸과 테스트 태스크의 우선순위 지정

  • 콘솔 셸은 우선순위를 가장 높게 설정해 끊기지 않게 해야 함.

17.3 태스크 종료와 유휴 태스크

17.3.1 태스크 종료, 태스크 상태와 대기 큐

  • 태스크를 완전히 종료하려면 메모리를 반환한 후 다른 태스크로 전환하는 코드를 수행.
  • 가장 낮은 순위를 갖는 유휴(idle task)와 대기 큐로 이를 해결.
  • 대기 큐는 종료시킬 테스크를 저장하는 용도.

17.3.2 태스크 종료 함수 구현

  • 태스크를 종료하는 작업은 자신을 종료하는 경우와 다른 태스크를 종료하는 경우로 나뉨.
  • 다른 태스크를 종료하는 경우라면 태스크 플래그에 태스크 종료 비트 설정 후 우선 순위를 변경.
  • 자신을 종료하려면 태스크 종료 플래그 설정이 끝난 후 자신을 대기 큐에 연결하고 다른 태스크로 전환.
  • 코드 17.4 참조

17.4 멀티레벨 큐 스케줄러와 태스크 종료 기능의 통합과 빌드

17.4.1 태스크 파일 수정

Task.c 코드 보기
Task.h 코드 보기
AssemblyUtility.asm 코드 보기
AssemblyUtility.h 코드 보기

17.4.2 C 언어 커널 엔트리 포인트 파일과 콘솔 셸 파일 추가

Main.c 코드 보기
ConsoleShell.c 코드 보기
ConsoleShell.h 코드 보기
Console.c 코드 보기

17.4.3 빌드와 실행


마치며

끝..

Share