毫無疑問這個虛擬機並不成功,由於它把簡單的事變複雜了,使用相似彙編形式的語言,使得編程更加複雜…… 固然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所示。
架構
看見沒有,差很少就是彙編,這樣作編譯器是方便設計了,基本上不用去管語義方面的內容。但沒有高層抽象和適當的編程模型,若是讓網絡管理人員使用這樣工具去管理網絡……
使用這樣的語言編寫出代碼,再通過編譯器編譯就好了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
圖-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