Mate 出自Philip Levis 的微型虚拟机

毫无疑问这个虚拟机并不成功,由于它把简单的事变复杂了,使用相似汇编形式的语言,使得编程更加复杂…… 固然Mate 也使得网络重编程变得可能,不过这点好处并不能弥补其带来的编程复杂性。不过,做者也说了,Mate 只是基础,他们还要设计高层次的程序设计语言和编程模型来支持更好的抽象编程

无论怎样,Mate 的想法很新颖,其将虚拟机引入WSN领域,从另外一个层面上增强了微型操做系统的功能,下面咱们就来看看Mate 到底长得是什么模样。
首先先上一段Mate 使用的源代码,直观的了解下使用Mate 编程的困难:
网络

pushc    1 # Push one onto operand stack
add # Add the one to the stored counter
copy # Copy the new counter value
pushc 7
and # Take bottom three bits of copy
putled # Set the LEDS to these three bits
halt

其中要说明的是,counter 在上述程序执行前已经存在于stack 中,执行过程当中堆栈的变化如图-1所示。
架构

image image image image image image
图-1 堆栈变化
工具

看见没有,差很少就是汇编,这样作编译器是方便设计了,基本上不用去管语义方面的内容。但没有高层抽象和适当的编程模型,若是让网络管理人员使用这样工具去管理网络……
使用这样的语言编写出代码,再通过编译器编译就好了Mate 能够执行的字节码,使用网络发送到安装有Mate 解释器的节点中,节点受到Receive Event 后,判断收到的Capsule 的版本是否比已有的版本新,若是新,则节点安装新的Capsule(含有一些名词,下文中会解释)。
优化

OK. First things first. Mate 是针对字节码大小与运行时功耗优化的,运行于WSN 网络中节点中的解释器。其主要带来的好处是使得节点网络重编程变得方便易行,还增强的操做系统所欠缺的系统保护功能(不会一个用户程序错误影响整个系统稳定性);此外,Mate 是基于TinyOS 的,其还隐藏了TinyOS 中关于同步的部分。也就是说,Mate 中执行的程序确定是同步好的,其实其就是将可能形成同步问题的部分设计成不能并行执行,好比说send 一个数据包,由于发送缓冲只有一个,若是没有同步那么好,有可能形成缓冲区被覆盖的状况,Mate 的策略就是Run  to finished. 感受没什么新鲜,事件驱动的系统设计原本就应该是这个样子。这里要注意的是,TinyOS 也是事件驱动的操做系统,但其并无强制用户在发送数据包时要等待发送成功,或是不容许其余进程不能写缓冲,而使用Mate 就从根本上杜绝了不一样步的状况,其send 指令强制等待send 结果,然后才能继续执行…… 操作系统

Mate 另外一大重要特色是基于堆栈。这么作的好处就是使得编译出的字节码很简洁,由于大部分指令中不含有操做数,操做数存在于堆栈之中。受传统CPU 设计影响,Mate 的堆栈设计是有上下文的。例如Arm 中的系统态、用户态、调试态等等,每一个上下文中都有专属的堆栈与PC 指针;与传统计算机系统须要手动在各个上下文中切换不一样,Mate 中使用哪一个上下文视乎因而哪一个Event 引起了Mate 的执行(TinyOS的基础知识这里就不补充了,须要的话能够看看[2])。其中总共有三种Events 能够触发Mate 运行,分别是:clock timers(定时执行的部分),message receptions 以及message send requests。嗯,上一张Mate 架构图解能够看得更清楚一些。.net

image

图-2 Mate系统架构设计

图-2中绿色标识的是引起Mate 执行的三个Events,每一个Event 都有属于本身的Context,而调用Subroutine 时就使用调用者的Context。指针

Capsules,这个概念让我想到龙珠…… 难道P.L也是龙珠饭?Mate 的程序被分解成一个个的Capsules 而每一个Capsule 又是由最多24条指令所组成(每条指令固定一个字节),这样就限制了每一个Capsule 的大小,使其可以在一个802.15.4的帧中进行传递。Capsules 之间经过Subroutine 进行相互调用,通常简单的应用彻底能够浓缩在一个Capsule 内。OK,说到这里确定会有疑问,怎么使用Capsule?其实上文中已经有了线索,经过三大事件“Clock”、“Send”和“Receive”由系统自动进行调用。那系统又是怎么判别来事件时该调用哪个Capsule 呢?很好,这就引出了Capsule 的类别,共有4种Capsule,分别是“message send  capsules”、“message receive capsule”、“timer capsule”和“subroutine capsule”。前三种对应三大事件,最后一种在Capsule 内部被调用,嗯,就是这个样子,具体怎么注册,怎么查找Capsule 要依实现而定了,但都应该不是很复杂。调试

总的来讲Mate 执行的是一种通用的程序设计语言设计出来的代码,但咱们真的须要这么通用的设计吗?可能并不必定,也许咱们只须要解释器能执行基本的Rules(专家系统)就好了,具体复杂的操做交由底层的Module来完成,但Mate 的设计对咱们的设计确定是有借鉴意义的。

差很少Mate 就是这个样子了,须要了解细节的能够去看原文[1],最后补充一句Mate 实际上是Maté 阿根廷的一种相似茶的饮料。

参考文献:

[1] Philip Levis, David Culler. Mate -- A tiny virtual machine for sensor networks. 2002 ACM 1-58113-574-2/02/0010
[2] Philip Levis, TinyOS Programming. http://csl.stanford.edu/~pal/pubs/tinyos-programming.pdf

相关文章
相关标签/搜索