RMS(Rate Monotonic Secheduling)是一種可以提供固定任務週期的調度系統。與普通的隨機式的、不可預測的調度系統不同,RMS可以提供固定的、可設置的調度週期,且精度可達到納秒級。多個RMS調度之間優先級按照週期越小優先級越高的原則。
函數原型:
sched_rms_init()爲線程 thread 創建一個rms調度器,sched_rms_destroy()用於刪除一個rms調度器。sched_rms_period()啓動rms調度器,period爲週期。執行sched_rms_period()後會開始計時,直到下次執行sched_rms_period()時,若未到設置週期則阻塞到時間到達,若超過設置週期則會發生溢出錯誤;
測試代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched_rms.h>
#include <pthread.h>
int main (int argc, char **argv)
{
int i;
sched_rms_t rms;
struct timespec period;
period.tv_sec = 3;
period.tv_nsec = 0;
if (sched_rms_init(&rms, pthread_self()) < 0) {
perror("sched_rms_init");
return (PX_ERROR);
}
for (i = 0; i < 5; i++) {
if (sched_rms_period(&rms, &period) < 0) {
perror("sched_rms_period");
return (PX_ERROR);
}
system("date");
}
if (sched_rms_destroy(&rms) < 0) {
perror("sched_rms_destroy");
return (PX_ERROR);
}
return (0);
}
運行結果:
若在system("data");之後加入一句sleep(5),則會迫使調度器超時,從而引發溢出超時錯誤,如下: