RTOS如何被视为确定性的?


8

在PC(当然是OS)上,任何C程序在时序方面都变得不确定。例如,根据“我移动另一个窗口的速度”,一个循环需要1.2到1.3秒。这是因为OS使进程(或线程)共享处理能力。

就RTOS而言(在嵌入式系统上),当我们编写多线程应用程序时,我认为根据并发执行的线程数会发生相同的事情。

我没有仪器可以在嵌入式系统上进行准确测试。因此,我想问。我的关注点合理吗?或者我缺少一些非常根本的东西?

编辑:我会举一个例子。我们有task1(花费10毫秒)和task2(花费20毫秒)。它们是同时在不同的两个线程上启动。我的主张(也是担心,不确定)是task1花费了10ms以上的时间,因为它们与task2共享处理能力。


确定性包括输入的集合(和时间安排)
PlasmaHH 2015年

3
您缺少RTOS 的定义。;-)
DrFriedParts 2015年

1
RTOS并不用于运行必须满足各个时序要求的单个任务,而是用于运行一个整体上必须满足其所有时序要求的系统。确定性并不意味着“独立于所有情况”,而是意味着“当我充分了解情况(肯定包括更高优先级的任务)时,我可以预测一个上限”。
Wouter van Ooijen

Answers:


6

并不是实时操作系统中的任务是自动确定性的,但是可以对任务的运行时间和频率进行严格的限制。实时操作系统通常会为任务提供硬优先级;任何时候,具有最高优先级的就绪任务都会在运行。代码的编写者还可以完全控制正在运行的任务集;您可以合理地预期没有高优先级的后台任务可能会中断您的代码,例如将数据交换到磁盘,除非您编写了这些任务。

最重要的是,一些RTOS提供了协作式多任务处理。与抢占式多任务相比,协作式多任务将继续执行任务,直到它自愿放弃对CPU的控制为止。


10

就RTOS而言(在嵌入式系统上),当我们编写多线程应用程序时,我认为根据并发执行的线程数会发生相同的事情。

不!

如果发生这种情况,则说明它不是实时操作系统(RTOS)。

简短的答案是,RTOS的定义与多任务处理或优先级无关。只是所有任务都有时间保证

您认为RTOS的其余特征(优先级,任务完成等)仅是构建系统的结果(或功能),在该系统中任务必须在指定的时间间隔内完成。

从概念上讲,RTOS中的多任务比软时间OS中的多任务简单,因为基本上不允许许多复杂的边缘情况。


因此,如果task1花费10毫秒,而task2花费20毫秒。如果它们同时运行(作为两个单独的线程),它们是否仍将分别在10毫秒和20毫秒内完成?
ozgur 2015年

2
确实,RTOS的全部目的是要强制执行低优先级任务不会与高优先级任务同时运行。
pjc50 2015年

1
@ pjc50-我认为您的评论是关键点,可能会迷路。这个问题包含一个基本的误解。有没有“启动任务1和启动任务2 在同一时间 ”; 较高优先级的任务(T1)将停止/抢占较低优先级的任务(T2),直到T1完成,或者被更高优先级的任务(T0)抢占。显然,没有任何操作系统能够神奇地启用需要比可用资源更多的任务来满足其时间,空间等资源限制。
gbulmer

2
“没有操作系统可以神奇地启用需要比可用资源更多的任务” –确实,它不能。但是,真正的RTOS可以使您事先告知是否可以保证满足您的所有约束。
JimmyB

1
@ozgur:您误解了在RTOS上运行的应用程序。RTOS上的应用程序通常不具有两个分别花费10毫秒和20毫秒的任务,而是具有每个花费0.01毫秒的任务,但是任务1必须执行每10毫秒,而任务2必须执行每20毫秒。通常在实时应用程序中,我们永远不允许线程并行运行以共享CPU能力。相反,我们以最短的时间运行线程,然后使其休眠。RTOS的要点是可以保证,当我要求它在10毫秒内唤醒我时,它将代替10.01毫秒来做到这一点
slebetman 2015年

6

RTOS通常不能保证吞吐量,而是可以保证延迟

这通常是通过优先系统来实现的,例如FreeRTOS中的以下系统

FreeRTOS调度程序可确保始终向“就绪”或“运行”状态的任务分配处理器(CPU)时间,而不是优先级较低的任务也处于“就绪”状态的任务。换句话说,置于“运行”状态的任务始终是能够运行的最高优先级任务。

假设您有一个优先级为1的任务需要10毫秒来处理一个事件,一个优先级为2的任务需要100毫秒来处理一个不同的事件,以及一个后台优先级3的任务。如果期望一个优先级为1的事件不超过每秒,那么可以说处理优先级为2的事件的最坏情况是10ms + 100ms。优先级3的任务可能会因事件而任意放慢速度,但是您不必担心-因为它的优先级较低。


在您的示例中,优先级为1的任务和优先级为2的任务是否同时运行(两个线程同时启动)?
ozgur 2015年

1
可能是,或者优先级2在运行时启动优先级1。本示例假定使用单个CPU。请注意,示例规范还限制了可以运行的P1任务的数量-如果每10毫秒收到一次P1事件,并且需要10毫秒来处理,则其他任何事情都不会运行
pjc50 2015年

好的,这是我的问题。task1(10ms)同时启动。我相信task1花费了10ms以上的时间,因为它们正在与task 2共享处理能力。我希望我能说清楚。
ozgur 2015年

我认为要指出的是,调度程序不会同时运行任务1和2。它将2. 10毫秒后运行任务1(优先级较高)第一和队列的任务,当任务1次完成,它运行的任务2
michaelyoyo

1
是的,它不会交错执行task1和task2。如果P1任务是可运行的,则在完成之前不会安排任何P2任务。如果P2任务已经在运行,它将被抢占并暂停直到所有P1工作完成。
pjc50 2015年

4

我希望这是一条评论,但要使用太多字符。无论如何,Ozgur从评论回复中的问题来看,您似乎错失了一点,您不能简单地说我的线程花了这么长时间才能运行,并希望它可以与其他线程神奇地协同工作,这要归功于OS。您必须设计线程并分析它们以获得最坏的性能。如果最坏的情况不能满足您的要求,那么您需要重新设计线程。

因此,您不仅要说线程1要花10毫秒才能完成,而线程2要花20毫秒来完成,您还必须说线程1必须每15毫秒执行一次。线程2必须每40毫秒执行一次。线程3必须每500毫秒执行一次,线程N必须每1500毫秒执行一次。然后为最坏情况下的每个线程花费多长时间分配时间。将所有内容放在一起,找出最坏的情况,然后必须确保每个线程都满足其时序要求。在此分析中,您还可以确定某些线程是否需要比其他线程更高的优先级才能满足其时序要求。

例如,线程5正在运行被线程4中断,线程5被线程3中断,线程3被线程N中断可能是最坏的情况。您将所有这些放到时间轴上,并验证即使在这种最坏的情况下,每个线程也都可以满足其时序要求。您可以通过使用实时操作系统中的调度程序和优先级来确保线程确定性地完成此最坏情况。确定性是构成实时OS的原因。

如果使线程具有相同的优先级,那么您将失去某些(即使不是全部)确定性,因为调度程序可以自由选择下一个要运行的线程。

在Windows之类的操作系统中,不仅不能指定每个线程何时运行,甚至不能保证您的应用程序将在任何时间运行。操作系统可以随时停止您的应用程序并运行某些后台服务。换句话说,没有确定性。因此,Windows不是实时操作系统。虽然,如果您的时序要求很大(例如(线程1每10秒运行一次,线程2每15秒运行一次)),那么您基本上可以将Windows视为实时操作系统,只要考虑到延迟时间(大约每10或15秒一次) (给出或花费几百毫秒的时间,偶尔会错过窗口)就足够了。


1

尽管其他答案已经表明,在“现实世界”中您的方案是不可能的,但是为了能够回答您的问题,我们必须构建一个假设的系统。

我们的系统包括以稳定的速度发射球的枪,两个“抓住”球并在捕获到每个球时前进一个步骤的盒子。可以将枪切换为向其中一个箱射击,但每次切换时,它都会放开一个球。第一个盒子将需要1000步(球)才能到达终点,而第二个盒子将需要2000步。

方案1(一个接一个地执行任务):
-枪在第1盒射击1000球,开关(花费1球),在第2盒射击2000球,总共3001球

方案2(任务“同时”):
-枪在一个盒子里射出5个球,切换并在另一个盒子里射出5个球,以显示出同时感。转换成本为(1000/5 x 2 =)400球。因此,在射出2400个球之后,盒子1将到达其末端,盒子2将需要另外的1000个球才能到达其末端,总共3400个球

将这些结果应用于您的方案,任务1和任务2的前半部分将在24毫秒后完成,任务2的后半部分将在另外10毫秒内完成,总共34毫秒。这清楚地表明,由于在任务之间进行切换所浪费的时间,完成任务所需时间增加了。这些结果也等同于任务1花费12毫秒和任务2花费22毫秒来完成。


已投票。这种解释使我的问题更加清楚,答案也显而易见。
ozgur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.