标题：实时软件技术
实时软件的概述
即时通讯的历史IM软件的历史并不久远，但是它一诞生，就立即受到网民的喜爱，并风靡全球。在它的发展史上，以色列人是功不可没的。正是四位以色列籍的年轻人，在1996年7月成立的Mirabilis公司，并于同年11月推出了全世界第一个即时通讯软件ICQ，取意为“我在找你”——“I Seek You”，简称ICQ了。直到现在，ICQ已经推出了它的2002a版本，在全球即时通讯市场上占有非常重要的地位。
目前，国内最为流行的即时通讯软件是OICQ（简称QQ）。它以良好的中文界面和不断增强的功能形成了一定的QQ网络文化。Messenger虽出道较晚，但依托微软的强大背景，实力也不可小视。作为Windows XP的一部分，Messenger 整合了操作系统的许多功能，如多种形式的聊天选择、多人的单窗口讨论式交流以及充分的文件与桌面共享功能等。它的令人耳目一新的中文界面和注册方式，连同它强大的功能，着实吸引了众多的眼球的注视，此外还有许多有特点的IM软件。即时通讯的原理我们经常听到TCP/IP和UDP(用户数据报协议)这两个术语，它们都是建立在更低层的IP协议上的两种通讯传输协议。前者是以数据流的形式，将传输数据经分割、打包后，通过两台机器之间建立起的虚电路，进行连续的、双向的、严格保证数据正确性的文件传输协议。而后者是以数据报的形式，对拆分后的数据的先后到达顺序不做要求的文件传输协议。
QQ就是使用UDP协议进行发送和接收“消息”的。当你的机器安装了OICQ以后，实际上，你既是服务端（Server），又是客户端（Client）。当你登录OICQ时，你的OICQ作为Client连接到腾讯公司的主服务器上，当你“看谁在线”时，你的OICQ又一次作为Client从QQ Server上读取在线网友名单。当你和你的OICQ伙伴进行聊天时，如果你和对方的连接比较稳定，你和他的聊天内容都是以UDP的形式，在计算机之间传送。如果你和对方的连接不是很稳定，QQ服务器将为你们的聊天内容进行“中转”。其他的即时通信软件原理与此大同小异。
实时软件及其特性
实时软件是必须满足严格时间约束条件的软件。比较而言，实时程序设计是目前应用软件开发中技术最难、风险最大的程序设计领域，这是由它的应用对象和环境决定的。考查顺序程序设计、多道程序设计和实时程序设计这三大程序设计领域的关系：多道程序中每一道程序是顺序的，而实时软件往往又是多道程序构成的，只是增加了实时性等特殊要求。因此，这三种软件开发方法之间具有包含关系，即一个比一个难度大，所需技巧更多。
顺序程序设计，相对后两种程序设计来说，其最主要的特性是程序的封闭性和可再现性。所谓封闭性是指程序一但开始运行，其结果不受外界因素的影响；可再现性是指该程序重复执行时，必获得相同之结果。多道程序的引入，使程序丧失了封闭性和可再现性，从而引入进程（或称任务）的概念。相对于顺序程序，多道程序产生了并发特性和异步特性。并发性是指一个程序段的第一个操作是在另一个程序段最后一个操作完成之前开始的，则称这些程序段是并发的。对进程而言，异步特性是指各进程按照各自独立的、不可预知的速度向前推进；对事件而言，系指各事件发生的时间和顺序是不可预知的。
在许多实际应用中，我们将实时系统设计成多任务并发系统，因而要用到多道程序并发设计技术。但应认识到，这样做主要是为了更充分地利用计算机资源，而不是说实时系统就必须是多任务并发系统。从逻辑上讲，实时是我们的目标，多道程序并发是技术或途径。
正因为实时系统往往采用多道程序并发技术，所以它具有多道程序并发特性和异步特
性。除此之外，实时软件还具有如下特性：
1．实时性
实时性是指某个事件服务或某进程代码在分配的响应时间内必须是可执行的。换言之
，假定没有其他进程竞争CPU，该进程必须能在规定的响应时间内执行完。
在实软件中，“时标”是一个极其重要的概念。因为任何实时程序的工作，均是在“
时标”控制下进行的一一无论周期性或随机性工作，都离不开“时标”约束。这就意味着“超时”一一即使程序正确地完成功能性操作，但执行时间已起出“时标”限定范围，仍认为是软件错误。
2．在线性
在实时系统中，计算机往往作为嵌入式系统，实时软件是在环境事件的驱动下工作的
。计算机的状态和运行是整个系统的一部分，只要装置的运行不停，则计算机是不能停的。这就是在线性要求。由于在线环境下系统事件发生的随机性，系统工作状态的不确定性，使实时软件的测试工作变得非常困难。
3．高可靠性
高可靠性是实时软件的重要指标。这不仅在于实时软件常用作重要或有较大危险性的
设备的控制，而且由于在线性要求，即使出问题也不允许暂停。
实软件设计方法
1．任务划分
实时系统的工作过程（或称工作原理）就是实时数据采集一一实时处理一一实时输出
控制量以控制受控对象的过程。实时软件结构设计的主要问题是把系统分解成若干并行任务的方法以及任务间通讯与同步的表达。在实时软件中，任务划分一般依据以下原则：
（1）受相同事件驱动的加工应划分在同一个任务中。因为它们的激发条件一样，可
一次性统一调度。
（2）限定条件比较特殊（如响应时间要求短）的加工，应当相应地划分为独立任务
，以便进行高度的调整来满足这些特殊要求。
（3）信息交换频繁的加工应划分在同一任务中，可降低任务通讯带来的开销。
（4）同外部设备接口有关的加工应划分在同一任务中。因为实时软件往往要同特种
外部设备打交道，将这些加工放在一起，可有利于对其它任务隐蔽这些设备的特性，方便其管理和编程。
在按以上原则进行任务划分的基础上，还可从各任务中提取出共同的功能，形成管程
和公用子程序。管程主要是用来管理资源的。由管程统一管理资源，一是比较方便、安全，二是可隐蔽资源和外界关系的特性于管程内，三是方便任务间互斥与同步的管理。从各任务划分中抽出公用子程序比较简单，要注意的是应保证这些子程序的再入性，因为很可能有几个任务同时调用某子程序。
2．任务通讯
在一个并发多任务系统中，各个任务是异步向前推进的，但出于资源共享或任务的协
作关系，各并发任务间存在相互的制约关系，我们把这些制约关系称为“任务通讯”。
任务通讯有基于共享变量和基于消息传送二种方式。共享变量通讯又分为互斥与条件
同步。互斥是指一个任务（进程）访问某共享变量时，不允许其它任务访问该共享变量。条件同步是指共享变量处于不适合某个特性操作的状态时，任何需要作这种操作的任务都要延时，直到其它进程所执行的操作改变了该共享变量的状态为止。基于消息传送的通讯方式较共享变量方式是高级的通讯方式，因为进程不读写共享变时，而是发送与接收消息。这种方式不仅能完成消息的传送，也能实现进程间的同步。这两种方式的差别还在于：
消息传送方式是把不同时刻的数据排列在消息队伍中，共享变量方式则始终用当前时刻数据把上一时刻数据覆盖掉，而不管旧数据是否被取用了。
确定任务间的通讯方式（也叫任务界面）是非常重要的。任务界面设计得好，通讯效
率相应的就高，各任务间也能协调、有序地工作。任务界面的确定，也就是要准确有效地将以上几种通讯方式用到各任务间通讯中去。
3．任务调度
在实时系统中，任务数一般都多于CPU数，所以调度亦成了满足实时时间约束的一
个关键问题。任务调度的核心问题就是采用什么算法把处理机分配给各任务进程。实时系统中，为保证重要的或紧迫的任务及时执行，通常都采用最高优先数优先（High Priority First）调度算法。只要用户将“重要或紧迫”的任务赋于高优先数，则可保证这些任务能优先得到调度执行。所以，采用这种算法首先应考虑的问题就是任务优先数的确定。确定优先数的办法很多，但概括起来不外是基于静态特性和基于动态特性两种方法。静态优先是在任务进程创建时确定的。一经确定则在整个进行运行期间不再改变。
还有就是调度方式问题。调度方式是一进程正在处理机上执行时，若有优先数更高的
请求处理机服务时，如何分配处理机。调度方式分剥夺方式和非剥夺方式，剥夺方式系指一旦出现优先数更高的进程，便立即中断正在执行的进程，而把处理机分配给高优先数进程；非剥夺方式是指即使出现优先更高的进程，仍保持原进程的运行，直到原进程执行完成或因某种原因阻塞时，才将处理机分配等待运行的优先数最高的是程。显然，剥夺方式更灵活，它可使某些紧进程迅速得到响应。
在实时系统中，除非原进程耗时少，一般都采用剥夺调度方式。当然，这会带来系统
开销的增长。
4．容错处理
理论和实践证明，尽管软件在设计、编制和测试过程中可通过各种方法、手段排除软
件中的错误，但软件投入运行后绝对没有错误是不可能的。软件件容错技术则是力图使设计和编制的软件始终能正确执行，而不必担心运行软件中存在的，在设计、编制和测试中个别未被排除的故障。这对于具有在线性和高可靠性要求的实时系统来说，无疑具有极重要的意义。
（1）故障类型
软件故障是软件设计和编程中的缺陷在功能上的一种表现。研究软件容错首先应从分
析故障类型，即从建立故障模型开始。从错误效果来看，我们可将软件故障分三类：
①内部故障（或称局部故障）
内部故障是指其影响局限于一进程内，且能被该进程处理的故障。
②外部故障
故障的影响虽局限于一进程内，但不能被该进程处理的故障。
③扩散性故障（全局性故障）
故障的影响不局限于一进程，且不能被一个进程处理的故障。
（2）容错软件方法
目前，对那些能建立确定软件故障模型的故障，如除零错，超出输入输出状态定义域
非法软件操作等，可以从软件故障检出，损害评估，错误恢复，继续软件运行这四个方面采取措施实现软件容错；面以一些难于建立模型的软件故障来说，就只有采取软件冗余来实现软件容错。下面简单地对用得较多的几种软件设计方法加以讨论。
①故障处理（器）软件容错法
此法实际是设计一种嵌入或在线实时自诊断和自处理程序。它们被分段嵌入到主体软
件中，从而能对主体软件进行在线实时的故障处理。
对软件故障检出，原则上可利用软件工程化中有关软件验证和测试中的任何方法。但
由于其在线性和实时性的要求，应考虑那些有效而省时的方法。
在软件故障损害评估方面，对单任务系统比较容易，而对多任务系统则比较困难。必
须对任务间的通讯联系有充分的了解和严格的控制。
错误恢复是指恢复到故障前的正常状态。可用硬件（如便笺或寄存器组）存储上一时
刻现场，以此帮助系统实现高速恢复；对周期性实时系统，可用存储一些标准操作常数来恢复；对周期性实时系统，可用存储一些标准操作常数来恢复现场；对外界输入数据可用估值法恢复，或者重读输入数据来恢复；对输出控制信号，由于有些执行过程是不逆的，因而错误处理软件应在这些信号的内部校验和测试通过后送出。
②恢复模块容错法
此由故障处理方法发展而成。恢复厝块对主体程序的中间结果进行能否接收的校验。
如不合格，就给出替代程序，直到通过接收校验。如所有替代程序用完而仍不能通过校验时，只有对系统进行降级处理。
③N版程式容错法
对那些难于实现故障检出的软件故障，一般采用N版程式容错法，此容错法是对同一
需求由N（≥2）个小组独立地设计N个功能等价的程序。这N个程序能在N模时间冗余度的系统中并行运行。并在这N个程序中适当区段设立某些交叉检验点，皆在此点进行比较（或称表决），取大多数能接受的表决结果作为处理结果。
5．过载防护
在进行实时系统设计时，应赋予系统足够的的处理能力，使之能及时处理系统中的所
有任务。尽管如此，由于实时系统中事件发生的随机性，或者说是异步性，它们很可能都集中在某短时间内发生，即出现峰值负载的情况使系统应接不暇，超过其处理能力，从而，带来所谓的过载（Overload）问题。因此，实时系统必须具备某种防护机构，以保证即使任务过载，系统仍能顺利运行下去，也就是说使系统具有一定的自适应能力。
当过载防护机构发现系统出现瞬时峰值负载时，可通过缓冲区予以平滑。即将计算任
务存储于缓冲区中，并按一定的策略排成一个或若干个等待队列，等候处理。若系统中地过载等待时间很长，就必须采取相应的措施，当然，实时系统中不可能取其它系统中的停止任务插入的办法，因为这样很可能拒绝了一些重要的任务，从而给系统带来严重的后果。通常，实时系统中采用的办法是抛弃一些不重要的任务或降低某些不重要的周期性任务的频率。
实时软件测试
实时软件的测试是比较困难的，它除了完成程序功能的常规测试外，还必须在线地测试系统实时关系。因为即使是系统的每个模块是正确的，也不能保证其总的系统效应是正确的，也不能保证其总的系统效应是正确的。所以，要很好地完成实时软件的测试工作，一般应做如下工作：
1．模块功能测试
首先，在非并发环境，用软件测试的白盒法、黑盒法独立地对各个模块进行测试，考查能否达到规定的功能。如数据处理是否准确，精度是否达到标准，是否满足实时性要求（在规定时间内完成处理）。
2．实时关系测试
这完全是实时软件所特有的问题，实时软件的并发性使其在运行过程中的情况变得十分复杂，难以预知。实时关系测试主要包括任务调度关系测试和任务通讯的测试。任务调度关系测试主要测试多任务并发情况下，各任务是否按规定策略实现有序调度；任务通讯的测试则测试任务间同步、互斥关系以及消息传送是否正常，各任务是否能协调地向前推进。
3．构造实时软件测试工具
鉴于实时软件必须在线地进行实时关系测试，这是非常困难的事情，未调好的软件又不能拿到真的实时系统中去运行，所以，必须依靠一定的辅助工具一一借助于实际系统的仿真模拟系统。用于系统测试的仿真系统不仅具有模拟系统。用于系统测试的仿真系统不仅应具有模设置真实环境的功能，还应具有某些监测功能。环境的模拟设置，使实时软件各进程运行到一定格局，而监测功能可显示出相应时候的状态并跟踪一些关键变量（控制量）的变化情况。系统仿真测试系统在实时软件开始设计时同步筹划，齐头并进。可以说，没有这些仿真测试系统的支持，大型实时软件的测试工作是难以完成的。
4．强度测试
强度测试也是实时软件所特有的要求。在实时控制系统中，计算机的负荷是随环境和操作变化的。实时软件的质量保证规范中一般要求软件必须在指定的强度条件下通过测试，即在一定超强度负荷的情况下仍能正常运行。测试的办法就是用模拟仿真系统人为地造成极限时空，如同时让多个部件提出数据处理的要求，并同时在多处设置故障和报警等。
结束语
随着人类对自动控制系统的广泛开发，实时软件的需求越来越大。作为应用软件来说
，它是涉及问题较多、技术较难的一个分支。其工程化问题急待解决，其软件开发方法、开发环境、开发工具待还有等于进一步研究和提高。