分层结构软件各层次之间通信

来源:互联网 发布:石油计量表软件 编辑:程序博客网 时间:2024/06/06 20:17

对软件进行层次化分解通常是解决软件复杂性的一种手段,在操作系统、网络协议栈设计中屡见不鲜。

1. 当上层模块需要传递数据给下层模块时,调用一个函数或者过程即可­搞定。

2. 那么,反过来,当下层模块需要把数据传递给上层模块的时候,又当如何处理呢。

2.1 从网络协议栈的实现情况来看,似乎都是在下层模块中放一个队列,要递交到上层­模块的数据都按照FIFO的顺序丢在这个队列里面。这个队列对上层模块来讲是不可见的,当上层模块需要一个数据时,就调用下层模块中的函数,返回从这个队列头部­取出的数据。

2.2 也可以考虑在下层注册一个回调函数

3. “上层”永远处于主导地位。从概念上来说,应该是上层控制下层,下层没有管理上层的权利,那么上层不需要数据的时候,下层就算有数据想往上递交也白搭,下层不能驱使上层来做它想做的事情。

4. 以IO设备的驱动程序为例,显然,驱动程序是下层的,上层的代码调用驱动程序来实现一些具体的功能,比如程序操作一个网卡进行通讯。

那么上层可以发命令给下层send一个包,这个是简单的逻辑。复杂的逻辑就是,网卡驱动收到了包以后,怎么让上层程序知道。传统上,我们知道其实也就是两种方法­,第一种,上层不断的查询buffer看看是不是满了,满了就读出来。第二种,驱动接到数据后,发中断给操作系统(或者是发消息,看你站在那个层面去考虑了),­上层程序收到消息就去检查buffer。

5. 另外,通信行业中也常用到一个原语的概念。它是一种异步的、并行的这么一种请求方式。

一般来说,协议栈种经常可以看到这种设计: 
上层对下层发出请求:称作request原语(附带上层实例句柄);下层对上层请求的回复:称作confirm原语(附带下层实例句柄,如果有必要后续调用到下层实例的话)。下层对上层发出请求:称作indication原语(接收到的来自远程的请求,附带下层实例句柄);上层对下层请求的回复:称作response原语(附带上层实例句柄)

原语通信,意味着你发送一个请求后,对于对方(可能是上层、下层)是否成功执行请求,你是不知道的。甚至你都不知道对方是否接收到请求。每个原语都是如此。这就要求原语的设计必须是成对出现的。逻辑上,原语的设计原则类似这样。

实际程序中,原语对应的函数调用可以返回各种错误值,只是原语逻辑的是和非,不去通过函数返回值判断。

通信行业使用得很普遍。

转载地址:http://hi.baidu.com/olaputan/blog/item/727a9045b54a313786947320.html

0 0
原创粉丝点击