Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1638410
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2007-08-31 18:07:54

【8月9日星期四 ---???】linux RT的学习记录

今天下午刚刚开始学习Linux RT ,找到了一篇好文档, 入门不错。 以前也看过一点,不过也酒饭吃了。


Linux 实时技术与典型实现分析, 第 1 部分: 介绍
http://www.ibm.com/developerworks/cn/linux/l-lrt/part1/


Linux 实时技术与典型实现分析, 第 2 部分: Ingo Molnar 的实时补丁
http://www.ibm.com/developerworks/cn/linux/l-lrt/part2/


实时Linux (RT-Linux)
http://www.linuxfocus.org/ChineseGB/May1998/article44.shtml

【8月27日找到的】 A realtime preemption overview



下面是比较准确的定义RT ,摘录如下:

QUOTE:
一、实时的概念
所谓实时,就是一个特定任务的执行时间必须是确定的,可预测的,并且在任何情况下都能保证任务的时限(最大执行时间限制)。实时又分软实时和硬实时,所谓软实时,就是对任务执行时限的要求不那么严苛,即使在一些情况下不能满足时限要求,也不会对系统本身产生致命影响,例如,媒体播放系统就是软实时的,它需要系统能够在1秒钟播放24帧,但是即使在一些严重负载的情况下不能在1秒钟内处理24帧,也是可以接受的。所谓硬实时,就是对任务的执行时限的要求非常严格,无论在什么情况下,任务的执行实现必须得到绝对保证,否则将产生灾难性后果,例如,飞行器自动驾驶和导航系统就是硬实时的,它必须要求系统能在限定的时限内完成特定的任务,否则将导致重大事故,如碰撞或爆炸等。

二、衡量实时性的指标

那么,如何判断一个系统是否是实时的呢?主要有以下两个指标:

1. 中断延迟

中断延迟就是从一个外部事件发生到相应的中断处理函数的第一条指令开始执行所需要的时间。很多实时任务是靠中断驱动的,而且中断事件必须在限定的时限内处理,否则将产生灾难性后果,因此中断延迟对于实时系统来说,是一个非常重要的指标。

2. 抢占延迟

有时也称调度延迟,抢占延迟就是从一个外部事件发生到相应的处理该事件的任务的第一条命令开始执行的时间。大多数实时系统都是处理一些周期性的或非周期性的重复事件,事件产生的频度就确定了任务的执行时限,因此每次事件发生时,相应的处理任务必须及时响应处理,否则将无法满足时限。抢占延迟就反映了系统的响应及时程度。

如果以上两个指标是确定的,可预测的,那么就可以说系统是实时的。

[ 本帖最后由 bobzhang 于 2007-8-27 16:27 编辑 ]

        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-16 14:05          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈
RT 自己的理解。

刚开始看RT方面的资料, 以前其实也有个疑问, 到底实时和 抢占是什么关系呢? 抢占就是实时吗? 而实时系统一定需要抢占吗?

查了一些资料和自己对Linux kernel理解 , 我的理解如下:

实时系统必须满足上面定义的两个硬性指标 , 就说中断延迟和抢占延迟一定要在可预测的时间范围内。

现在看起来, 要想实现RT , kernel必须是抢占的, 否则, 怎么能保证实时任务得到立即的响应呢? 但是抢占是有前提的, 必须是实时任务可以抢占一般的任务,
反过来肯定是不行的, 要实现这一点 ,就必须要利用优先级的概念, 实时的任务的priority 要比较高才行。

还有一点 实时的kernel ,中断的优先级肯定不能最高,否则, 要是中断频频发生,实时任务就会频频的被打断, 实时性从何谈起呢。


现在对RT的理解就是这些吧


---
以前刚移植jk2410 的时候, 看过一点 montavista的关于RT的源码, 对于spinlock 改写的挺大的。

[ 本帖最后由 bobzhang 于 2007-8-20 09:55 编辑 ]

        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-20 09:53          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈
五、标准Linux内核制约实时性的因素
标准Linux有几个机制严重地影响了实时性。
1.内核不可抢占
在Linux 2.4和以前的版本,内核是不可抢占的,也就是说,如果当前任务运行在内核态,即使当前有更紧急的任务需要运行,当前任务也不能被抢占。因此那个紧急任务必须等到当前任务执行完内核态的操作返回用户态后或当前任务因需要等待某些条件满足而主动让出CPU才能被考虑执行,这很明显严重影响抢占延迟。
在Linux 2.6中,内核已经可以抢占,因而实时性得到了加强。但是内核中仍有大量的不可抢占区域, 如由自旋锁 (spinlock)保护的临界区,以及一些显式使用preempt_disable失效抢占的临界区。
2.中断关闭
Linux在一些同步操作中使用了中断关闭指令,中断关闭将增大中断延迟,降低系统的实时性。
3.自旋锁(spinlock)
自旋锁是在可抢占内核和SMP情况下对共享资源的一种同步机制,一般地一个任务对共享资源的访问是非常短暂的,如果两个任务竞争一个共享的资源时,没有得到资源的任务将自旋以等待另一个任务使用完该共享资源。这种锁机制是非常高效的,但是在保持自旋锁期间将失效抢占,这意味着抢占延迟将增加。在2.6内核中,自旋锁的使用非常普遍,有的甚至对整个一个数组或链表的便历过程都使用自旋锁。因此抢占延迟非常不确定。
4.大内核锁
由于历史原因,内核一直保留有几个大内核锁,大内核锁实质上也是一种自旋锁,但是它与一般的自旋锁的区别是,它是用于同步整个内核的,而且一般该锁的保持时间较长,也即抢占失效时间长,因此它的使用将严重地影响抢占延迟。
5.中断总是最高优先级的
在Linux中,中断(包括软中断)是最高优先级的,不论在任何时刻,只要产生中断事件,内核将立即执行相应的中断处理函数以及软中断,等到所有挂起的中断和软中断处理完毕有才执行正常的任务。因此在标准的Linux系统上,实时任务根本不可能得到实时性保证。例如,假设在一个标准Linux系统上运行了一个实时任务(即使用了SCHED_FIFO调度策略并且设定了最高的实时优先级),但是该系统有非常繁重的网络负载和I/O负载,那么系统可能一直处在中断处理状态而没有机会运行任何任务,这样实时任务将永远无法运行,抢占延迟将是无穷大。因此,如果这种机制不改,实时Linux将永远无法实现。
6.调度算法和调度点
在Linux 2.4和以前的版本,调度器的时间复杂度是O(n)的,而且在SMP的情况下性能低,因为所有的CPU共享一个任务链表,任何时刻只能有一个调度器运行。因此,抢占延迟很大程度上以来于当前系统的任务数,具有非常大的不确定性和不可预测性。
在2.6内核中引入的O(1)调度器很好地解决了这些问题。

此外,即使内核是可抢占的,也不是在任何地方可以发生调度,例如在中断上下文,一个中断处理函数可能唤醒了某一高优先级进程,但是该进程并不能立即运行,因为在中断上下文不能发生调度,中断处理完了之后内核还要执行挂起的软中断,等它们处理完之后才有机会调度刚才唤醒的进程。在标准Linux内核中,调度点(有意安排的执行任务调度的点)并不多,对2.4和2.6内核测试的结果表明,缺乏调度点是影响Linux实时性的一个因素。

        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-20 15:52          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈
还是 《ldd3》 上面说得比较清楚和权威

昨天又详细看了看ldd3上面对抢占的经典介绍。

现在搞明白了几点:当内核配置成支持抢占后

1> exception handler (主要是system call) 是可以被抢占的, 而且被优先级高的进程抢占后
(replaced)后,当高优先级进程执行完后,kernel 要重新schedule ,当又把刚才被replaced的进程投入
运行后, 刚才systemcall 才可以继续执行。

2> 当进入exception handler 的进程的时间片到期时,该进程立即被replaced 。但是对于非抢占内核,
就必须该exception handler完成,或者由于阻塞等原因放弃(relinquish) CPU 。

3> 中断是不能被抢占的。 "即使内核是可抢占的,也不是在任何地方可以发生调度,例如在中断上下
文,一个中断处理函数可能唤醒了某一高优先级进程,但是该进程并不能立即运行,因为在中断上
下文不能发生调度,中断处理完了之后内核还要执行挂起的软中断,等它们处理完之后才有机会
调度刚才唤醒的进程。在标准Linux内核中,调度点(有意安排的执行任务调度的点)并不多,
对2.4和2.6内核测试的结果表明,缺乏调度点是影响Linux实时性的一个因素" (引用上面那篇文章)


总之, 抢占和非抢占,主要是指当进程处于kernel mode的状态时,调度是否发生。
发生就是可抢占的内核,否则就是非抢占的内核。



----

+++++什么时候kernel不能被抢占++++++++++++

1> kernel正在执行中断处理服务例程(routine)
2>当kernel正在执行softirq或者tasklet的时候
3> kernel在某些关键的区域,调用了spinlock等明确禁止了抢占的地方
+++++++++++++++++++++++++++++++++++


抢占的时机:
进程处于用户空间(user mode) ,或者处于kernel mode(system call),没有禁止抢占的情况下, 可以抢占。



抢占的好处:
提高应用程序的响应速度。

[ 本帖最后由 bobzhang 于 2007-8-21 10:50 编辑 ]

        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-21 09:33          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈

发贴子讨论了一下这个问题


        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-21 10:26          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈
网上的一篇关于实时和抢占之间的关系和区别的讨论文章:


其中一个家伙的经典论述,正和吾意:

QUOTE:
关于“抢占式”:

我们通常说:“Linux是抢占式操作系统。”,这里的“抢占式”指的是Linux的进程调度是
抢占式的--多用户操作系统中的进程调度必须是抢占式的。

我们也通常说:“Linux是非抢占式内核。”,这里的“非抢占式内核”指的是当某个进程
由用户态进入到内核态后(比如说,通过系统调用),不能被调度程序挂起,转而去执行别
的进程,亦即不能被其它进程抢占,--除非处于内核态的该进程自愿放弃cpu时间。


关于“实时系统”:


实时系统是指系统的逻辑的正确性严重倚赖于输出结果的时间,只有当系统从输入到输出的
滞后时间足够小,才能保证系统的逻辑正确性。

以上是我的理解,有表述不恰当的地方,请指出。

另外一个家伙的评论:如果要支持抢占, 肯定要增加更多的系统开销,比如在支持同步互斥方面的。

QUOTE:
没有看过2.6的源吗!但是如果真的如楼主所说是抢占式内核的话,那么这个变化肯定是为了让linux支持实时性所作的更改。
linux在实时性方面之所以被人批了又批本质上就是因为它的内核是不可抢占的。如今2.6如果真的是抢占式的话,那么嵌入式环境应用,
实时应用的开发员们要喊乌拉了。不过现在linux的内核和抢占式内核是各有优缺点的,
抢占式内核肯定需要更多的系统开销来保证它的抢占性,还有内核数据同步的问题。

为什么,实时系统一定要抢占式内核?

QUOTE:
好像早期的实时内核有不是抢占式内核的,但是现在绝大多数的实时系统的内核都是抢占式的,
因为只有内核可以抢占,才能够从根本上保证一个实时进程能够在指定的时间内得到相应。
虽然实时内核和抢占式内核是两个不同的概念,但是两者的关系是很密切的。

一个家伙关于2.6抢占的分析:

QUOTE:
内核互动性以及响应性

Linux 2.6中一个受关注的焦点就是使得系统对于桌面用户以及其他一些需要对事件进行高度人为控制的应用具有更具响应性(responsitive)。这其中各个不同的目标系统具有很不同的挑 战,但内核中包含了很多改变,使得它们同时受益。

2.6中一个必须理解的主要内部改变是现在内核自身是可抢占的。在所有之前的Linux版本中,当系统运行内核的相关事务时,它不能被打断(在多处理器系统中,基于各cpu的角度这也是 成立的)。Linux 2.6中,内核现在允许自身在执行任务时被打断,这样用户任务可以继续运行即使内核正在做一些复杂的事情。(为了避免明显这可能带来的竞争情况,内核中含有一些具 有锁的代码段,运行于这样的代码段的时候,内核不能被打断。)这个改变的主要好处是系统的可交互性(比如,对于桌面用户)大大提升,系统对于用户输入这样的事件感觉起来快多 了。

其他使得Linux成为一个更加具有响应性系统的改变是并入对新的"futexes"("Fast User-Space Mutexes")的支持,这项支持发挥作用需要用户程序的支持(使用futex实现互 斥)。Futexes是一种序列化(serialize)事件使得它们不会相互冲突的机制。与传统的多数的线程库锁支持的mutex操作不同,这是部分基于内核的(partially kernel based),同时它也 支持设置优先级使得高优先级的应用或线程优先获得竞争的资源。通过使用一个程序去指定一个等待的任务比其他的更重要,它带来了可能是一个应用的时序--关键区域更佳的响应性。

Linux的I/O子系统也经历的很大的修改,使得它在各种工作负荷下都更具响应性。这个变化包括I/O 调度子系统--决定何时、哪一进程去读一个设备的内核代码的完全重写。重写的I/O层现在 可以更好地保证没有进程过长时间地停留在I/O等待上,同时不排斥以前的优化工作使得读等请求以最有效的次序操作硬件的优化工作。

尽管实时操作系统(RTOS)的开发者可以从这些改变中受益,Linux 2.6将不会成为一个实时内核。然而,这些以及其他相关的背景工作使得将Linux转变为RTOS成为可能。为用户或开发 者提供这样的支持的外部patch(尚未合并到官方的内核版本)已经出现了

什么时候可以抢占, 什么时候不可以抢占:

QUOTE:
2.6的抢占只是在用户态,或是system cal且没有spin_lock的情况下。

如果kernel守着的中断处理程序,或是bh不出来,
或者原先运行的进程占用着spin lock,
仍然没办法抢占,系统的行为将和没有抢占patch的时候一样。

Realtime System是一个涉及因素很多的东东,进程调度只是其中的一部分,呵呵。

[ 本帖最后由 bobzhang 于 2007-8-21 10:53 编辑 ]

        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-21 12:22          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈
网上找到一篇不错的“进程调度"的文章

后面涉及了 2.6 kernel的进程调度以及抢占的内容, 还不错, 文章写的不错, 值得我们学习



查看积分策略说明
附件
2007-8-21 12:22
  下载次数: 0
(519.72 KB)
 
        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-22 14:31          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈
linux kernel 里面的主动调度和被动调度




查看积分策略说明
附件
2007-8-22 14:31
(81.63 KB)
 
点击在新窗口查看全图
CTRL+鼠标滚轮放大或缩小
2007-8-22 14:31
(105.31 KB)
 
点击在新窗口查看全图
CTRL+鼠标滚轮放大或缩小
        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-23 10:28          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈
Montavista pro5.0 的实时性能



QUOTE:
实时性能
MontaVista Linux 提供的实时响应满足许多嵌入式应用软件要求。实时的优势再加上 MontaVista 开发的抢占内核技术,使得实时响应最差也可控制在 50 微秒的范围内。它满足甚至超过了大多数实时处理的要求。为了获得这样的性能,我们使用了许多的技术:用户空间实时性支持,优先级队列,优先继承,强健的 快速用户空间互斥( Futexes ),和使用 Ktimer 的高精度定时器 (HRT) 。通过 HRT ,程序员们可以用微秒级的精度实现时基和事件驱动算法,消除了轮流检测和循环占用的周期时间消耗。

这样看起来,Montavista用到目前2。6kernel提供的很多主流的技术。

下面就是要重点了解这些技术:


  • 用户空间实时性支持


  • 优先级队列

关键的是:

  • futexes
  • Ktimer

        顶部
查看 IP
超级版主
Rank: 8Rank: 8



UID 3
精华
积分 10
帖子 90
阅读权限 150
注册 2007-8-3
状态 离线
  
发表于 2007-8-23 12:21          添加 bobzhang 为MSN好友 通过MSN和 bobzhang 交谈
[tr=#2e2292][td]
<--  | 首页  | 站点地图  | 索引  | 搜索
[tr=#00ffff][td][/td][/tr][tr=#000000][td]
新闻 | 过往期刊 | 链接 | 关于LF
[size=-1]This document is available in: English  Castellano  ChineseGB  Deutsch  Francais  Nederlands  Russian  Turkce  


by Ismael Ripoll



目录:

  
实时Linux (RT-Linux) 摘要: 这篇文章讲述了实时Linux(RT)的基本概念。以及使用RT-Linux的硬实时。
_________________ _________________ _________________
  “实时”是什么?在介绍RT-Linux之前我们有必要先来大体看一下一些有关“实时”的思想。我们说: “一个实时系统首先是一个信息系统,它的正确性不仅仅依赖于算法的逻辑输出, 还依赖于产生这些逻辑输出的及时性。”
仅仅有正确的输出结果是不够的,输出结果还必须在一个特定的时间间隔内到来。 需要注意:在上面的定义中,一个实时系统并不是像人们很自然地想到的那样必须要快。 比方说:一个船只导航系统,由于它的速度很慢,并且人们经常有“充足” 的时间来对它的控制作出决定,所以初看起来可能不像一个实时系统。 但无论如何,根据我们的定义,它就是一个实时系统。
注意我们定义的是一个“实时系统”而不是一个“立即系统”。 一个立即系统通常非常快,并且可以给人很“现实”的印象。 典型地,所有的模拟器和交互式游戏都需要给用户一个连续的时间画面, 并且,在单位时间内能生成的图像越多越好。
下面我们来更详细地考虑一下“瞬时限制”的概念。 假设一个人想通过控制一个引擎的速率来应付不同的负载, 并假设他想使用一个PID(Proportional- Integral-Derivative)控制。 从我们的观点来看,PID控制就是一个函数,它接受一组参数 (在这个例子中是引擎的速率),并且返回一个能应用于引擎的控制信号的值, 根据这个值来对引擎施加相应的电压。PID算法设计背后的理论(顺便提一下它是多方面的) 假设计算时间是可以忽略不计的,也就是说,从读取引擎的速率到我们开始执行这一段时间很短。 正常情况下,系统允许有一段小的延迟。 这种类型的控制的另一个特性就是它必须周期性地执行。 换言之,PID算法必须按照一定的规则执行。 如果连续两次调用PID函数间隔的时间太长, 那么引擎可能会达到一个我们所不期望的速率。总的来讲: PID算法可以被看作一个程序,它必须周期性地执行(Pi); 从它开始执行直到结束所经过的时间绝对不能大于设计PID时指定的最大时间(Di), 并且,根据处理器的速度,PID代码也需要一个特定的时间(Ci) . 。
Pi:任务i的周期。
Di:任务i的最后期限。
Ci:任务i的最大(在最差情况下)计算时间。
如果系统是单任务的,那么做一个实时系统不存在任何问题: 处理器或者能在所需要的时间内完成任务,或者不能。 如果处理器不是足够快,那么我们只需要换一个快一些的CPU。
当系统是由多个任务组成的,并且需要为它们分配一个(或多个)处理器的处理能力时, “实时”问题就出现了。这阻碍了我们使用一个经典的分时系统,比方说Linux。 当然,绝没有必要去提那些诸如“不要在Windows上编写需要实时性的程序”之类的事了。 一个好一点的建议是:不要在那种平台上写任何类型的程序。
并不是所有的实时系统都是相同的: 控制一个汽车的ABS刹车系统或飞行器引擎的燃料注射系统和控制一个MPEG文件的解压及视觉效果是不同的。 在第一种情况下,执行时间的一个小的延迟就有可能危及驾驶员的生命安全或者会导致大量的物质损失。 而第二种情况只会引起系统质量的退化(图像可能会停住并可能丢失一些帧)。 第一种类型的系统被称作硬实时系统,第二种为软实时系统。 在此我们将集中讨论硬实时系统。
设计一个硬实时系统要经过几个阶段:首先, 要执行的任务和瞬时限制必须经过鉴定能满足我们的条件; 第二,编写代码,每一个实时任务都要经过测量和调度测试, 以保证在系统运行过程中每个任务都不能超过它所允许的时间最大值。 调度测试由应用于一系列测试的整个任务集组成, 如果能通过第二阶段的测试,就有可能保证没有任务可能会运行超过最大的期限。 如果测试不能通过的话,那么设计就必须重新从头开始: 选择一个快一点的CPU,或者使用其它的算法来实现这些任务。
总结起来,任务有三个时间标识:Pi,Di和Ci。系统的目标是, 保证所有的任务在所有的执行过程中都不超过系统允许的时间最大值。 为了保证运行时间,系统必须是可预测的。 说一个系统是一个实时系统和说一个系统是可预测的实际上是一样的。
  操作系统和实时系统有什么关系? 系统响应语义的正确性是程序员的责任,而瞬时的正确性依赖于操作系统(OS)。
操作系统必须能支持和组织所有任务的执行,处理中断也是它的职责。 操作系统必须提供:
  • 调度算法
  • 进程间通讯机制(信号量、消息等)
  • 中断处理
  • 在每一个周期内激活任务
与普通的操作系统不同,实时操作系统的目标是最大程度地减少复杂性。 我们不需要一个能做很多事情的系统,最重要的是它能在规定的时间内可预测地执行我们的任务。
在一个实时系统上,一个正常情况下需要10个单位时间的任务, 由于上下文环境的改变,在最坏的情况下消耗12的单位时间是可取的。 而在其它普通的操作系统上,一个平均情况下需要3个单位时间的程序经常会执行20个单位时间。
如果发现一个实时系统比普通的操作系统“慢”,我们不必感到奇怪。 有时候,为了获得可预测的行为,甚至需要禁止使用Cache, 这会带来一些性能上的丢失。对一个实时系统来说, 处理器Cache所提供的管道线单元和预言跳转算法是最大的敌人。


  POSIX的RT扩展 POSIX是可移植操作系统接口(Portable Operating System Interface)的首字母缩写(可是为什么OS这个缩写后面没有一个X呢?)。 这一标准意在期望获得源代码级的软件可移植性。 换句话说,为一个POSIX兼容的操作系统编写的程序, 应该可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行。 POSIX标准定义了操作系统应该为应用程序提供的接口:系统调用集。 POSIX是由IEEE (Institute of Electrical and Electronic Engineering) 开发的,并由ANSI (American National Standards Institute)和 ISO (International Standards Organisation)标准化。 很显然POSIX是基于UNIX的,大多数的操作系统(包括Windows NT)都倾向于开发它们的变体版本与POSIX兼容。
POSIX的定义被分为几个工作组:包括计算机厂商、软件公司、 政府部门和计算机设计师。每一个工作组关于操作系统的某一方面。 例如:POSIX.4组是关于实时方面的内容。
POSIX.4的扩展(1993年更名为1003.1b)允许一个操作系统在实时情况下使用。 很明显,这些扩展大部分都是关于时间管理和进程优先级, 也有一些系统调用来协助进行进程间通信。
POSIX扩展被设计用来增强操作系统对资源的管理控制能力。
Linux2.0为实时性实现了许多符合POSIX扩展的系统调用, 但Linux这一方面的内容我们将在以后进行讨论。 它的2.2版本基本上100%与POSIX 1003.1b兼容。
  实时LinuxRT-Linux是在新墨西哥矿业及科技学院计算机系由 Victor Yodaiken和Michael Barabanov开发出来的。 它是Michael提交的完成计算机科学硕士论文的一部分。 新最可用的版本是0.6。现在只用在INTEL体系结构的计算机上。
RT-Linux是用一种完全不同的方式解决这一问题的。 有别于修改Linux系统的内核以使其具有可预测性,它直接在处理器(i386) 上建立了一个具有一个调度器的小的核心(与Linux kernel相独立), Linux内核在这一核心上运行,并与其它实时任务分享处理器。 那么Linux与其它任务分享CPU,更精确地说,Linux是后台的任务, 只有没有其它实时任务执行的时候它才会运行。
我猜想读者现在可能困惑了,可能是因为有人想操作系统是一个整体, 怎么可以修改它?
更令人惊奇的是:事实上,如果作为一个模块编译的话, 你可以动态地装入和移除调度器。
与其它操作系统类似,作为同步方式或者为了实现临界区, Linux内核代码通常会关闭中断。如果在Linux关中断期间来了一个时钟中断, 它就会阻塞,这将导致丢失瞬时精确度。RT-Linux使用了一个非常优雅的解决方案: 所有对CLI、STI和IRET(修改中断状态的汇编调用)的调用都用 S_CLI、S_STI和S_IRET来代替和模拟,这样,Linux就永远不能禁止中断调用。
RT-Linux缺省的调度策略是抢占式、固定优先级的调度, 并对Linux任务赋予了较低的优先级。 如果实时任务消耗了所有的CPU时间,那么Linux任务将不能获得任何CPU时间, 看起来就像是停止了一样。
使用RT-Linux我们不仅有了一个实时系统,还有了一个经典的操作系统。 在采样和控制一个物理系统的同时我们还可以上网冲浪。
  RT-Linux的安装 这一发行版的文件可以在下面获得: .
为了把一个Linux系统改成RT-Linux, 我们必须把RT-Linux提供的内核补丁应用到内核源代码上并重新编译内核。 下面是编译的方法。我们假设rtlinux-0.6-2.0.33.tgz在目录/usr/src下, 并且它已被解压缩到/usr/src/rtlinux-0.6。 我们还假定所有的内核选项都已经配置(make config)好了。接下来
# cd /usr/src/linux# patch       -p1 <../rtlinux-0.6-2.0.33/kernel_path# make dep; make clean; make zlilo; make modules; make modules_install# reboot新内核跟一个普通的内核看起来没什么差别, 但它已经准备好转换为一个实时系统了。 在/usr/src/rtlinu-0.6-2.0.33/testing下有各种各样的演示程序。
除了发行版在testing目录中的例子,你还可以下载Oleg Subbotin为我们准备的另一个示例程序,它允许我们创建任务的执行记录。 这一示例的一个文件是一个修改了的调度器,它不仅能执行任务调度, 还能够发送关于任务决策的信息。这一信息被收集并存储于一个文件中, 以后可以图形化的显示。结果我们就可以看出各种任务是以什么顺序执行的, 具有高优先权的任务是如何抢占低优先级的任务的。Linux任务没有表现出来。
每一个任务都表现在一个水平轴上。长方形表示每一个任务占用CPU的时间 (因为我们使用一个单处理器的系统,所以在同一时刻只能有一个实例在运行), 在这个例子里,每一项任务的最大允许执行时间与他们的周期相同, 这一周期用一个时间间隔标记(用代表)。在这一间隔内任务必须执行完毕。 上面部分的任务具有较高的优先级,并且能从其它任务(如600位置)抢占处理器,
  RT-Linux的未来 现在已经有了一个多处理器的RT-Linux版本。为了尽可能地保持系统的可预见性, RT-Linux所能提供的服务被故意地限制的很少, 因为没有必要包含那些对实时性要求不严格的功能。
几周以前开始了一个RT-Linux手册-教程的编写工作。(本文文写于1998年:译者注)
  结论在RT-Linux出现以前,大多数需要实时系统的工程师被迫使用MS-DOS并且建立所有需要的驱动, 或者是以非常惊人的价钱购买一个真正的实时操作系统。 现在开发者们有了一个全功能的操作系统, 他们可以在与将要运行于其上的相同的系统上开发实时的程序。 实际上,我们在上网冲浪的同时再运行几个实时程序也没有问题。
我们这一系列以后的文章中会研究几个实时应用程序的例子, 以及如何编写我们自己的实时程序。

阅读(3250) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

iembedded2012-03-15 21:41:49

楼主,我是从linuxforum连接过来找到你的文章的,你的文章好多图都没法显示,请问你用的啥浏览器能显示?