标签:
1:介绍:
传统意义上的即时系统是有经验的专家的领域,因为他们能处理多种定制的内核,非标准的并且大多数是低级的语言,供应商提供的定制的I/O接口。这就要求有一种新的java线程模型来解决这种状况,这种模型解决当前及时嵌入系统的四个缺陷:安全,性能,可移植性。程序调试时间。安全是当前编程语言和及时系统在复杂性与定义不清的接口上折中的办法,这些语法不能成为正式的保证系统安全的语法;性能受到威胁是因为工程师必须接受及时系统所提供的无论什么级别的操作,如果那些操作过高或过低都会导致非必要的日常开销;可移植性问题的上升是由于供应商提供的当前的工具,开发及时嵌入式系统的时间受到阻碍是由于缺少沟通处理器与硬件接口的开发工具。
我们介绍了CSP信道,是使用java提供的一种互联方式的沟通形式,它可以作为一个java类或者可以从我们的网站上下载(http://rt.el.utwente.nl/javapp(链接被墙或已失效)),利用java去开发及时系统被认为是具有破坏性的,这是由即时系统设计专家们提出的,因为即时系统在构建中体现了java的一部分缺陷。
Java主要的缺点在于:动态内存管理,线程模型,对于环境变化缺乏直接的的,负责的,及时的反应,可以总结为下面三点:
1:java包含几个动态的组件可以危害进程的deadline,例如,在java中,克隆的概念要求动态内存分配,并且是独立于内存回收,其他组件,像类加载器,网络方法也要使用动态内存管理,对于开发及时的嵌入式系统来说,行为具有决定性是很重要的,通常静态内存分配被使用,对于几个组工作在统一的垃圾回收上,想逃避垃圾回收是很难的。
2:java中监视器可以静态正确地运行,但活锁有被饿死的,同时也有可能因为添加特殊的时间限制导致出现死锁,通过《Java Threads in the Light of CSP》,java监视器是低效,危险的,在当前java监视器的实现中,当一个线程被另一个线程叫醒时,它位于序列化队列的最尾端,可能出现特殊的线程永远不会从队列中苏醒的状况,结果便是活锁无限的等待,被饿死,也因为这样,一个正确的实现方法必须被提供。
3:及时调度作为RTOS(real-time os)的一部分,并没有必要做一个及时的系统,一个及时的系统应该能对将要到来的刺激,譬如像时钟有所反应,java没有中断设备,因此必须实现 RTOS,在操作系统的层面上我们要解决许多事,另一方面,java也要体现它面向对象的特性。
我们已经开发了java线程沟通的类,可以解决上述的问题使用正式的方法,总的概念独立于数学运算代数,编程语言,运算器,这些技术包含正规的技术,他们已经在及时的嵌入式系统中被使用了很多年,使用这简洁的规则,在设计与实现中能避免活锁,饿死,死锁,这概念提供了开发一部分设计模式的可能性,使用这些方法我们能保证系统的行为,换一句话来说,正式的方法对于开发可靠地系统是必要的,我们限制我们使用CSP的概念在上述提到的及时问题中。
在这里,section 2才介绍CSP信道,关于开放源码的信道的使用我们将在section 3中介绍,在section 4介绍信道概念与及时行为,在section 5调度方法江北讨论,section 6总结在及时嵌入系统中CSP的使用方法。
2:信道编程:
CSP概念相比于java线程模型提供了不同的并发模型,被称为信道,通过进程间的沟通实现同步。
Java信道是中间的对象被活跃对象共享,线程还是进程,看他们以何种方式沟通信道是单向的,初始没有缓冲并且一直同步中,这是figure 1中描述的,活跃的对象只能读或写在信道上,在双方进程都准备好后就会开始沟通,进程被阻塞了直到沟通准备好了,同步,调度,物理数据被传输封装进入信道:
信道模型减少并发设计与实现之间的问题,figure 2代表在设计层面上的数据流模型:
在数据流图中,一个箭头的代表信道之间的响应,单向的代表输入与输出接口是可以循环的但在输入输出信道处理时单向的。
下面用代码做事例:
import cjt.*; public class Main { public static void main(String[] args) { Channel channel = new Channel(); ProcessA pa = new ProcessA(channel); ProcessB pb = new ProcessB(channel); } }
这里main()扮演者主调者,它声明了信道与进程,这种方法没有循环结构,相反地,更少的复杂的循环保存在进程中,这个main类代表一个处理器的并发编程,重要的是进程将保持不变并且信道拥有media与processor的信息。
在下面的两个例子中,我们列出了processA,processB,前者产生从0到9999这10000个数,然后processB将这10000个数输出到屏幕上:
import cjt.*; import java.io.IOException; public class ProcessA extends ProcessObject { ChannelOutput channel; public ProcessA(ChannelOutput out) { channel = out; start(); } public void run() { IntegerObject object = new IntegerObject(); SeqComposition seq = new SeqComposition(); try { while (object.value < 10000) { object.value++; channel.write(seq, object); } } catch (IOException e) { } catch (InterruptedException e) { } } }
Listing 2. Producer ProcessA.
import cjt.*; import java.io.IOException; public class ProcessB extends ProcessObject { ChannelInput channel; public ProcessB(ChannelInput in) { channel = in; start(); } public void run() { IntegerObject object = new IntegerObject(); SeqComposition seq = new SeqComposition(); try { while (object.value < 10000) { channel.read(seq, object); System.out.println(object.value); } } catch (IOException e) { } catch (InterruptedException e) { } } }
这个read(),write()方法包括两个参数seq,object。这个SeqComposition的实例seq,它指示了一序列化的行为read,write方法,这里存在ParComposition,AltComposition并行的行为。
信道是线程安全的对于大多数读与写,大多数的生产者与消费者会占用相同的信道,这个信道也表现为调度在不同的线程之间具有优先级,优先级可以通过沟通进行更改,自然地,一对一,多对一的关系可以被实现。
3:开放源码
信道的概念在java中超出了沟通,java开发套件没有框架直接调用硬件的支持,只能通过jni,jni过多会导致java平台的可移植性降低,信道便是定义一种抽象的方法控制设备,硬件,在面对对象上可以增加重用性,信道在处理进程之间将会使用共享的内存驱动,结果是进程与硬件之间是独立的:
为了避免为每一个外围设备,设备驱动开发特殊的信道,这个设备驱动我们可以连接驱动,就是那些硬件独立的对象能被送入信道,这个信道对象能够处理序列化和调度为数据传输提供保障,信道对象是硬件独立的,结果,这链接驱动将会从序列化,调度中分离出来,对它的编程也更简单。
当序列化被允许之后,这个read(),write()会进入线程对象,委托链接驱动,figure4表现了一个处理器在两个进程之间沟通,figure5展示了两个系统之间的通信:
声明一个信道使用了链接驱动:
Channel chan = new Channel(new MyLinkDriver());
硬件独立对象能在一个声明的信道中被发现。
4:实时方面:
对于现在的实时系统来说,时间是一个最为影响的要素,从需求角度看,我们只考虑极限时间,用户考虑只有当系统回应确定的刺激,不管响应被归档的后台程序还是前台程序,怎样调度相关的任务,并且需要什么样地执行控制器,从这一观点来看,时间是唯一的信号相关的,这环境图是数据流式的图,在环境图中,箭头是信道沟通发生的特殊时间,这使得信道对于及时系统更为重要。
信道概念提供实现及时要求如下:
1:java中的非确定性发生在克隆对象与对象序列化的时候,伴随着垃圾回收被避免,在使用信道的时候;
2:特殊的链接驱动可能会扩展时序安排通过信道的行为,一个链接文件包含一处缓冲可能减轻倒置问题的合并使用优先级安排;
3:对于符合优先级要求的进程导致了中断处理得哲学诞生;
4:信道能优化优先级相同的进程,同时也可以是优先级不同的。
5:嵌入的时间表:
线程的时间安排属于应用程序去并行地运行他的任务,因此,一个时间安排并不是操作系统所必需的;一个时间安排作为一个操作系统资源应该是多任务的,我们可以继承这一概念,一个操作系统也是一个并行的程序,换句话说,这里有许多时间安排在执行,也就是,不同的程序能单独地运行用它自己的方式,一个嵌入式的时间安排能将一个进程切换为多个不同的任务。一个并行的程序包含大量地对象,必须被安排,也就是说当前的程序需要被嵌入式的时间安排才能实现多线程。
6:总结:
即时系统中使用CSP信道设计提供一个框架能够清理使得程序员远离复杂的,非必要的编程任务,例如线程编程或时间安排,这里提出的方法对于死锁,饿死提出了解决方案,优先级的概念应该被认为是进程之间沟通的优先级而不是线程的优先级。
这种结果导致编程非常简单并且易于维护,最后的代码也与相同情况下的java代码类似,学过CSP之后便可以设计简单并拥有轻快的速度,这里有一个性能提升空间并且使得在及时系统中的java编程更加简单,而且java信道也不需要垃圾回收机制。(2014.4.11)
适用于即时系统并发编程的新的java线程模型,记我的第一篇英文翻译
标签:
原文地址:http://www.cnblogs.com/dslover/p/4303943.html