我有一个QNX实时操作系统和Ubuntu 17.10正在运行。问题是,除了QNX是一个RTOS之外,我没有任何证据证明它的行为类似于RT系统。我应该在每一个操作系统上运行什么样的应用程序,这样可以清楚地区分RT OS和Ubuntu的RT响应?
我在两者上都运行了一个信号处理程序(中断处理程序),看看哪个会先捕获中断。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
void sig_hand(int sig) {
printf("signal received\n");
exit(0);
}
void *sigfun(void *arg) {
signal(SIGINT, sig_hand);
while(printf("Thread running\n"));
return NULL;
}
int main(void) {
pthread_t th;
pthread_create(&th,NULL,sigfun,NULL);
pthread_join(th,NULL);
return 0;
}
我希望当一个线程继续打印时,QNX将获取中断并比Ubuntu更快地停止线程。但是,我看不出有什么不同,而且这可能不是找出更快RT响应的正确应用程序。
有谁能给我推荐一个更好的方法来区分RTOS和Ubuntu?
最佳答案
RTOS不会神奇地将代码转换为“实时的”;相反,它通过完全确定性来支持实时性。
像Linux这样的通用操作系统(GPO)通常使用循环等优先级时间共享调度程序,在多个进程之间“公平地”切换时间。因此,处理的运行越多,它们越忙(使用更多的可用时间片),它的响应就越差。
另一方面,RTOS通常有一个基于优先级的抢占式调度程序,这样最高优先级的就绪任务将立即运行,而不管怎样,并将继续运行,直到它挂起自身或更高优先级的任务就绪为止。在这样的系统中,您必须适当地分配优先级,以确保所有任务每次都能按时运行。一般来说,运行时间最短、确定性最强的任务应该具有最高的优先级。关键的是,虽然RTOS支持实时的确定性行为,但是开发人员有很大的责任适当地设计任务和优先级。
因此,您不能简单地运行一些任意的第三方代码并期望演示实时性能。您需要编写特定测试的代码。最简单的是,你可能有一个进程,阻止一个短周期的周期计时器,在这个任务中,得到实时通过,并分析你观察到多少时间抖动。实时系统应该具有最小的抖动(取决于其优先级和运行的更高级别的任务或中断),并且不会受到较低优先级任务的影响,而gpo将表现出更大的可变性,特别是在运行其他任务时。
Linux构建中有一个实时调度程序选项,但它远不是完美的。如果你发现自己在重症监护室接受生命支持,如果呼吸机运行的是Linux,就要有点担心了!
关于c - 如何区分RTOS和Linux?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55381378/