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 架构图解可以看得更清楚一些。

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

 

你可能感兴趣的:(Mate 出自Philip Levis 的微型虚拟机)