《实时操作系统的基本概念.pdf》由会员分享,可在线阅读,更多相关《实时操作系统的基本概念.pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、原文链接:原文链接:http:/ 翻译:马成东/中科院研究生院计算与通信工程学院 实时操作系统的基本概念 第一概念第一概念 对大多数人来说,嵌入式系统并不像计算机一样为人们所熟知。然而,它们却时刻隐藏在我们周围并为我们生活所使用的日常物品中。嵌入式系统通常没有我们熟悉的 PC 接口设备,如鼠标,键盘和图形用户界面接口。相反,它们与外界接口通过特殊的接口,如传感器,执行机构和专门的通信链路。实时嵌入式系统的受其内存和处理能力有限的制约。它们往往需要在严格的时间期限内提供服务给用户和周围的世界。在嵌入式软件中应用实时操作系统规定了这些内存,速度和时间。基本内核服务基本内核服务 在下面的讨论中,我们
2、将重点放在“内核”在处理器上运行的应用软件,提供最基本的服务的操作系统的一部分。一个实时操作系统(RTOS)的“内核”,提供了一个“抽象层”,硬件抽象层是位于应用层和硬件处理器(或处理器组)之间的应用软件,它完成硬件初始化等相关配置工作。如图 1 所示。图 1:一个 RTOS 内核提供了一个应用软件和嵌入式硬件之间的抽象层。基于“抽象层”,RTOS 内核给应用软件提供五个主要类别的基本服务,如图 2 的。图 2:一个实时操作系统内核提供的基本服务 图 3:基于优先级的抢占式调度的例子的时间轴 每个基于优先级的抢占式调度是由外部世界触发(如合闸)或软件触发(如消息到达)提醒的,它必须经过以下 5
3、 个步骤:*确定当前运行的任务是否应继续运行。如果没有.*确定下一步应该运行哪个任务。*保存被停止的任务状态(方便在稍后继续该任务)。*设置将要运行的任务的运行环境。*允许运行此任务。这 5 个步骤一起被称为“任务调度”。固定时间的任务调度固定时间的任务调度 做任务调度所需要的时间室评估一个操作系统的关键。一个简单的通用计算机(非抢占式)操作系统只有在固定时间周期做任务调度,例如可能相隔 10 毫秒。如果任务调度需要可以在 10 毫秒的时间内任何时间点出现,实际的任务调度只有在最近 10 毫秒期间的最后才完成。在多数实时嵌入式系统中,这样的延迟是不可接受的。在更复杂的抢占式的任务调度中,调度程
4、序需要搜索任务阵列,以确定接下来该让哪个任务运行。如果有更多的任务需要搜索,搜索将需要更长的时间。这样的搜索往往是通用计算的操作系统完成的,因此使这样的调度具有不确定性。另一方面,实时操作系统使用增量更新的列表代替任务搜索,这样让任务调度程序以较快且固定时间的方式识别下一个将要被执行的任务。图 4:任务调度时序 这两种类型的任务调度时间的行为如图 4 所示。在这个图中,我们看到,一般计算(非实时)的操作系统,任务调度时间随着调度任务的增加而上升。然而,实际任务调度时间不是虚线红线所示的时间。相反,在任何给定的任务调度实例中,它可能会远高于或远低于虚线红线所示的时间。周围的虚线红线的阴影区域,简
5、单地描述了了实际任务调度时间远远高于或低于虚线红线的可能性。另一方面,横向的绿色实线显示出实时操作系统的任务调度的时间特点。它是不变的,独立于任何负载等因素的(例如操作系统中的任务数量)。请注意,在某些情况下,如在图的最左边的区域,非实时通用计算机操作系统任务调度时间可能在特殊情况下比实时操作系统更快。这并不减少一个实时操作系统为实时嵌入式系统的恰当性。因为,事实上,“实时”并不意味着“越快越好”,而“实时”要求时间一直,是可重复的,时序性能是已知的。虽然非实时操作系统做小数量任务调度会很快,但它下一次调度相同的任务时可能会花费较长的时间。实时操作系统的优势是它的已知性,可重复的时序性能,这在
6、大量任务系统下实时系统通常比非实时性操作系统能更快的完成任务调度。大多数情况下,当任务数量增长到 5 或 10 个的时候,实时操作系统任务调度速度远远超过它的非实时的竞争对手。任务间通信和同步任务间通信和同步 大多数操作系统,包括实时操作系统,提供了各种机制之间的沟通和任务同步。这些机制是一个占先式多任务环境所必备的,因为没有它们的任务间很可能传递损坏的信息或以其它方式相互干扰。例如,一个任务在更新数据表可能会被抢占。如果第二个任务抢占它从该表中读取,它可能会读取一些新更新的数据加上一些尚未更新的数据区域的组合。纽约人称之为“米什混搭”。这些更新和旧数据领域可能是不正确的组合,或者甚至可能没有
7、任何意义。例如一个数据表,其中包含的内容“10”开始的温度测量。一个任务开始用“99 F”逐个字符的更新此表。如果该任务是在数据更新中间抢占的,第二个任务抢占时可能会读取“90”或“99”或“99 F”,这取决于抢占发生时它的值。部分更新的值显然是不正确的,是微妙的时机巧合,很难调试发现问题或复现问题。RTOS 的任务间通信和任务之间的同步机制可以避免这些类型的错误。大多数实时操作系统提供了几种机制,通过机制优化可以在任务间可靠地传递信息。在嵌入式系统中的任务之间的沟通最流行的一种可能是从一个任务到另一个任务的数据的传递。大多数实时操作系统提供了图 5 所示的消息传递机制。每个消息可以包含一个
8、数据数组或缓冲区。消息使用任务消息使用任务 消息产生任务消息产生任务 图图 5:任务间的消息通信:任务间的消息通信 消息消息 如果发送消息的速度比处理消息的速度快,RTOS 将提供的消息序列保持信息直到消息能被处理。如图6 所示。欲了解更多有关消息,消息队列和消息传递选项,实时操作系统可能提供的各种信息,你可以学习题为Messages for Intertask Communication这个网站上线教程。另一个通信方式在嵌入式系统中通常被称为从一个任务到另一个任务的“同步信息”。“同步信息”就像一个命令,其中一些命令是正同步的,另一些是负同步的。例如,对一个任务的负同步命令类似“现在请不要打
9、印,因为我正在使用打印机”。或更普遍的是,“我想锁定.以便只为我自己使用”锁定。正同步的命令类似“我已经侦测到核心紧急任务,我要你帮我处理”。或更普遍的是,“请和我一起处理.”。大多数实时操作系统提供了旗语或互斥机制来处理不同步的任务(有时也被称为“相互排斥”)。这些机制使得任务锁定供其独自使用某些嵌入式系统资源,并随后在完成任务时解锁这些资源。对于正同步,不同的实时操作系统提供不同的机制。有些实时操作系统提供的事件标志,而另一些则提供信号。而其它的依赖正同步消息的传递和数据传递。更深入的任务间通信和同步机制在实时操作系统上的信息,参加我们的课程Introduction to Real-Tim
10、e Operating Systems。确定性和高速消息传递确定性和高速消息传递 交互任务间的信息沟通是另一个领域,不同的操作系统具有不同的时序特性。实际上,大多数操作系统通过消息队列传递信息时需复制两次信息。见图 6。第一次复制是从一个消息发送任务到操作系统拥有的“秘密”RAM 内存(实施的“消息队列”);第二次复制是从操作系统的“秘密”的 RAM 区到信息接收任务。显然,这在时间上具有不确定性,消息增加越长,拷贝所需时间越长。图 6:通过消息队列的消息传输 一种避免这种不确定性并提高性能的方法是:使操作系统拷贝一个消息指针并传递这个指针给消息接收任务,而不是传递消息内容本事。为了避免访问冲
11、突,操作系统则需要返回到消息发送者的任务,擦除其复制到该消息的指针。对于较大的消息,这消除了需要漫长的复制,消除了不确定性。动态内存分配动态内存分配 服务时间确定性也是动态内存分布的一个问题。许多通用计算非实时操作系统通过所谓的“堆栈”提供动态内存分布服务。为 C 程序员众所周知的“malloc 函数”和“free 函数”服务都是基于堆栈的。任务可以通过调用 malloc 函数临时从操作系统的堆栈中借用一部分内存空间,并需要指定所需内存缓冲区的大小。当该任务或另一个任务完成内存缓冲区使用时,可以通过调用 free 函数将该缓冲区释放给操作系统。操作系统将该缓冲区归还给堆栈,在此内存可以被再次使
12、用。或许是一个较大缓冲区的一部分,也或许将来被分成若干小的缓冲区。堆栈会遭遇的一种叫做“外部内存碎片”的现象,这会导致堆的服务降级。这是碎片是在一个缓冲区被归还到堆栈后,malloc 需要更小的缓冲区时,该缓冲区被打碎成更小的缓冲区而产生的。堆栈在经历过很多次被 malloc 调用和被 free 释放的循环后,在被任务占用的内存缓冲区之间会出现许多小碎片。这些碎片因尺寸过小而无法被其它任务调用。但她们被困在正在被任务使用的缓冲区之间,无法合成到一起成为有用的缓冲区尺寸。随着时间的推移,堆栈将有越来越多的这样的碎片。这最终将导致尽管操作系统拥有足够的堆栈尺寸空间,但任务通过 malloc 函数要
13、求具有一定规模的内存缓冲区时被操作系统拒绝。问题是:该内存是离散分布在不同的地址的碎片。在操作系统的术语中,这些离散的条子被称为“碎片”,这个问题被称为“外部存储器碎片”。这种分散的问题用所谓的“垃圾收集”(碎片整理)软件处理。不幸的是,“垃圾收集”算法往往具有很大的不确定性在堆栈服务中增加了随机出现和随机时间延迟。这些经常出现在一般非实时计算机操作系统的内存分配服务种。这使得想使用非实时操作系统的嵌入式系统的开发者左右为难:要么使嵌入式操作系统调用碎片整理程序时允许偶然的随机出现或随机时间延迟?.或者,嵌入式系统允许碎片在内存中的存在,直到即使有足量的内存空间存在,但应用软件 malloc
14、函数调用要求堆栈空间时仍被拒绝?因为在嵌入式操作系统中需要长期提供服务,所以替代方案也不可行。另一方面,实时操作系统提供了解决这种避免碎片和碎片整理等一系列问题的方法。实时操作系统用无碎片的内存分配技术来代替堆栈。它们限制开放给应用软件的内存块大小。这种做法虽然不如采取内存堆栈的方法灵活,但它们避免了外部存储器碎片和避免需要碎片整理。例如,“池”的内存分配机制允许应用软件分配每个池 4 个或 8 个不同的缓冲区大小的内存块。池通过禁止被释放的缓冲区在未来被分为更小的缓冲区的方法,完全避免了外部存储器碎片。相反,当一个缓冲池返回,它保持原来缓冲区尺寸大小,并被放入“自由缓冲区列表”以便将来被再次
15、使用。如图 7 所示。图 7:内存池的可用缓冲区列表 内存从一个确定性,往往是常量的,时间固定的内存池分配和取消。概要概要 实时嵌入式系统有许多应用,如机载计算机,医疗仪器及通讯系统。嵌入式系统的特点是有限的处理器,内存,有限处理能力,和对外界的特殊接口。实时性要求在严格的时间限制内提供嵌入式处理结果。RTOS 内核隐藏在应用软件和硬件抽象层之间,并在同一时间为应用软件提供多种类型的服务。这些服务包括:管理基于优先级的抢占式调度,可靠的任务间通信和同步,无碎片动态内存分配,和基本计时器服务的任务。时序确定性的问题是一般计算操作系统区别于实时操作系统很重要的一点。这个问题在操作系统内核的许多地方的可见,如任务调度,动态内存分配和任务间的消息通信。虽然一般计算机操作系统往往为人们提供了在这些领域的非确定性的服务,但完全确定性的解决方案都需要实时和嵌入式系统。一些实时操作系统实现这些解决方案依赖其紧凑的高性能内核。(完)
限制150内