操作系统调度和实时操作系统调度的区别

7
考虑以下这个函数/进程:
void task_fun(void) { while(1); }
如果该进程在常规PC操作系统上运行,它会一直运行而不会停止。但是,在移动电话上运行此进程将在几分钟内导致硬件看门狗过期并重置整个系统。
在PC上,此进程在过期其规定的时间片后将被调度出,并安排运行新的可运行进程。
我的疑问是为什么我们不能在RTOS上应用相同的策略?如果在RTOS上实施此类调度策略会涉及哪些性能限制?
我还有一个疑问是,我检查了我PC OS(Ubuntu)和手机(也运行Linux内核)的schedule()函数。我发现它们两者几乎相同。那么,我的手机上的看门狗控制是在哪里完成的?我假设调度程序在让进程运行之前启动看门狗。有人可以指出代码中的位置吗?

3
我对你在这里使用术语并不是很自信:通常,RTOS是指存在保证事件被服务的最大时间(例如ISR)的操作系统。如果一个操作系统可以适当地进行抢占式任务调度,那么看门狗定时器就不是真正“必需”的,只有当一个任务能够垄断处理器(如协作式多任务处理)时才需要。通常,看门狗定时器是硬件设备,您需要定期“启动”它(例如在任务切换时),以确保它不会重置设备。 - paxdiablo
也许使用“嵌入式操作系统”这个术语会更少引起争议?你的手机使用哪个操作系统? - John Mulder
@John Mulder:是的,你说得对!嵌入式操作系统会是一个更好的术语!我的手机正在运行Linux内核2.6.35.11! - Pavan Manjunath
你怎么知道这肯定会让你的手机崩溃? - nos
@nos:我曾经在许多嵌入式手机平台上工作过。每当任务中有耗时的进程(例如联系人数据库更新)或系统中存在导致纯粹的while(1){}的错误时,手机就会崩溃。 - Pavan Manjunath
4个回答

1

实现看门狗的方式有几种,Linux 没有强制规定:

  • 一个进程或线程定期运行以测试是否正在执行关键操作。如果没有执行,则采取纠正措施,例如重新启动机器或重置有问题的组件。
  • 一个进程或线程持续运行以吸收额外的 CPU 时间并重置计时器。如果任务无法运行,则计时器到期并采取纠正措施。
  • 硬件组件在不定期进行“按摩”(即硬件计时器到期)时重置系统。

这里没有任何东西是不能在实时操作系统或任何其他多任务操作系统上完成的。


你的所有观点都是完全正确的!但我的疑问是为什么个人电脑操作系统不强制执行这些,而嵌入式操作系统却要执行,如果在嵌入式操作系统上没有实现这样的功能,会有什么性能影响,如果在个人电脑操作系统上实现了呢? - Pavan Manjunath
2
@PavanM:大多数嵌入式系统具有众所周知的特征,因此识别“正常行为”是很直接的。大多数个人电脑是通用的:有时它们运行添加几个数字的程序;其他时候它们运行计算十亿位小数的π的程序。操作系统如何识别错误的程序? - wallyk

1

无论是在桌面电脑还是移动电话上,Linux 都不是实时操作系统 (RTOS)。它的调度策略是基于时间驱动的。

在实时操作系统中,调度是由事件触发的,可以来自环境上的中断服务请求 (ISR),也可以来自软件本身通过系统调用 (发送消息、等待互斥等)。


1
还有基于时间的实时调度策略。请参阅基于速率单调性/最早截止时间的任务集调度方法。 - BjoernD

1

手机“崩溃”是手机设计或特定操作系统的问题,而不是嵌入式操作系统或RTOS的一般问题。这可能会“饿死”低优先级任务(可能包括看门狗服务),这可能就是此处发生的情况。

在大多数嵌入式RTOS中,系统设计人员应在部署时定义所有进程,并且设计是为了按需安排所有进程。在这样的系统上放置用户定义或第三方代码可能会损害其调度方案,就像您的示例一样。我建议所有这些进程都应以与其他所有进程相同的低优先级运行,以便轮询调度程序将用户应用程序平等地服务,而不会影响系统服务。

手机操作系统通常是RTOS,但用户进程不应以比系统进程更高的优先级运行。这可能是有意的,使得这些进程比看门狗服务更高,以确保系统免受“行为不当”的应用程序(如您的模拟)的影响。

大多数RTOS使用抢占式基于优先级的调度程序(最高优先级的准备好的任务运行,直到终止、让出或被更高优先级的任务或中断抢占)。有些还为同一优先级级别的任务安排循环调度(任务运行,直到终止、让出或消耗其时间片,并且其他具有相同优先级的任务准备好运行)。


0
在普通的操作系统中,我们有两种类型的进程。用户进程和内核进程。内核进程有时间限制。然而,用户进程没有时间限制。
在实时操作系统中,所有进程都是内核进程,因此必须严格遵守时间限制。所有进程/任务(可以互换使用)都基于优先级,并且时间限制对于系统正确运行非常重要。
因此,如果您的代码void task_fun(void) { while(1) }永远运行,其他更高优先级的任务将会饿死。因此,看门狗会崩溃系统,以指定开发人员未满足其他任务的时间限制。
例如,GSM调度程序需要每4.6毫秒运行一次,如果您的任务运行时间过长,则无法满足GSM调度程序任务的时间限制。因此,系统必须重新启动,因为其目的已经失败。
希望这可以帮助您 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接