실시간 시스템에서 작업들은 주기적 작업(periodic tasks)과 비주기적 작업(aperiodic tasks)으로 나뉜다. 이러한 작업들을 효율적으로 처리하기 위해서는 각 작업의 특성을 이해하고, 적절한 스케줄링 알고리즘을 적용해야 한다. 이 장에서는 주기적 작업과 비주기적 작업의 차이점, 각 작업의 특성, 그리고 Preempt RT 환경에서 이들을 처리하기 위한 방법에 대해 상세히 설명한다.
주기적 작업 (Periodic Tasks)
주기적 작업은 일정한 주기를 가지고 반복적으로 실행되는 작업이다. 예를 들어, 센서 데이터를 주기적으로 읽어오는 작업이나 특정 시간 간격마다 시스템 상태를 점검하는 작업이 이에 해당한다. 주기적 작업의 중요한 속성은 다음과 같다.
- 주기 (\mathbf{T_i}): 작업 i가 반복되는 간격이다. 이는 작업이 시작되는 시점 사이의 시간 차이로 정의된다.
- 실행 시간 (\mathbf{C_i}): 작업 i를 완료하는 데 필요한 시간이다.
- 기한 (\mathbf{D_i}): 작업 i가 반드시 완료되어야 하는 시점으로, 일반적으로 T_i와 같은 값을 가지지만, 경우에 따라 달라질 수 있다.
주기적 작업은 일반적으로 타임드 이벤트 기반 스케줄링에 의해 처리되며, 대표적인 스케줄링 알고리즘으로는 Rate Monotonic Scheduling (RMS)과 Earliest Deadline First (EDF) 등이 있다.
Rate Monotonic Scheduling (RMS)
RMS는 작업의 주기 T_i에 따라 우선순위를 할당하는 고정 우선순위 스케줄링 알고리즘이다. 주기가 짧은 작업일수록 높은 우선순위를 부여받는다. RMS에서 시스템이 스케줄러블(schedulable)하려면, 다음 조건을 만족해야 한다:
여기서 n은 시스템에 존재하는 주기적 작업의 수를 나타낸다. 이 부등식은 Liu와 Layland에 의해 도출된 것으로, 주기적 작업들이 충돌 없이 스케줄링될 수 있는지 판단하는 중요한 기준이 된다.
비주기적 작업 (Aperiodic Tasks)
비주기적 작업은 특정 주기를 가지지 않고, 외부 이벤트나 특정 조건이 발생할 때 실행되는 작업이다. 사용자 입력, 네트워크 패킷 수신, 또는 비정기적으로 발생하는 하드웨어 인터럽트가 여기에 해당한다. 비주기적 작업의 주요 속성은 다음과 같다.
- 요청 시간 (\mathbf{r_i}): 작업 i가 요청된 시점이다.
- 실행 시간 (\mathbf{C_i}): 주기적 작업과 마찬가지로, 작업 i를 완료하는 데 필요한 시간이다.
- 기한 (\mathbf{D_i}): 작업 i가 반드시 완료되어야 하는 시점이다. 이는 요청 시간 r_i 이후에 결정된다.
비주기적 작업은 주기적 작업과 달리 스케줄링에 있어 불확실성이 크기 때문에, 이를 효율적으로 처리하기 위한 다양한 알고리즘이 개발되었다. 가장 일반적인 방법 중 하나는 서버 기반 스케줄링이다.
서버 기반 스케줄링
비주기적 작업을 처리하기 위해 주기적 작업과 함께 스케줄링할 수 있도록 하는 방법으로, 서버 개념이 사용된다. 서버는 비주기적 작업을 처리하기 위해 주기적 작업과 동일한 형태로 스케줄링된다. 대표적인 서버 기반 스케줄링 알고리즘으로는 다음이 있다.
-
스푸라틱 서버 (Sporadic Server): 일정한 주기를 가지며, 비주기적 작업의 요청이 있을 때 그 작업을 처리하는 서버이다. 스푸라틱 서버는 자신의 주기에 따라 비주기적 작업을 처리하므로, 주기적 작업에 대한 간섭을 최소화할 수 있다.
-
디퍼러블 서버 (Deferrable Server): 주기적으로 실행되며, 비주기적 작업의 요청이 있을 때까지 자신의 실행 시간을 유보하는 서버이다. 디퍼러블 서버는 주기적 작업과의 간섭을 줄이면서도 비주기적 작업을 신속하게 처리할 수 있는 장점을 갖는다.
주기적 작업과 비주기적 작업의 상호작용
실시간 시스템에서는 주기적 작업과 비주기적 작업이 공존할 수 있으며, 이들 간의 상호작용이 시스템 성능에 중요한 영향을 미친다. 특히, 비주기적 작업이 주기적 작업의 실행을 방해할 수 있기 때문에, 이러한 상호작용을 신중히 관리해야 한다.
비주기적 작업의 우선순위 관리
비주기적 작업은 종종 주기적 작업보다 낮은 우선순위를 가지지만, 상황에 따라 즉시 처리되어야 하는 경우도 있다. 이를 위해 우선순위 상속(priority inheritance)과 우선순위 역전(priority inversion) 방지 기법이 사용될 수 있다.
-
우선순위 상속 (Priority Inheritance): 낮은 우선순위의 작업이 높은 우선순위의 작업이 필요로 하는 자원을 점유하고 있을 때, 낮은 우선순위의 작업이 일시적으로 높은 우선순위를 상속받아 실행된다. 이는 높은 우선순위 작업이 자원을 획득할 때까지 기다리는 시간을 줄여준다.
-
우선순위 역전 (Priority Inversion): 높은 우선순위 작업이 낮은 우선순위 작업에 의해 간접적으로 방해를 받는 현상이다. 우선순위 역전을 방지하기 위해 다양한 스케줄링 기법이 적용된다.
주기적 작업과 비주기적 작업의 스케줄링 전략
주기적 작업과 비주기적 작업을 동시에 처리하기 위한 스케줄링 전략은 다양한 방법으로 구현될 수 있다. 대표적인 전략으로는 다음이 있다.
-
혼합 스케줄링 (Mixed Scheduling): 주기적 작업과 비주기적 작업을 동일한 스케줄링 큐에서 처리하는 방법이다. 이 경우, 주기적 작업은 고정된 우선순위를 가지며, 비주기적 작업은 그보다 낮은 우선순위를 가질 수 있다. 혼합 스케줄링은 구현이 간단하지만, 비주기적 작업의 응답 시간이 길어질 수 있다.
-
서버 기반 혼합 스케줄링 (Server-Based Mixed Scheduling): 앞서 언급한 서버 기반 스케줄링 기법을 혼합 스케줄링에 적용하는 방법이다. 주기적 작업과 비주기적 작업을 각각의 서버에서 관리하며, 이 서버들이 전체 시스템에서 조화롭게 동작할 수 있도록 스케줄링한다. 이 방법은 주기적 작업의 성능에 미치는 영향을 최소화하면서도 비주기적 작업을 효율적으로 처리할 수 있다.
비주기적 작업의 처리 성능 분석
비주기적 작업의 처리 성능을 분석하기 위해 주요 지표로 응답 시간(response time)과 스루풋(throughput)이 사용된다.
-
응답 시간 (Response Time): 비주기적 작업이 요청된 시점부터 처리가 완료될 때까지의 시간이다. 응답 시간은 비주기적 작업의 요구 사항을 충족하는지 평가하는 중요한 지표이다.
-
스루풋 (Throughput): 단위 시간당 처리된 비주기적 작업의 수를 의미한다. 시스템의 처리 능력을 평가하는 데 중요한 지표이다.
응답 시간과 스루풋은 상호 의존적인 관계에 있으며, 스케줄링 알고리즘의 선택에 따라 이들 지표가 크게 달라질 수 있다. 적절한 스케줄링 기법을 적용하여 비주기적 작업의 응답 시간을 최소화하면서도 스루풋을 최대화하는 것이 중요하다.
주기적 작업과 비주기적 작업의 처리는 실시간 시스템 설계에서 중요한 부분이다. 두 작업의 특성을 이해하고, 적절한 스케줄링 알고리즘을 선택하는 것은 실시간 시스템의 안정성과 성능을 보장하는 데 필수적이다. 이 장에서는 Preempt RT 환경에서 주기적 작업과 비주기적 작업을 효과적으로 처리하기 위한 다양한 기법과 전략을 논의하였다. 이를 바탕으로 실시간 애플리케이션의 설계와 구현에 있어 올바른 결정을 내릴 수 있을 것이다.