国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法

      文檔序號:6499171閱讀:293來源:國知局
      協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法
      【專利摘要】本發(fā)明提供一種協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法,協(xié)同并發(fā)式消息總線包括:信息獲取模塊、并行環(huán)形分配器、線性內(nèi)存塊、消息填充模塊、并行入隊器、消息隊列池、排隊順序管理器、入口映射表和系統(tǒng)堆棧。本發(fā)明提供的協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法,能夠有效克服現(xiàn)有“并發(fā)”實現(xiàn)技術(shù)的弱點,高效可靠地實現(xiàn)“并發(fā)”技術(shù)、并行編程,具有普適、廉價、高效、可靠、節(jié)能、復用、透明分布、微內(nèi)核、內(nèi)在支持對象技術(shù)等一系列優(yōu)點。
      【專利說明】協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法
      【技術(shù)領域】
      [0001]本發(fā)明屬于計算機【技術(shù)領域】,具體涉及一種協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法。
      【背景技術(shù)】
      [0002]眾所周知,軟件設計的終極目標為:真實世界是什么樣子,軟件就應當設計成什么樣子,從而實現(xiàn)通過軟件模擬真實世界的目的。由于真實世界是紛繁復雜地,如實地模擬真實世界往往并不容易。前人經(jīng)過多年的實踐發(fā)現(xiàn),軟件系統(tǒng)對真實世界的每個細節(jié)模擬得越逼真,軟件就越容易設計、理解與維護。由于面向?qū)ο缶幊陶鎸嵉啬M了現(xiàn)實世界的事物,容易理解、方便維護、容易變更,因此,面向?qū)ο缶幊倘〈嗣嫦蜻^程編程,成為目前主流的編程方式。
      [0003]然而,由于硬件成本等多種因素的限制,在現(xiàn)實世界中,無處不在的、多個對象同時動作的“并行”活動,在單臺計算機中,卻極少能夠真實模擬?,F(xiàn)代計算機軟件系統(tǒng)中,絕大部分都只呈現(xiàn)“偽并行”活動:從宏觀上看,一臺計算機能夠同時執(zhí)行多個任務、多個程序,若干對象同時在運行;但從微觀上看,在任一瞬間、任一時刻,則只有一個程序在運行。由于處理器速度非??欤趲讉€程序間來回快速切換,經(jīng)過稍長一段時間,我們就覺得這幾個程序是在同時執(zhí)行、同時活動。這種現(xiàn)象,通常稱之為“并發(fā)”,以區(qū)分嚴格意義上的“并行”活動。
      [0004]一般在操作系統(tǒng)等中低層軟件中,提供相應的并發(fā)技術(shù)實現(xiàn)機制,并對外提供專門的并發(fā)服務接口,以便上位程序能完成并發(fā)活動。上位應用程序,則調(diào)用這些并發(fā)服務接口,使自己呈現(xiàn)為一個或多個并發(fā)的任務。
      [0005]并發(fā)實體(任務、進程、線程、纖程等)間的調(diào)度操作(用于操作系統(tǒng)、軟件總線等),提供了并發(fā)技術(shù)的實現(xiàn)機制?,F(xiàn)代操作系統(tǒng)中,剝奪式調(diào)度是普遍采用的調(diào)度策略。但它具有若干致命弱點,試列舉如下:
      [0006](I)堆??臻g問題:剝奪式調(diào)度隨時可能打斷并發(fā)實體的執(zhí)行過程,因此需要保護與恢復并發(fā)實體運行環(huán)境(最少需要包含指令寄存器等),這需要RAM堆棧空間。在普通運行場合(如PC機),這個問題不突出。但在大量并發(fā)實體(如單片機在數(shù)千網(wǎng)絡連接)的情況下,問題將變得相當突出;在RAM稀缺的特殊場合(如WSN應用)下,調(diào)度將變?yōu)椴豢尚小?br> [0007](2)執(zhí)行效率問題:由于需要保護與恢復并發(fā)實體運行環(huán)境,這部分調(diào)代碼的執(zhí)行是必須增加的。在非常輕量級調(diào)度的情況(如TinyOS)下,相對于調(diào)度整體執(zhí)行時間,它所增加的執(zhí)行時間是非??捎^的,嚴重影響了輕量級調(diào)度的執(zhí)行效率。
      [0008](3)競爭共享問題:剝奪式調(diào)度隨時可能打斷并發(fā)實體的執(zhí)行過程,因此,所有并發(fā)實體間共享的數(shù)據(jù)與資源,都成為被競爭的對象,變成臨界資源。如果把所有的這些被競爭對象,都用臨界區(qū)或其它統(tǒng)一的通用措施保護起來,那么系統(tǒng)的整體運行效率將會降低到不可接受的程度。如果精心設計共享結(jié)構(gòu),只采用通用措施保護部分對象,則在編程與維護代碼時,稍不當心就會引發(fā)臨界資源競爭導致的時序故障(這類故障還特別難以重現(xiàn)與定位),對編程人員與維護人員的職業(yè)素養(yǎng)要求將會提高很多,提高了設計與維護成本,降低了系統(tǒng)可靠性。特別是對于大量無規(guī)律的共享并發(fā)數(shù)據(jù)(如上百個不同的特殊線程),在編程實踐中,一般開發(fā)人員都望而生畏,除非特別必要,均避而遠之。
      [0009](4)競爭復用問題:前述為了效率提升而進行優(yōu)化的數(shù)據(jù)共享設計,會帶來代碼復用性問題。由于針對項目的競爭環(huán)境,采用了針對性地消除競爭的共享數(shù)據(jù)保護代碼,這些代碼一般不具備普遍的通用性。即使對于其它非常相似的項目,也很有可能面對的是其它不同的數(shù)據(jù)競爭條件,因此,需要做出另外優(yōu)化的數(shù)據(jù)共享設計,不能直接復用原來模塊。
      [0010]TinyOS是加州大學伯克利分校(UC Berkeley)為無線傳感器網(wǎng)絡WSN(WirelessSensor Network)開發(fā)的微內(nèi)核操作系統(tǒng)。TinyOS的兩層調(diào)度方式為:任務調(diào)度與硬件事務調(diào)度。硬件事務調(diào)度由硬件中斷激活,可搶占普通任務,主要用于高優(yōu)先級的快速實時響應。它基本雷同于一般中斷處理程序,稍有出入的地方在于:它可以向任務調(diào)度發(fā)送信號,激活普通任務;同時,還能利用nesC關鍵字async的異步能力,直接調(diào)用進入到nesC構(gòu)件系統(tǒng)中,調(diào)用構(gòu)件中的命令處理函數(shù),并給構(gòu)件發(fā)送異步事件。
      [0011]TinyOS的基本任務為無參數(shù)函數(shù)。任務調(diào)度采用協(xié)同式的先進先出(FIFO)算法,任務之間互不搶占,沒有優(yōu)先級之分。一旦一個任務獲得了處理器,就一直運行到結(jié)束。一般用于對時間要求不高的應用,本質(zhì)上是一種延遲計算DPC(Deferred Procedure Call)機制。TinyOS 2.x調(diào)度器可由用戶定制與替換。
      [0012]如圖1所示,TinyOS 2.x核心PCB為一個固定長度的字節(jié)數(shù)組,組成一個FIFO就緒任務隊列、以及一個等待任務池。系統(tǒng)內(nèi)的每個任務均由一個字節(jié)的任務ID表示,編號為O?255,其中255表示空任務N0_TASK:即任務不存在。因此,系統(tǒng)內(nèi)最多可容納255個有效任務。具體某個應用系統(tǒng)中的實際任務數(shù),也即字節(jié)數(shù)組的實際長度,則在源代碼編譯期間,由編譯器自動生成。
      [0013]該字節(jié)數(shù)組存放的是任務就緒標志。如果某任務ID沒有收到事件,不需加入到FIFO就緒隊列中,則存放N0_TASK標志,進入等待任務池。如果該任務ID有事件發(fā)生,激活進入就緒態(tài),則該任務ID字節(jié)中存放的是下一個就緒任務,表示本ID已進入FIFO就緒任務隊列,等待執(zhí)行。
      [0014]激活任務ID并行入隊時,采用阻塞式的臨界區(qū)保護法。如果該ID已處于就緒態(tài),則返回忙標志,否則從隊尾加入到就緒隊列。由于僅有一個字節(jié)的ID入隊,因此臨界區(qū)能高速通過,不太影響中斷響應速度。這個算法可以避免一個ID多次入隊的潛在問題:如果同一 ID可占用多個字節(jié)位置,在某些情況下,可能會占滿字節(jié)數(shù)組,導致其它任務無法入隊而系統(tǒng)假死。
      [0015]就緒任務ID從隊首出隊時,同樣采用阻塞式的臨界區(qū)保護法。如果沒有就緒任務,則發(fā)信號給節(jié)電裝置,進入節(jié)電狀態(tài)。否則,檢索出該任務的入口地址,執(zhí)行該任務。因為調(diào)度器中僅有任務ID,不存在附加參數(shù),因此任務必須是無參數(shù)函數(shù)。同時,任務是協(xié)同式的,前面任務必須完全退出(此時堆棧為空)以后,才能執(zhí)行下一任務。因此,所有的任務都共享同樣的內(nèi)存堆棧空間。
      [0016]TinyOS 2.x所有基本任務均是無參數(shù)函數(shù),每個基本任務僅固定分配一個字節(jié)的任務ID,該字節(jié)存放任務就緒標志,沒有空間存放其它參數(shù)。所以,本質(zhì)上它只是一個信號燈系統(tǒng)。相較于可附帶若干參數(shù)的消息系統(tǒng)而言,有若干弱點,試列舉如下:
      [0017](I)任務不能攜帶入口參數(shù):任務退出執(zhí)行后,堆棧清空,同時信號燈系統(tǒng)無法攜帶或保存參數(shù)。因此,限制了任務的適用范圍。只能用額外的措施予以彌補。如:用任務實現(xiàn)的自計數(shù)模塊。
      [0018](2)任務信息不能統(tǒng)一管理:由于信號燈系統(tǒng)無法攜帶參數(shù),外部環(huán)境與各任務之間的信息交換方式,完全依賴于外部環(huán)境與各任務自行商定,沒有統(tǒng)一規(guī)范化的表示手段。因此,對于外部環(huán)境與任務、任務與任務之間交換的信息,不能直接用統(tǒng)一的手段收集、監(jiān)視、過濾、控制、管理。只能用額外的措施予以彌補。這對軟件系統(tǒng)的調(diào)試、測試、控制等,都是極大的限制。
      [0019](3)主動消息不能完全表達:由于信號燈系統(tǒng)無法攜帶參數(shù),信息交換方式需由環(huán)境與任務間另行商定,不是統(tǒng)一規(guī)范。發(fā)送出去的消息只能通知接收任務說有消息發(fā)生,但不能一次性完全表達完畢。因此,接收信息的任務需要依賴于特定的信息交換方式,采用拉(Pull)模式機制,通過函數(shù)調(diào)用方式,取回具體的信息內(nèi)容。對于實現(xiàn)完全可復用模塊、及完全透明的分布式計算系統(tǒng),這是一個致命的限制(理由后述),很難彌補。
      [0020]TinyOS 2.x在任務ID并行入隊與串行出隊時,均采用阻塞式的臨界區(qū)保護法。由于僅有一個字節(jié)的ID入隊,因此臨界區(qū)能高速通過,不太影響中斷響應速度與系統(tǒng)性能。這是由于它采用了非常簡易的信號燈機制。如果根據(jù)系統(tǒng)需求,要換用成消息機制,除了公知的阻塞型同步的死鎖、優(yōu)先級倒置、中斷不能加鎖、臨界區(qū)不能并發(fā)等問題以外,還存在有其它問題,試列出如下:
      [0021](I)實時性能問題:相較于單字節(jié)的任務ID,消息一般較長,入隊、出隊均需要較長時間,會導致臨界區(qū)執(zhí)行時間加長很多。在一般單片機系統(tǒng)中,臨界區(qū)保護一般由關中斷完成。這樣,會導致系統(tǒng)中斷響應速度變慢,影響系統(tǒng)實時性能,降低系統(tǒng)整體效率。
      [0022](2)硬件實現(xiàn)問題:在各處理器與各軟件系統(tǒng)上,實現(xiàn)并行入隊臨界區(qū)保護的技術(shù)手段變化多端,不容易導出簡潔、高效、統(tǒng)一的并行入隊模型。因此,不容易用硬件實現(xiàn)關鍵操作、輔佐并行入隊,無法提高執(zhí)行效率或帶來其它優(yōu)勢。
      [0023]TinyOS 1.x以及一般通用操作系統(tǒng),在其調(diào)度程序數(shù)據(jù)結(jié)構(gòu)中,均直接保存任務函數(shù)的入口地址。當調(diào)度程序選中該任務、完成必要準備工作后,就直接跳到該地址,以執(zhí)行任務代碼。相對于采用任務ID、以及ID地址映射表的方式,有若干缺點,試列舉如下:
      [0024](I)入口地址含義單一:不能蘊含其它有意義的信息(如靜態(tài)優(yōu)先級)。
      [0025](2)入口地址僅在單機內(nèi)有意義:跨越計算機后,該地址沒有任何意義。
      [0026]因此,對于要求完全透明的分布式并行任務計算,是一個致命的限制。
      [0027]TinyOS 2.x使用一個字節(jié)的基本任務ID,使得調(diào)度內(nèi)核簡潔高效。但這限制了它所能容納的最大任務數(shù)為255,對稍微大型、任務數(shù)更多的系統(tǒng),無法容納處理,影響系統(tǒng)伸縮性。
      [0028]TinyOS 2.x使用一個字節(jié)的基本任務ID,兼作為FIFO就緒隊列指針、以及任務就緒標志。這與其它絕大多數(shù)操作系統(tǒng)一樣,都具備有存放于RAM內(nèi)存中的非零長度的任務PCB表。具有若干弱點,試列舉如下:
      [0029](I)執(zhí)行效率問題:由于需要對任務PCB表進行各種操作(如把任務從等待態(tài)轉(zhuǎn)為就緒態(tài)),這部分調(diào)度代碼的執(zhí)行是必須增加的。在非常輕量級調(diào)度的情況(如TinyOS)下,相對于調(diào)度整體執(zhí)行時間,它所增加的執(zhí)行時間是額外的、比較可觀的,影響了輕量級調(diào)度的執(zhí)行效率。
      [0030](2)硬件實現(xiàn)問題:在各處理器與各軟件系統(tǒng)上,任務PCB表的內(nèi)容、實現(xiàn)的技術(shù)、優(yōu)化手段等各種措施千變?nèi)f化,不容易導出簡潔、高效、統(tǒng)一的并發(fā)技術(shù)實現(xiàn)模型。因此,不容易用硬件實現(xiàn)關鍵操作、輔佐并發(fā)的實現(xiàn),無法提高執(zhí)行效率或帶來其它優(yōu)勢。
      [0031](3)空間占用問題:由于有存放在RAM內(nèi)的任務PCB表,即便RAM使用量非常微小(如TinyOS 2.x本質(zhì)上可以用單個BIT位表征任務的等待態(tài)、就緒態(tài)),在RAM內(nèi)存稀缺的情況下(如WSN系統(tǒng)),如果存在成千上萬的大量任務(案例后述),會導致系統(tǒng)無法實現(xiàn)并發(fā)調(diào)度過程,成為致命的技術(shù)缺陷,限制了該技術(shù)的適用范圍。
      [0032]構(gòu)建TinyOS系統(tǒng)時,用nesC語言寫成構(gòu)件,通過接口規(guī)范進行構(gòu)件連接,并在程序編譯期間,用函數(shù)調(diào)用的方式進行靜態(tài)組裝。因此,在本質(zhì)上,其構(gòu)件對外公布的是函數(shù)名(鏈接期有效)與函數(shù)地址(運行期有效)。與公布ID的構(gòu)件方案對比,有不少弱點,試列舉如下:
      [0033](I)模塊模型不一致:TinyOS 2.x任務采用ID方案,而其構(gòu)件采用地址方案。二者不一致,存在2種模型,導致其系統(tǒng)基本模塊的模型復雜化。
      [0034](2)地址方案適應性弱:ID方案更容易跨語言、跨異質(zhì)系統(tǒng),普適性更好。
      [0035](3)地址方案難以動態(tài)適應:在代碼運行期內(nèi),除非特別維護,函數(shù)地址已無從追蹤。而預定義的ID構(gòu)件方案,更容易進行代碼的引用、更改、替換、維護,更容易實現(xiàn)單塊或整體代碼熱升級。
      [0036](4)函數(shù)地址僅在單機內(nèi)有意義:跨越計算機后,該地址沒有任何意義。因此,對于要求完全透明的分布式并行任務計算,是一個致命的限制。
      [0037]目前的TinyOS系統(tǒng)、結(jié)構(gòu)化編程、模塊化編程、面向?qū)ο缶幊?、?gòu)件化編
      程......等等各種技術(shù),在用小模塊鏈接組裝成更大模塊時,均采用函數(shù)調(diào)用的方式完
      成。這種方式有致命的缺陷,是在復雜軟件系統(tǒng)中,導致軟件模塊難以復用的最核心問題之一。下面詳細說明:
      [0038]為了敘述簡便,借用兩個術(shù)語,先簡單說明下:
      [0039]拉(Pull)模式和推(Push)模式,這兩個術(shù)語原本是用于表示互聯(lián)網(wǎng)上的一種信息傳播方式。拉(Pull),是指用戶主動瀏覽網(wǎng)站信息,把信息從自己感興趣的網(wǎng)站上(拉)取回來。推(Push),是指網(wǎng)站主動把消息發(fā)送(推)給某些特定的用戶。
      [0040]一個模塊,通過調(diào)用處于另外一個模塊中的函數(shù),獲得了結(jié)果。這個函數(shù)調(diào)用,也即信息獲取過程,類似于網(wǎng)上信息拉的過程,因此也稱之為拉模式。如果一個模塊是并發(fā)實體(線程等),給另外一個并發(fā)實體主動發(fā)送消息。這種發(fā)送消息的過程,類似于網(wǎng)上信息推送的過程,因此也稱之為推模式。
      [0041]拉模式與推模式,最重大意義的區(qū)別在于:每次拉的時候,用戶均需要指定拉取的對象、以及拉取(內(nèi)容)的具體條件;而每次推的時候,不需要用戶有任何動作(當然在此之前,需要做些一次性地工作,如預訂等等)。
      [0042]參看圖2,為采用拉模式工作的兩個模塊。D模塊代表被調(diào)用模塊,除了 D模塊之外的其他所有部分,是進行主動函數(shù)調(diào)用的模塊。為了對調(diào)用過程進行分析,對上面的調(diào)用模塊進行了功能等效的分解。
      [0043]圖中,In表示模塊所需要的輸入?yún)?shù)(消息),Out表示模塊所輸出的信息(消息),F(xiàn)模塊是該模塊必須完成的核心功能,B模塊是該模塊完成的另外一部分功能。因此,從本質(zhì)上說,F(xiàn)+B的功能是該模塊存在的意義所在。
      [0044]C模塊代表直接函數(shù)調(diào)用,相當于匯編的CALL指令,之后CPU的執(zhí)行權(quán)直接轉(zhuǎn)到了D模塊中。拉模式中,這是必須存在的環(huán)節(jié)。D模塊需要一定的參數(shù)Pm。該參數(shù)經(jīng)由A模塊:即參數(shù)變換后得到,在C模塊調(diào)用時,一并傳給D模塊。
      [0045]A模塊進行參數(shù)轉(zhuǎn)換,主要是對輸入?yún)?shù)In,結(jié)合其他變量1,進行參數(shù)格式轉(zhuǎn)換、匹配等工作,得到C模塊所必須的參數(shù)Pm、以及F模塊所必須的參數(shù)Pc。
      [0046]在某些情況下,為了得到參數(shù)Pm與Pc,A模塊中參數(shù)轉(zhuǎn)換必須要得到另外一部分信息Pb。這部分信息Pb,必須在先完成一部分模塊功能(B前置功能)的同時得到。因此,B模塊的前置功能是一個可能不存在的非必然模塊。但如果存在,則從A模塊獲得參數(shù)Pf,完成部分預定的模塊功能,然后回饋信息Pb給A模塊,同時,在F核心模塊需要的情況下,把可能的參數(shù)P提供給F模塊。
      [0047]從D模塊的被調(diào)用函數(shù)返回的信息0d,聯(lián)合有關變量2,被E模塊信息整理后,變換成F模塊能直接利用的參數(shù)Pr,傳遞給F核心功能模塊。
      [0048]F模塊在得到參數(shù)Pc、Pr、P之后,完成核心功能,獲得輸出信息Out。
      [0049]參數(shù)Pc、Pm有可能與參數(shù)In完全相同,這樣A模塊可能就不需要存在。D模塊進行被調(diào)用函數(shù)后返回的信息0d,有可能與參數(shù)Pr完全相同,這樣E模塊可能就不需要存在。C模塊的函數(shù)調(diào)用是在拉模式中必須存在的環(huán)節(jié)。
      [0050]如前所述,對于調(diào)用模塊來說,圖中A模塊中的參數(shù)變換、C模塊中的函數(shù)調(diào)用與模塊本身的功能毫無關系。純粹是因為工作在拉模式下,為了獲得信息Pr,而不得不放置其中的代碼。從模塊內(nèi)聚度角度觀察,它們的存在,降低了調(diào)用模塊的內(nèi)聚度。B模塊的前置功能,從純粹代碼復用與模塊內(nèi)聚的角度看,最好也能剝離出調(diào)用模塊。E模塊進行信息整理,某些情況下,為了滿足接口需求,也可以保留,但最好也能剝離。從設計角度看,一般也應該存在另外某種解決方案,將B模塊、E模塊均剝離出去。這樣,在不采用拉模式工作時,僅只剩下有F核心功能模塊,作為調(diào)用模塊的唯一代碼。這樣,就可達到模塊的最高復用性與移植性。
      [0051]如圖2所示,在拉模式中,最為致命的缺點是:不可分割、必須存在的C模塊的函數(shù)調(diào)用(否則就不是拉模式了)。由于C模塊必須明確列出函數(shù)名(或地址)與參數(shù)Pm,這部分代碼必須嵌入在調(diào)用模塊中。因此,在調(diào)用模塊被移植、復用時,不得不考慮D模塊對于調(diào)用模塊的影響。為了解決這個影響,典型的存在3種方法:
      [0052](I)不分析、不修改調(diào)用模塊及D模塊代表的被調(diào)用模塊,二者同時整體復用。
      [0053]這是最好的解決方案,移植復用代價最小,效率、可靠性最高。問題是,調(diào)用模塊及D模塊代表的被調(diào)用模塊,一般存在有其它下級模塊,除非把這所有的下級模塊(也就是從調(diào)用模塊開始的一棵子樹),全部整體移植復用,否則還是要面臨下級模塊的改編與適應問題。同時,新項目的業(yè)務邏輯能否恰好完整地需要這一整棵子樹,仍是一個大問題。這樣,子樹移植復用方案,適用范圍就大大變窄,僅在非常類似的項目中才合適,不具普適性。
      [0054](2)不分析、不修改調(diào)用模塊,僅模擬D模塊的輸入、輸出、以及相應功能。[0055]這種方式實現(xiàn)相對比較簡單,但也要熟悉D模塊所涉及到的專業(yè)業(yè)務知識與模型。如果這個專業(yè)知識比較跨越的話,這本身就是一個不小的負擔。
      [0056]同時,這個方案還有一個大麻煩是,留下一堆無用的廢代碼。浪費空間與時間,降低了代碼的時空效率。在系統(tǒng)比較復雜、且對時空效率要求較高時,這個問題更顯突出。極端情況下,往往會促使設計人員干脆另起爐灶、重新開發(fā),不能利用現(xiàn)有的模塊與代碼。
      [0057](3)分析、修改調(diào)用模塊,改變D模塊的輸入、輸出、以及功能,或者干脆取消。
      [0058]這種實現(xiàn)比較復雜,需要詳細了解并讀懂A模塊、B模塊、C模塊、E模塊及整個調(diào)用模塊的代碼邏輯,必須透徹了解調(diào)用模塊的專業(yè)業(yè)務知識與模型,以及,熟悉D模塊所涉及到的專業(yè)業(yè)務知識與模型。如果這2個專業(yè)知識比較跨越的話,它就是一個不小的負擔。同時,分析修改代碼,還與原來的可復用性設計密切相關。以往設計不良的代碼、或是經(jīng)過多次勉強維護后的代碼,會很混亂,復用性很差。往往會促使設計人員干脆另起爐灶、重新開發(fā),不能利用現(xiàn)有的模塊與代碼。

      【發(fā)明內(nèi)容】

      [0059]針對現(xiàn)有技術(shù)存在的缺陷,本發(fā)明提供一種協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法,能夠有效克服現(xiàn)有“并發(fā)”實現(xiàn)技術(shù)的弱點,高效可靠地實現(xiàn)“并發(fā)”技術(shù)、并行編程,具有普適、廉價、高效、可靠、節(jié)能、復用、透明分布、微內(nèi)核、內(nèi)在支持對象技術(shù)等一系列優(yōu)點。
      [0060]本發(fā)明采用的技術(shù)方案如下:
      [0061]本發(fā)明提供一種協(xié)同并發(fā)式消息總線,包括:信息獲取模塊、并行環(huán)形分配器、線性內(nèi)存塊、消息填充模塊、并行入隊器、消息隊列池、排隊順序管理器、入口映射表和系統(tǒng)堆棧;
      [0062]其中,所述信息獲取模塊用于從接收到的待處理的外部并行的消息中獲取目標算子ID以及消息長度值;其中,所述目標算子ID為處理所述消息的算子標識;同時用于獲取附加管理消息的附加管理消息長度值,然后計算所述附加管理消息長度值與獲取到的所述消息長度值的和,得到消息占用空間值;其中,所述附加管理消息長度值> O ;
      [0063]所述并行環(huán)形分配器為非阻塞式并行的空間環(huán)形分配器,用于根據(jù)所述信息獲取模塊獲取到的所述消息占用空間值,按環(huán)形劃分原則連續(xù)動態(tài)的劃割所述線性內(nèi)存塊,非阻塞式并行地得到與消息占用空間值相同的空白消息槽;
      [0064]所述消息填充模塊用于將所述消息及所述附加管理消息填充到所述并行環(huán)形分配器分配的所述空白消息槽,得到非空白消息槽;
      [0065]所述并行入隊器用于對所述空白消息槽或所述非空白消息槽進行非阻塞式并行入隊操作;
      [0066]所述消息隊列池用于緩存尚未處理的已入隊消息;
      [0067]所述排隊順序管理器用于根據(jù)預設調(diào)度策略從所述消息隊列池中選擇需處理的指定消息,對所述指定消息進行協(xié)同的出隊操作;
      [0068]所述入口映射表,根據(jù)所述目標算子ID查找所述入口映射表,獲得與所述目標算子ID對應的函數(shù)入口地址;根據(jù)所述函數(shù)入口地址以及所述指定消息的指定消息槽地址,調(diào)用對應的算子執(zhí)行函數(shù),從而處理出隊的所述指定消息;[0069]所述系統(tǒng)堆棧為所述消息總線中所有算子共享的堆棧空間;各個算子所共享的系統(tǒng)堆??臻g相互覆蓋,為重疊式,即非層疊式;
      [0070]并且,所述消息總線內(nèi)的算子僅具有就緒狀態(tài),即使當所述消息總線內(nèi)不存在任何消息時,所述消息總線內(nèi)的算子仍處于就緒狀態(tài);一旦當所述消息總線內(nèi)到達消息時,且當該消息所對應的算子被調(diào)度時,被調(diào)度到的算子立即獲得處理器。
      [0071 ] 優(yōu)選的,所述消息為定長消息或變長消息。
      [0072]優(yōu)選的,當所述并行環(huán)形分配器在所述線性內(nèi)存塊的最末端劃割空白消息槽時,如果所述線性內(nèi)存塊最未端剩余的空閑空間小于所述消息占用空間值,則直接舍棄所述最未端剩余的空閑空間,所述最未端剩余的空閑空間形成廢棄槽。
      [0073]優(yōu)選的,所述消息填充模塊首先將所述消息及所述附加管理消息填充到所述并行環(huán)形分配器分配的所述空白消息槽,得到非空白消息槽;然后所述并行入隊器對所述非空白消息槽進行非阻塞式并行入隊操作具體為:
      [0074]所述并行環(huán)形分配器配置有第一頭指針和第一尾指針,當需要分配新的空白消息槽時,直接在當前位置的第一尾指針后面劃出與所述消息占用空間值相同的空間,得到所述新的空白消息槽,然后再將所述第一尾指針非阻塞式并行移動到所述新的空白消息槽的尾部;
      [0075]所述并行入隊器配置有第二頭指針和第二尾指針;通過非阻塞式并行移動所述第二尾指針實現(xiàn)對所述非空白消息槽進行非阻塞式并行入隊操作;
      [0076]其中,所述并行環(huán)形分配器配置的第一頭指針和第一尾指針不同于所述并行入隊器配置的第二頭指針和第二尾指針。
      [0077]優(yōu)選的,所述并行入隊器首先對所述空白消息槽進行非阻塞式并行入隊操作,然后所述消息填充模塊再向入隊的所述空白消息槽填充所述消息及所述附加管理消息具體為:
      [0078]所述并行環(huán)形分配器與所述并行入隊器共用相同的頭指針和尾指針,當所述并行環(huán)形分配器從所述線性內(nèi)存塊中分配出空白消息槽的同時,該空白消息槽也被所述并行入隊器執(zhí)行了入隊操作;然后所述消息填充模塊再向入隊的所述空白消息槽填充所述消息及所述附加管理消息。
      [0079]優(yōu)選的,在搶先環(huán)境下,在所述并行環(huán)形分配器從所述線性內(nèi)存塊中分配出空白消息槽之前,預先使所述空白消息槽處于休眠狀態(tài),其中,處于休眠狀態(tài)的空白消息槽稱為休眠消息槽;然后所述消息填充模塊向所述休眠消息槽中填充所述消息及所述附加管理消息,當填充完成之后,所述休眠消息槽被激活時,即轉(zhuǎn)變?yōu)榛钴S狀態(tài),其中,處于活躍狀態(tài)的消息槽稱為活躍消息槽;其中,休眠消息槽為不會被所述消息總線調(diào)度給算子執(zhí)行的消息槽;活躍消息槽為屬于所述消息總線正常調(diào)度范圍的消息槽。
      [0080]優(yōu)選的,采用變長消息時,通過消息槽中寫入的消息長度參數(shù)是否為O區(qū)分所述休眠消息槽和活躍消息槽;當所述消息槽中寫入的消息長度參數(shù)為O時,該消息槽為所述休眠消息槽;當所述消息槽中寫入的消息長度參數(shù)不為O時,該消息槽為所述活躍消息槽。
      [0081]優(yōu)選的,還包括:監(jiān)控管理中心;所述監(jiān)控管理中心用于對所述消息總線內(nèi)部的消息,進行集中監(jiān)視、分析、控制、過濾和管理。
      [0082]優(yōu)選的,還包括:空間回收模塊;所述空間回收模塊用于回收所述消息總線內(nèi)的出隊后的消息本身以及所述消息槽。
      [0083]優(yōu)選的,還包括:節(jié)電裝置;所述節(jié)電裝置用于:當所述消息總線內(nèi)不存在消息時,立即通知使用本消息總線的應用系統(tǒng)進行節(jié)能調(diào)度。
      [0084]本發(fā)明還提供一種應用上述的協(xié)同并發(fā)式消息總線的主動構(gòu)件組裝模型,所述主動構(gòu)件組裝模型為集合P = {第I層主動構(gòu)件、第2層主動構(gòu)件子集合...第η層主動構(gòu)件子集合},其中,η > 2 ;所述第η層主動構(gòu)件子集合中的各主動構(gòu)件基于第η層虛擬消息總線進行構(gòu)件組裝,得到第n-Ι層主動構(gòu)件子集合中的單個主動構(gòu)件;所述第n-Ι層主動構(gòu)件子集合中的各主動構(gòu)件基于第n-Ι層虛擬消息總線進行構(gòu)件組裝,得到第η-2層主動構(gòu)件子集合中的單個主動構(gòu)件;以此類推,直到所述第3層主動構(gòu)件子集合中的各主動構(gòu)件基于第3層虛擬消息總線進行構(gòu)件組裝,得到第2層主動構(gòu)件子集合中的單個主動構(gòu)件;所述第2層主動構(gòu)件子集合中的各主動構(gòu)件基于權(quán)利要求1-10任一項所述的消息總線進行構(gòu)件組裝,得到所述第I層主動構(gòu)件;
      [0085]其中,所述集合P中的各層各個所述主動構(gòu)件符合相同的協(xié)議。
      [0086]優(yōu)選的,所述集合P中第I層主動構(gòu)件包括:所述消息總線、接口算子ID映射表、別名鏈接表以及一個以上的算子;其中,所述接口算子ID映射表用于存儲接口算子ID與入口函數(shù)的對應關系;所述別名鏈接表用于存儲引用算子ID與所述接口算子ID的對應關系;其中,所述接口算子ID為所述主動構(gòu)件自身的算子標識;所述引用算子ID為掛接在所述消息總線上的主動構(gòu)件內(nèi)部的算子標識;
      [0087]所述集合P中第2層主動構(gòu)件子集合到第η層主動構(gòu)件子集合中的各個主動構(gòu)件分別包括:所述虛擬消息總線、所述接口算子ID映射表、所述別名鏈接表以及一個以上的算子。
      [0088]優(yōu)選的,所述第η層主動構(gòu)件子集合中的各主動構(gòu)件基于第η層虛擬消息總線進行構(gòu)件組裝,得到第n-Ι層主動構(gòu)件子集合中的單個主動構(gòu)件,其中,n ^ 3具體為:
      [0089]所述第η層主動構(gòu)件子集合中的各主動構(gòu)件分別包括第η層虛擬消息總線、第η層接口算子ID映射表、第η層別名鏈接表以及一個以上的第η層算子;進行構(gòu)件組裝后得到的第n-Ι層主動構(gòu)件子集合中的單個主動構(gòu)件包括第n-Ι層虛擬消息總線、第n-Ι層接口算子ID映射表、第n-Ι層別名鏈接表以及一個以上的第n-Ι層算子;
      [0090]在進行構(gòu)件組裝時,將各個所述第η層虛擬消息總線進行總線融合,得到第n-Ι層虛擬消息總線;將各個所述第η層接口算子ID映射表進行表格融合,得到第n-Ι層接口算子ID映射表;將各個所述第η層別名鏈接表進行表格融合,得到第n-Ι層別名鏈接表;將各個所述第η層算子進行融合,得到第n-Ι層算子。
      [0091] 優(yōu)選的,所述第2層主動構(gòu)件子集合中的各主動構(gòu)件基于所述的消息總線進行構(gòu)件組裝,得到所述第I層主動構(gòu)件具體為:
      [0092]所述第2層主動構(gòu)件子集合中的各主動構(gòu)件分別包括所述第2層虛擬消息總線、第2層接口算子ID映射表、第2層別名鏈接表以及一個以上的第2層算子;進行構(gòu)件組裝后得到的第I層主動構(gòu)件包括所述消息總線、第I層接口算子ID映射表、第I層別名鏈接表以及一個以上的第I層算子;
      [0093]在進行構(gòu)件組裝時,將各個所述第2層虛擬消息總線進行總線融合,得到所述消息總線;將各個所述第2層接口算子ID映射表進行表格融合,得到第I層接口算子ID映射表;將各個所述第2層別名鏈接表進行表格融合,得到第I層別名鏈接表;將各個所述第2層算子進行融合,得到第I層算子。
      [0094]優(yōu)選的,所述別名鏈接表存儲的所述引用算子ID與所述接口算子ID的對應關系為等值映射關系。
      [0095]本發(fā)明還提供一種對上述得到的所述的主動構(gòu)件組裝模型進行構(gòu)件拆分方法,包括以下步驟:
      [0096]預先設定構(gòu)件拆分規(guī)則,當所述主動構(gòu)件組裝模型滿足所述構(gòu)件拆分規(guī)則時,按所述構(gòu)件拆分規(guī)則拆分所述主動構(gòu)件組裝模型。
      [0097]優(yōu)選的,所述構(gòu)件拆分規(guī)則為:當所述消息總線的調(diào)度程序由兩個以上內(nèi)核或處理器執(zhí)行時,將所述消息總線分裂為與所述內(nèi)核數(shù)量或所述處理器數(shù)量相同的分布式的對等的子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件分別掛接到對應的所述子總線上;或者
      [0098]所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)件的負荷,根據(jù)預設的負載均衡原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件或算子分別掛接到對應的所述子總線上;或者
      [0099]所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)件的能效t匕,根據(jù)預設的節(jié)能原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件或算子分別掛接到對應的所述子總線上;或者
      [0100]所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)件的失效率,根據(jù)預設的可靠性原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件或算子分別掛接到對應的所述子總線上。
      [0101]本發(fā)明的有益效果如下:
      [0102]本發(fā)明提供的協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法,能夠有效克服現(xiàn)有“并發(fā)”實現(xiàn)技術(shù)的弱點,高效可靠地實現(xiàn)“并發(fā)”技術(shù)、并行編程,具有普適、廉價、高效、可靠、節(jié)能、復用、透明分布、微內(nèi)核、內(nèi)在支持對象技術(shù)等一系列優(yōu)點。
      【專利附圖】

      【附圖說明】
      [0103]圖1為現(xiàn)有技術(shù)提供的TinyOS 2.x基本任務調(diào)度器的結(jié)構(gòu)示意圖;
      [0104]圖2為現(xiàn)有技術(shù)提供的拉模式下函數(shù)調(diào)用等效模型示意圖;
      [0105]圖3為本發(fā)明提供的協(xié)同并發(fā)式消息總線的通用模型示意圖;
      [0106]圖4為本發(fā)明提供的協(xié)同并發(fā)式消息總線的一種具體應用模型示意圖;
      [0107]圖5為本發(fā)明提供的一種構(gòu)件組裝實例示意圖。
      【具體實施方式】
      [0108]以下結(jié)合附圖對本發(fā)明進行詳細說明:
      [0109]如圖3所示,本發(fā)明提供一種協(xié)同并發(fā)式消息總線,本消息總線的并發(fā)通用模型是:并行入隊、協(xié)同出隊,即多入單出模型。消息在進入消息隊列池之前,都屬于非阻塞式并行操作;進入消息隊列池之后,屬于協(xié)同式串行操作。具體包括:信息提取模塊、并行環(huán)形分配器、線性內(nèi)存塊、消息填充模塊、并行入隊器、消息隊列池、排隊順序管理器、入口映射表和系統(tǒng)堆棧。以下對上述各部件詳細說明:
      [0110](一)信息獲取模塊
      [0111]信息獲取模塊用于從接收到的待處理的外部并行的消息中獲取目標算子ID以及消息長度值;其中,所述目標算子ID為處理所述消息的算子標識。同時用于獲取附加管理消息的附加管理消息長度值,然后計算所述附加管理消息長度值與獲取到的所述消息長度值的和,得到消息占用空間值;其中,所述附加管理消息長度值> O。
      [0112]需要說明的是,本發(fā)明中采用的算子一詞為英文計算機術(shù)語Actor的意譯,一般翻譯為“角色”。個人覺得借用數(shù)學里的“算子”這一概念,能更精確地表征Actor的含義。因此在本文中,均采用“算子”這一術(shù)語作為英文Actor的中文譯詞。
      [0113]從調(diào)度效率看,算子是一個比任務、進程、線程更為輕量級的并發(fā)實體,比回調(diào)函數(shù)更重量級一些。相當于纖程、協(xié)程,比纖程、協(xié)程略微輕量級一點。本發(fā)明中,消息總線內(nèi)的算子僅具有就緒狀態(tài),即使當所述消息總線內(nèi)不存在任何消息時,所述消息總線內(nèi)的算子仍處于就緒狀態(tài);一旦當所述消息總線內(nèi)到達消息時,且當該消息所對應的算子被調(diào)度時,被調(diào)度到的算子立即獲得處理器。
      [0114]其中,目標算子ID可以簡單地按順序分發(fā)排列,也可以隱含一些其它意義,如:優(yōu)
      先級、固定服務號、分布式ID號......等。例如:可以簡單地將目標算子ID分為兩部分:
      外部總線節(jié)點號和消息總線內(nèi)的算子號。通過該種結(jié)構(gòu),只需簡單替換掉引用的某目標算子ID,就能輕松放棄引用本地算子、轉(zhuǎn)而引用存在于另外一個外部節(jié)點上的算子,實現(xiàn)透明的分布式計算與轉(zhuǎn)移。更復雜的劃分方法,甚至可以借用類似于Internet網(wǎng)的IP地址劃分概念,實現(xiàn)更復雜的分布式應用邏輯。
      [0115]在實用的消息總線中,消息中的目標算子ID,一般會隱藏有其它有用的信息(如外部節(jié)點號)。因此,需要把正確的本地目標算子ID明確地轉(zhuǎn)換提取出來。消息內(nèi)部包含的其它若干參數(shù),也有可能需要進行統(tǒng)一的格式匹配與轉(zhuǎn)換。因此,需要進行參數(shù)提取與格式轉(zhuǎn)換。正常結(jié)果是,得到一個正確的目標算子ID,以及消息(槽)的首地址。
      [0116](二)并行環(huán)形分配器
      [0117]并行環(huán)形分配器為非阻塞式并行的空間環(huán)形分配器,用于根據(jù)所述信息獲取模塊獲取到的所述消息占用空間值,按環(huán)形劃分原則連續(xù)動態(tài)的劃割所述線性內(nèi)存塊,非阻塞式并行地得到與消息占用空間值相同的空白消息槽。
      [0118]當存在多個待入隊消息時,則并行環(huán)形分配器動態(tài)的將線性內(nèi)存塊劃分成多個消息槽(Slot),每個消息槽正好容納一條完整的消息,當然,根據(jù)實際需求,消息槽中也可以容納系統(tǒng)管理用的其它附加信息。這些消息槽被相鄰連續(xù)地分配與回收。因此,從邏輯上看,線性內(nèi)存塊變成了環(huán)形的槽空間。當所述并行環(huán)形分配器在所述線性內(nèi)存塊的最末端劃割空白消息槽時,如果所述線性內(nèi)存塊最未端剩余的空閑空間小于所述消息占用空間值,則直接舍棄所述最未端剩余的空閑空間,所述最未端剩余的空閑空間形成廢棄槽,從而保證每個消息槽所使用的空間是平面、線性、不繞回的,使得算子與應用程序?qū)Σ劭臻g的邏輯視圖簡潔、干凈、自然。
      [0119]該并行環(huán)形分配器是一個高效、簡潔的非阻塞式并行的空間環(huán)形分配器,相對于阻塞式分配器,消除了死鎖、優(yōu)先級倒置、中斷不能加鎖、臨界區(qū)不能并發(fā)等問題;用免費的純軟件方法,實現(xiàn)無鎖分配;用廉價的硬件方法,實現(xiàn)高效率的單條匯編指令的無等待分
      配。具體的,可以利用中斷屏蔽、CAS/CAS2、LL/SC處理器原語......等,用純軟件方法,
      通過無鎖(Lock-Free)算法進行分配;也可以利用硬件,直接實現(xiàn)同樣的功能,得到無等待(Wait-Free)算法的效果,同時獲得高效率分配的效果:一條匯編指令即可完成空間分配。用純軟件實現(xiàn)的無鎖算法留待后述。
      [0120](三)線性內(nèi)存塊
      [0121]該線性內(nèi)存塊作為消息緩存區(qū),應該足夠大?,F(xiàn)代的常規(guī)應用程序中,除了固定長度的內(nèi)存分配外,常用的行為邏輯與指導準則為:將剩余的內(nèi)存RAM空間全部分配作為堆棧空間。與此相對應,在使用本發(fā)明提供的消息總線的應用系統(tǒng)中,應該反過來首先固定應用系統(tǒng)的堆棧大小、然后將剩余的內(nèi)存RAM空間全部分配作為消息緩存區(qū)。這是因為,大量并發(fā)的算子Actor是組成本系統(tǒng)的主體,因此存在大量不確定的消息,需要大量不確定的消息緩存。而與此同時,在本應用系統(tǒng)中,每個算子所調(diào)用的函數(shù)層次不是特別多,并且一般都只是很簡單的直接調(diào)用,而所有算子的堆棧空間都是因為協(xié)同執(zhí)行而相互重疊的,因此能輕松估計出所需要使用到的最大RAM堆??臻g,因此可以作為固定長度的RAM內(nèi)存進行分配。
      [0122]如果消息緩存區(qū)不夠大,導致應用系統(tǒng)在運行期間溢出,則將無法再接收新消息入隊,而導致系統(tǒng)故障或者崩潰。則該錯誤的處理原則是:由該應用系統(tǒng)自行負責處理;或者重新擴大消息緩存區(qū),或者修改應用系統(tǒng)的處理邏輯,或者直接讓應用系統(tǒng)停
      機......等等。這與現(xiàn)代的常規(guī)應用程序?qū)ο到y(tǒng)堆棧溢出的故障處理方案完全類似。通過
      采用這樣的邏輯與機制,使得本消息總線卸下了一個本來就應該由用戶自行擔保的責任:無條件地保證應用系統(tǒng)不被大批量數(shù)據(jù)沖垮。從而大大簡化了本消息總線的設計邏輯與代碼,獲得最廣泛的軟硬件適應性與移植性。
      [0123]為了增加消息總線的普適性,對于消息總線上傳輸?shù)南⒌膬?nèi)部結(jié)構(gòu),本發(fā)明只做出最少量的規(guī)定:消息分為定長消息和變長消息;對于定長消息的應用系統(tǒng),一般用于相對特殊的應用環(huán)境,如ATM交換機等等類似場合。對于變長消息應用系統(tǒng),應用最為廣泛,具有最普遍的使用價值。
      [0124]對于定長消息和變長消息,均必須包含目標算子ID ;另外,對于定長消息,消息長度值由具體應用系統(tǒng)及其消息總線自行定義,不必明確地出現(xiàn)在消息結(jié)構(gòu)中;對于變長消息,消息長度值則必須明確地出現(xiàn)在消息結(jié)構(gòu)中。消息長度值與目標算子ID本身的長度,與處理器字長密切相關,由具體應用系統(tǒng)及其消息總線自行定義,一般推薦為1、2、4、8、16等字節(jié),但并不強行規(guī)定采用哪種長度。單條消息的總長度、其內(nèi)部是否包含其它管理信息(如動態(tài)優(yōu)先級)......等等,也是由具體應用系統(tǒng)及其消息總線自行定義。
      [0125](四)消息填充模塊
      [0126]所述消息填充模塊用于將所述消息及所述附加管理消息填充到所述并行環(huán)形分配器分配的所述空白消息槽,得到非空白消息槽。
      [0127]在并行環(huán)形分配器為并行的任一消息i進行空間分發(fā)、分配消息槽以后,該消息槽空間即被該消息私人占有。因此,可以對該消息槽任意處理。此時,即可進行消息填充操作。此階段即使具有非常長的時間延遲,對系統(tǒng)其它部分也毫無影響。
      [0128]具體的,消息填充模塊可以采用下列兩種方案進行消息填充:[0129](一 )第一種方案:先填充、后入隊:
      [0130]具體的,消息填充模塊首先將所述消息及所述附加管理消息填充到所述并行環(huán)形分配器分配的所述空白消息槽,得到非空白消息槽;然后所述并行入隊器對所述非空白消息槽進行非阻塞式并行入隊操作具體為:
      [0131]所述并行環(huán)形分配器配置有第一頭指針和第一尾指針,當需要分配新的空白消息槽時,直接在當前位置的第一尾指針后面劃出與所述消息占用空間值相同的空間,得到所述新的空白消息槽,然后再將所述第一尾指針非阻塞式并行移動到所述新的空白消息槽的尾部;
      [0132]所述并行入隊器配置有第二頭指針和第二尾指針;通過非阻塞式并行移動所述第二尾指針實現(xiàn)對所述非空白消息槽進行非阻塞式并行入隊操作;
      [0133]其中,所述并行環(huán)形分配器配置的第一頭指針和第一尾指針不同于所述并行入隊器配置的第二頭指針和第二尾指針。
      [0134]( 二)第二種方案:先入隊、后填充:
      [0135]并行入隊器首先對所述空白消息槽進行非阻塞式并行入隊操作,然后所述消息填充模塊再向入隊的所述空白消息槽填充所述消息及所述附加管理消息具體為:
      [0136]所述并行環(huán)形分配器與所述并行入隊器共用相同的頭指針和尾指針,當所述并行環(huán)形分配器從所述線性內(nèi)存塊中分配出空白消息槽的同時,該空白消息槽也被所述并行入隊器執(zhí)行了入隊操作;然后所述消息填充模塊再向入隊的所述空白消息槽填充所述消息及所述附加管理消息。
      [0137]另外,在搶先環(huán)境下,在所述并行環(huán)形分配器從所述線性內(nèi)存塊中分配出空白消息槽之前,預先使所述空白消息槽處于休眠狀態(tài),其中,處于休眠狀態(tài)的空白消息槽稱為休眠消息槽;然后所述消息填充模塊向所述休眠消息槽中填充所述消息及所述附加管理消息,當填充完成之后,所述休眠消息槽被激活時,即轉(zhuǎn)變?yōu)榛钴S狀態(tài),其中,處于活躍狀態(tài)的消息槽稱為活躍消息槽;其中,休眠消息槽為不會被所述消息總線調(diào)度給算子執(zhí)行的消息槽;活躍消息槽為屬于所述消息總線正常調(diào)度范圍的消息槽。
      [0138]一般采用在消息槽中增加管理標志的辦法區(qū)分休眠消息槽與活躍消息槽。作為一種簡化方式,可以將管理標志隱藏在其它信息中,從而節(jié)省RAM空間。例如:采用變長消息時,有用的消息長度肯定不為零;因此,可以約定,通過消息槽中寫入的消息長度參數(shù)是否為O區(qū)分所述休眠消息槽和活躍消息槽;當所述消息槽中寫入的消息長度參數(shù)為O時,該消息槽為所述休眠消息槽;當所述消息槽中寫入的消息長度參數(shù)不為O時,該消息槽為所述活躍消息槽。這樣,只要把消息長度參數(shù)瞬間寫入到消息槽中,即可激活該消息槽。
      [0139](五)并行入隊器
      [0140]并行入隊器用于對所述空白消息槽或所述非空白消息槽進行非阻塞式并行入隊操作。
      [0141]具體的,并行入隊器是消息并行轉(zhuǎn)串行的關鍵部件,需要非常小心翼翼編碼操作的相互搶占的并行行為,過此而后,轉(zhuǎn)為非常輕松的協(xié)同的串行行為。由于本消息總線是一個多入單出模型,因此并行入隊器在具體實現(xiàn)時,多數(shù)應用場合下,都能根據(jù)實際情況簡化實現(xiàn)模型。
      [0142]并行入隊器是一個高效、簡潔的非阻塞式并行入隊的部件,相對于阻塞式入隊器,消除了死鎖、優(yōu)先級倒置、中斷不能加鎖、臨界區(qū)不能并發(fā)等問題;用免費的純軟件方法,實現(xiàn)無鎖入隊;用廉價的硬件方法,實現(xiàn)高效率的單條匯編指令的無等待入隊。具體的,可以利用中斷屏蔽、CAS/CAS2、LL/SC處理器原語......等,用純軟件方法,實現(xiàn)無鎖(Lock-Free)算法進行入隊操作;也可以利用硬件,直接實現(xiàn)同樣的功能,得到無等待(Wait-Free)算法的效果,同時獲得高效率入隊的效果:一條匯編指令即可完成入隊操作。鏈表的非阻塞式、特別是無鎖入隊操作,已有很多的公開論文陳述,在此不再贅述。并行入隊器的具體實現(xiàn),與總線內(nèi)部的消息隊列池的具體結(jié)構(gòu)與實現(xiàn),密切相關。通常情況下,是操作單個或者多個含頭尾指針的單鏈表,對其完成尾部并行入隊操作。為降低并行操作的復雜性,也可以安排一個專門的單鏈表隊列,僅用于并行轉(zhuǎn)串行的入隊操作;之后,再對該并串隊列進行后續(xù)管理操作。特殊情況下,入隊可以有其它特別解決方案。后文將描述一個特別的簡潔模型。
      [0143](六)消息隊列池
      [0144]消息隊列池用于緩存尚未處理的已入隊消息。
      [0145]消息隊列池,是本消息總線的核心數(shù)據(jù)結(jié)構(gòu)區(qū),用于緩存所有尚未處理的已入隊消息,配合過濾、管理、調(diào)度、挑選應該優(yōu)先處理的消息。由于這時已經(jīng)完全是協(xié)同操作,因此,能簡單自然地設計各種調(diào)度管理算法。
      [0146]消息隊列池的具體實現(xiàn)方案,與具體的應用系統(tǒng)密切相關。通常情況下,是一個含頭尾指針的單鏈表,可以實現(xiàn)簡單的調(diào)度算法,如:先進先出FIF0(FirstIn First Out)算
      法、簡單的優(yōu)先級排序算法......等。復雜情況下,比如,多種簡單的調(diào)度算法同時存在于
      一個系統(tǒng),這時需要使用多個單鏈表,以實現(xiàn)相對復雜的調(diào)度算法,如:時間優(yōu)化的動態(tài)優(yōu)
      先級算法、最早截止任務優(yōu)先EDF(EarliestDeadline First)算法......等。特殊情況下,
      可能需要使用雙鏈表、散列表等復雜的數(shù)據(jù)結(jié)構(gòu),以完成系統(tǒng)特殊的功能與要求。
      [0147]本發(fā)明中,對于消息隊列池,采用零PCB,從而簡化了并發(fā)模型,使得本消息總線具備最廣泛的適應性。更為關鍵的,能夠有效節(jié)省RAM空間。對于應用本消息總線實現(xiàn)并發(fā)的應用系統(tǒng)而言,由于構(gòu)件組裝,一次擁有成千上萬的算子Actor是非常正常的事情。因此,零PCB就使得算子數(shù)量與RAM空間的占用毫無關聯(lián)。無論存在多少算子,其所占用的RAM空間絲毫不變。這樣,本消息總線就能很輕易地應用于各種RAM稀缺的場合,如:WSN應用系統(tǒng)中。
      [0148]零PCB,意味著算子不再能動態(tài)地表達其任務的多種狀態(tài),因此約定:總線內(nèi)的算子,不再有等待狀態(tài),而只存在就緒狀態(tài)和運行狀態(tài)。即使消息總線內(nèi)不存在任何消息時,消息總線內(nèi)的算子也處于就緒狀態(tài)。而當消息總線內(nèi)到達消息時,消息總線內(nèi)的算子排序后立即獲得處理器,從而轉(zhuǎn)變?yōu)檫\行狀態(tài)。因此,整個應用系統(tǒng)是否處于等待狀態(tài),取決于消息總線內(nèi)部是否存在消息。這為系統(tǒng)節(jié)能奠立了深刻的理論與技術(shù)支撐點。
      [0149]零PCB,意味著一般的算子可以不用RAM空間來動態(tài)地表達。但是,這不排除某些特別用途的算子或隊列,可以占用很多RAM空間,也即,采用非零PCB來表達。比如^EDF隊列里,記錄每個實時算子的截止時間。
      [0150]因此,RAM零長度的任務控制塊PCB,即零PCB,相對于RAM內(nèi)存中非零長度的任務PCB,減少了調(diào)度執(zhí)行時間,形成了高效、簡潔、統(tǒng)一的并發(fā)基礎模型,減少了 RAM空間的占用,使得本并發(fā)基礎模型能普遍適用于任何現(xiàn)有的計算機體系。[0151](七)排隊順序管理器
      [0152]排隊順序管理器用于根據(jù)預設調(diào)度策略從所述消息隊列池中選擇需處理的指定消息,對所述指定消息進行協(xié)同的出隊操作。
      [0153]具體的,排隊順序管理器,利用消息隊列池、各種調(diào)度算法等,對所有尚未處理的已入隊消息進行調(diào)度管理。例如:設置消息的優(yōu)先順序,將最優(yōu)先的消息置于隊首,便于消息出隊。其中,在選擇隊首時,可以很簡單地從隊列的頭部,將消息提取標示出來。如果有多個隊列,則需要先選擇最優(yōu)先的隊列。由于消息格式一般比較復雜、不可預知,因此也可以簡單地提取消息槽的地址作為消息地址。對于最簡單的先進先出算法,排隊順序管理器甚至可以做到不以明確獨立的形態(tài)出現(xiàn),而是隱含在其它相關機構(gòu)與代碼中。將排隊順序管理器放置于并行入隊器之后,可以避免復雜、繁瑣、危險的并行搶占操作。由于此時已經(jīng)完全是協(xié)同操作,因此,能簡單自然地設計各種調(diào)度管理算法。
      [0154](八)入口映射表
      [0155]入口映射表,根據(jù)所述目標算子ID查找所述入口映射表,獲得與所述目標算子ID對應的函數(shù)入口地址;根據(jù)所述函數(shù)入口地址以及所述指定消息的指定消息槽地址,調(diào)用對應的算子執(zhí)行函數(shù),從而處理出隊的所述指定消息。
      [0156]入口映射表用于存儲算子ID與函數(shù)入口地址的映射關系,根據(jù)目標算子ID查找入口映射表,可以獲得與目標算子ID對應的函數(shù)入口地址,以便下一步跳到該入口處,執(zhí)行該算子的函數(shù)。這實際上是一個匯編級別的間接地址跳轉(zhuǎn)機制。該入口映射表,一般是一個按算子ID順序、從小到大排列的地址表,算子ID本身一般不明確地出現(xiàn)在該表內(nèi)部。為了壓縮任務入口表的大小,充分利用空間,算子ID —般采用連續(xù)的編碼方式。
      [0157]為節(jié)省RAM空間,適應RAM空間稀缺的應用系統(tǒng),可以將該入口映射表存放在ROM中。該入口映射表也可以隱含附帶或明確列出其它若干有用信息,如:算子的靜態(tài)優(yōu)先級等。由于此時是協(xié)同操作,因此,即使是在程序運行期間,也能輕易協(xié)同一致地修改該入口映射表,實現(xiàn)系統(tǒng)代碼的運行期間熱升級。這對于24小時*7天/周、連續(xù)運行的高可靠系統(tǒng)而言,有非常重大的現(xiàn)實價值。另外,入口映射表存儲算子ID與函數(shù)入口地址的映射關系,對于采用任務入口地址的方案,能跨越計算機標示并行算子,直接支持完全透明的分布式并行計算。支持運行期間的代碼熱升級。
      [0158](九)系統(tǒng)堆棧與執(zhí)行任務
      [0159]系統(tǒng)堆棧為所述消息總線中所有算子共享的堆??臻g;各個算子所共享的系統(tǒng)堆??臻g相互覆蓋,為重疊式,即非層疊式。
      [0160]根據(jù)前面得到的函數(shù)入口地址、以及消息(槽)首地址,直接調(diào)用該算子的執(zhí)行函數(shù)。與TinyOS 2.X相比,最大的區(qū)別是,本技術(shù)方案在執(zhí)行時,攜帶有消息指針;因此,變成了主動消息模式,能實現(xiàn)推模式的信息傳送機制。一個算子完全退出以后,其所占用的堆??臻g也完全清空。由于系統(tǒng)內(nèi)的所有算子都是協(xié)同執(zhí)行,因此,它們都共享相同的系統(tǒng)堆??臻g。也即,所有算子的堆??臻g是重疊的,相對于層疊式的任務堆棧,本發(fā)明提供的重疊的協(xié)同系統(tǒng)堆棧,大量減少了 RAM堆??臻g的占用,使系統(tǒng)更具普適性;便于評估堆??臻g的最大使用量,便于RAM空間分配管理工作。在算子運行期間,消息(槽)是屬于該算子完全私有的。因此,在不妨礙總線運行的情況下,算子能對該消息任意處理。如:重復或優(yōu)先使用、發(fā)送、轉(zhuǎn)發(fā)、更改該消息(槽),以提高系統(tǒng)運行效率。[0161](十)監(jiān)控管理中心
      [0162]監(jiān)控管理中心用于對所述消息總線內(nèi)部的消息,進行集中監(jiān)視、分析、控制、過濾和管理。比如:統(tǒng)計消息總線內(nèi)所有算子的實際運行時間;清除發(fā)給某算子的某類消息;甚
      至強制終止運行某失控的算子......等等。一般主要用于系統(tǒng)調(diào)試與測試階段,在系統(tǒng)正
      式運行期間可以不必存在。
      [0163]( -| )空間回收模塊
      [0164]空間回收模塊用于回收所述消息總線內(nèi)的出隊后的消息本身以及所述消息槽,即:用于消息本身的廢棄回收、以及消息槽空間的廢棄回收。消息本身的廢棄,屬于并行入隊器的多入單出模式中的出隊操作。在很簡單的應用系統(tǒng)中,可以在隊首選擇的時候統(tǒng)一進行,以便算子運行的時候,可以很簡單地消除廢棄標志,重復利用該消息。消息槽空間的回收:正常情況下,屬于并行環(huán)形分配器的多入單出模式中的空間回收操作,也可由硬件實現(xiàn)。
      [0165](十二)節(jié)電裝置
      [0166]節(jié)電裝置的具體的實現(xiàn)方式與應用系統(tǒng)硬件密切相關。由于本消息總線能根據(jù)內(nèi)部是否存在消息,從而即時知曉系統(tǒng)是否處于等待狀態(tài)。因此,在總線內(nèi)部不存在消息時,立即通知使用本消息總線的應用系統(tǒng)進行節(jié)能調(diào)度。當有消息發(fā)生時,再通知硬件恢復正常運行狀態(tài)。
      [0167]在很多應用場合下(如:8051單片機),處理器沒有CAS/CAS2指令、也沒有LL/SC等用于并行操作的高級同步原語。因此,只能用開關中斷的方法模擬實現(xiàn)類似原語。這會降低總線的調(diào)度效率。這時,可以對通用模型做出一些簡單的適應性更改,以適應具體的應用環(huán)境,提高系統(tǒng)效率。舉例說明:總線內(nèi)部算子產(chǎn)生的消息多、而外部中斷環(huán)境產(chǎn)生的消息少。這時,可以利用該特點,設置2個總線消息緩存空間。中斷消息入隊是競爭性的,使用開關中斷實現(xiàn)原語。算子消息入隊是協(xié)同性的,則無需使用開關中斷,因此能提高調(diào)度效率。甚至能針對中斷優(yōu)先的特點,做出更高效率的技術(shù)修正,使得二者能共用同一個消息緩存。
      [0168]對于硬實時系統(tǒng),要求某些關鍵操作,必須在確定內(nèi)的時間界限內(nèi)完成。本通用協(xié)同模型,可以在優(yōu)先級調(diào)度的情況下,稍加變更予以實現(xiàn)。對于響應速度非常高速、嚴格的情形,可以直接在硬件中斷處理函數(shù)內(nèi)部完成。對于響應時間可以稍微推遲一步、能利用總線調(diào)度的情形,可以安排在最高協(xié)同優(yōu)先級下運行算子。入隊操作也安排在最高優(yōu)先級,能保證入隊時沒有等待滯后。同時,拆分所有超過規(guī)定時間的算子。以使得在規(guī)定時間內(nèi),總線對任一算子能及時執(zhí)行完畢。進而,能在規(guī)定時間內(nèi),調(diào)度到最高優(yōu)先級的算子,完成硬實時響應。由于本模型有集中監(jiān)控中心,很容易監(jiān)測各算子的運行時間。因此,很容易定位到那些超過規(guī)定時間運行的算子,幫助完成硬實時響應的設計工作。
      [0169]本發(fā)明提供的消息總線,存在一個簡潔高效的具體特例。該特例的功能不是特別齊全,但執(zhí)行性能特別高效,能實現(xiàn)算子并發(fā)操作,滿足一般的并發(fā)應用環(huán)境,或作為其它并發(fā)應用的基礎。在借用硬件實現(xiàn)關鍵原子操作時,其執(zhí)行效率,可以與匯編級別的子程序調(diào)用,具備相同或非常接近的性能。
      [0170]在該特例中,并行環(huán)形分配器與并行入隊器合二為一。采用休眠消息槽與消息激活機制,實現(xiàn)簡單的FIFO排序,在入隊的同時,自然完成排隊操作。具體工作步驟為:[0171]S1、休眠標識、空間分配、入隊。特殊硬件完成,單條匯編指令可完成。
      [0172]S2、外部消息復制進入消息槽。
      [0173]S3、最簡單的FIFO排隊。隱含在SI操作中,不消耗時間。
      [0174]S4、消息隊首出隊。單條匯編指令可完成。參數(shù)提取,一般情況可省略。
      [0175]S5、算子ID查表,跳轉(zhuǎn)執(zhí)行。匯編級的間接調(diào)用指令可完成。
      [0176]S6、空間回收。特殊硬件完成,單條匯編指令可完成。
      [0177]對比匯編級別的子程序調(diào)用過程,SI相當于改變堆棧指針,S2相當于參數(shù)壓棧,S5相當于間接CALL匯編指令,S6相當于參數(shù)退棧。S3不消耗時間。因此,僅S4是多出的執(zhí)行時間,是非常簡單的操作,單條匯編指令即可完成。因此,總體執(zhí)行時間,僅多出I條匯編指令時間。在消息(或參數(shù))較多時,所占時間比重非常少。因此,可以做到非常接近的執(zhí)行性能。如果進一步優(yōu)化操作,采用更復雜的硬件,可以做到相同的執(zhí)行性能。
      [0178]下面對該特例進行詳細說明:
      [0179]為敘述簡單起見,先約定兩個術(shù)語:讓先環(huán)境、搶先環(huán)境。
      [0180]通常,在低端嵌入式應用環(huán)境中,普遍采用單核心單處理器的單片機,不采用操作系統(tǒng)。應用軟件采用結(jié)構(gòu)化、模塊化、順序編程技術(shù),組裝構(gòu)成整個應用系統(tǒng),直接運行在裸機狀態(tài)下。外部環(huán)境事件發(fā)生時,利用中斷處理程序搶先搶占主程序,捕捉外部事件,并把事件狀態(tài)保存在某些事先約定好的特定位置。同時,主程序使用一個很大的死循環(huán),輪回檢查是否有外部事件發(fā)生。若有發(fā)生,則按照事先的約定,檢查提取外部事件的狀態(tài),處理后輸出。
      [0181]很多應用,類似于上述應用場景,主循環(huán)總是被外部中斷所搶占,但不會出現(xiàn)主循環(huán)搶占外部中斷的情況。也即,只要有外部中斷代碼在運行,主循環(huán)肯定暫停執(zhí)行。這種軟件執(zhí)行環(huán)境,稱之為讓先執(zhí)行環(huán)境,簡稱為“讓先環(huán)境”。比如:單核單處理器時,LINUX執(zhí)行實時優(yōu)先調(diào)度政策,所導致的實時線程運行環(huán)境,當其最低優(yōu)先級的線程充當主循環(huán)時,即構(gòu)成讓先環(huán)境。
      [0182]與之相反,在多核處理器、或單核多處理器、或普通時間片式搶先調(diào)度時,主線程與其它線程能相互搶占,或同時并行交叉執(zhí)行。這種軟件執(zhí)行環(huán)境,稱之為搶先執(zhí)行環(huán)境,簡稱為“搶先環(huán)境”。
      [0183]在實現(xiàn)本消息總線時,主循環(huán)作為調(diào)度程序,完成消息出隊、調(diào)度、協(xié)同運行算子的功能;其它外部中斷,則相互搶占、把消息送入系統(tǒng)隊列。搶先環(huán)境下,調(diào)度程序與外部中斷相互搶占、交叉執(zhí)行。因此,外部中斷在填充消息槽、但尚未完全填充完畢時,調(diào)度程序就有可能運行。此時,調(diào)度程序就有機會接觸到那條半成品式的不完整消息。因此,需要采取一定的措施,保證調(diào)度程序不會把那條半成品消息,當成是正常的消息使用。在讓先環(huán)境下,外部中斷填充消息槽時,調(diào)度程序沒有機會被執(zhí)行。調(diào)度程序要么看不見新消息,要么看見的就是一條入隊后的完整消息。利用這個特點,在讓先環(huán)境下,就可以簡化并行入隊算法,不用給消息(槽)打上休眠標志。
      [0184]本實施例可以用于搶先環(huán)境、透明分布環(huán)境,基于x86 32bit多核系統(tǒng)。
      [0185]本實施例最核心的技術(shù)要點在于,將并行環(huán)形分配器與并行入隊器合并操作,將環(huán)形空間的頭尾指針,同時當作是消息隊列的頭尾指針。二個隊列合用同一付頭尾指針。這樣,消息槽剛剛從線性空間中被分配出來、進入到環(huán)形槽空間中的同時,就意味著該消息槽已經(jīng)進入了系統(tǒng)消息隊列。
      [0186]這時,在搶先環(huán)境下,為防止調(diào)度程序誤用這個新消息槽(此時尚未填充消息數(shù)據(jù)),需要事先給該消息槽寫上休眠標志。該休眠標志隱含在該消息槽的長度參數(shù)里。當長度為O時,代表該消息槽在休眠,尚未填充數(shù)據(jù),調(diào)度程序應該忽略之。
      [0187]消息格式為不定長二進制數(shù)據(jù),分為消息頭、消息體二部分。消息體可以是任意數(shù)據(jù)、小于65536-8字節(jié)的任意長度。消息體為O字節(jié)也是合法的,這時,整個消息就沒有消息體,只包含消息頭部。消息頭有三部分:2字節(jié)的消息長度參數(shù)size、2字節(jié)CAS2計數(shù)器cas2cnt、4字節(jié)算子id。共8個字節(jié),正好在32BIT x86CPU的一次CAS2操作范圍內(nèi)。
      [0188]在搶先環(huán)境下,利用無鎖算法,預寫休眠標志需要使用到CAS2操作。為防止CAS2無鎖操作時的ABA問題,cas2cnt計數(shù)器是必須的。具體原理可參看相關論文,此處不再贅述。在讓先環(huán)境下,不需要使用休眠標志,也不需要使用到CAS2操作,因此cas2cnt沒必要存在,可以舍棄。
      [0189]本案例中,CAS操作用x86的匯編指令cmpxchg完成,一次可操作4個字節(jié);CAS2操作用匯編指令cmpxchg8b完成,一次可操作8個字節(jié)。在x86架構(gòu)下,用匯編指令lock完成內(nèi)存總線鎖定,以完成多核時的CAS/CAS2操作。
      [0190]32BIT的算子ID號可以極簡單地劃分為2個部分:節(jié)點號、算子號。節(jié)點號為O時,隨后的算子號,被看作是本總線內(nèi)的算子。節(jié)點號不為O時,意味著目標算子不在本總線內(nèi),而是在其它外部節(jié)點:隨后的算子號,因此被當成是該外部節(jié)點內(nèi)的算子。節(jié)點號與算子號各占多少個BIT位,可以在應用系統(tǒng)中,事先約定。每個外部節(jié)點,需要一個本地算子代為處理一些必要的事務,如:把該消息轉(zhuǎn)發(fā)到一條通向該外部節(jié)點的通信管道中去......等等。該本地算子,稱為代理算子。
      [0191]環(huán)形槽空間隊列有頭指針head、尾指針tail,兼作系統(tǒng)消息隊列的頭、尾指針。當頭、尾指針相等時,表示環(huán)形槽空間內(nèi)沒有消息(槽),為空隊列。不考慮環(huán)形槽空間溢出的情形,此種例外故障由用戶應用程序自行處理。因此,尾指針始終指向線性內(nèi)存塊的空閑區(qū)域。
      [0192]消息槽分配時,直接在尾指針處,按8字節(jié)邊界對齊后,劃出相應長度的空閑空間,然后移動尾指針:這也意味著,消息槽也同時進入了系統(tǒng)消息隊列。在線性內(nèi)存塊的最末端分配時,其所剩余的空閑空間,可能無法容納一條完整的消息,則把該末端空間分配成一個廢棄的消息槽。新消息在下個空閑位置(線性空間的最開始端)連續(xù)分配。由于消息槽邊界始終是8字節(jié)對齊,與消息頭部的長度相等。因此,最末端的廢棄消息槽,最少也能容納下消息的頭部,不至于在用CAS2操作、并發(fā)寫入休眠標志時,出現(xiàn)超邊界讀寫的故障。
      [0193]由于消息槽的長度剛好容納一條消息,因此,由消息的長度能直接計算出消息槽的長度。而消息槽是連續(xù)分配的,因此,消息槽的長度實際上也隱含了下一個消息槽的位置。因此,不需要其它附加信息,所有的消息就可以組成一個FIFO的單鏈表。從首指針開始,可以按入隊順序,遍歷到所有的隊列內(nèi)消息。
      [0194]消息從隊列頭指針處直接出隊,然后,隊列頭指針head指向下一個消息槽:這也意味著,前消息槽空間已被廢棄回收,進入了自由空閑的線性空間。消息使用完畢后,在不出隊的情況下可直接廢棄。廢棄標志隱含在頭部的算子ID中。ID為0,意味著該消息已被廢棄,調(diào)度程序不再關注它。ID不為0,意味著它是有效消息,需要調(diào)度執(zhí)行。[0195]這樣,并行入隊的消息,只從隊列尾部入隊,只修改隊列的尾指針tail ;而出隊的消息,只從隊列頭部出隊,只修改隊列的頭指針head。因此,不采用其它臨界資源保護措施,也能自然輕松地完成并發(fā)競爭性的出入隊操作,提升執(zhí)行效率。
      [0196]參看圖4,本案例最為核心的操作有三個:
      [0197]Al、分配空槽入隊;A2、提交激活槽;A3、調(diào)度執(zhí)行。
      [0198]需要發(fā)送消息的外部環(huán)境或內(nèi)部算子,根據(jù)消息長度,調(diào)用Al操作,得到休眠的私有消息槽。然后,把消息的其余部分復制到該消息槽。最后,根據(jù)消息的目標算子ID、以及消息的長度參數(shù),調(diào)用A2操作,激活該消息。等待總線調(diào)度處理該消息。
      [0199]本案例的總線A3操作,非常簡單直觀。只是簡單的處理一下休眠與廢棄回收問題即可。其中,代理算子這個概念,放在調(diào)度程序內(nèi)實現(xiàn),對于透明分布計算有很大的好處。這樣,就可以在構(gòu)件組裝的鏈接配置文件中,直接把構(gòu)件內(nèi)使用到的ID號,鏈接到外部節(jié)點里。而不用再另外編碼生成本地算子,再通過該算子,轉(zhuǎn)發(fā)消息到外部節(jié)點。
      [0200]總線A3操作時,對于普通算子,先標示廢棄該消息,再執(zhí)行該消息對應的目標算子。理由在于,這可以給該算子一個重復利用該消息的機會。只要該算子清除該廢棄標志,就可重復使用該消息,提升系統(tǒng)執(zhí)行效率。比如:在錯誤處理算子中,把消息的ID修改為另外的算子,就可以把消息快速優(yōu)先地轉(zhuǎn)發(fā)給后續(xù)的錯誤處理算子。由于該條消息此時仍處于消息隊列頭部,因此能獲得優(yōu)先執(zhí)行。
      [0201]總線A2操作,在大于O的長度參數(shù)sz瞬間寫入到休眠消息頭部的size域時,該休眠消息槽被激活(消息槽休眠時,其頭部的size域為O)。為提高執(zhí)行效率,僅僅在消息隊列剛剛為空時,也即,本條消息是消息隊列內(nèi)的第一條消息時,才發(fā)送信號,喚醒睡眠中的調(diào)度程序。喚醒信號也可以多次重復發(fā)送。
      [0202]總線Al操作是無鎖標示、分配與入隊操作,采用了 CAS/CAS2操作。
      [0203](I)對尾指針tail及其所指向的消息槽頭部做一個快照snap。這時的snap,實際上可能是無用的垃圾數(shù)據(jù),也有可能是它人已處理好的有效頭部:可能是已做好標志的頭部、或者是正在填充的消息、或者干脆是已完全填好的消息頭部。然后反復與tail指針實時比較,以確保所獲得的快照、是從最新的隊尾所獲取。成功之后的snap,不再可能是正在填充或填充完畢的頭部。因為,那種情況下,tail指針必然已被它人改變。
      [0204](2)向快照snap對應的內(nèi)存寫入相同的標志M:休眠且有效的消息,其頭部size域為0,且id域不為O。有時它人已搶先填充,為防止破壞同一塊內(nèi)存,采用CAS2原子操作。CAS2操作時,其計數(shù)器cas2cnt域(sent),在原來snap時獲得的數(shù)值上加I,然后與標志M共同寫回去。這樣,該CAS2操作就保證了:在寫入標志M之前、并行競爭寫入時,有且僅有一次標志M的成功寫入;在寫入標志M之后,僅有頭部的cas2cnt域能被修改。因此在整體上保證了:標志M被可靠地提前寫入,且不會破壞它人后續(xù)寫入的其它有用的頭部信息。
      [0205](3)修改隊列尾指針tail,以搶先入隊。由于環(huán)形空間需要回繞一整圈以后,才可能會以極其微小的概率回到原處。因此,新、舊消息槽指針基本不可能相等,不存在ABA問題。僅采用CAS操作,就可完成競爭性的tail指針寫入,完成空間分配與入隊操作。
      [0206]以上即為非阻塞入隊的協(xié)同并發(fā)式消息總線的一個具體實施例。
      [0207]本發(fā)明提供的非阻塞入隊的協(xié)同并發(fā)式消息總線,能夠有效克服現(xiàn)有“并發(fā)”實現(xiàn)技術(shù)的弱點,高效可靠地實現(xiàn)“并發(fā)”技術(shù)、并行編程,具有普適、廉價、高效、可靠、節(jié)能、復用、透明分布、微內(nèi)核、內(nèi)在支持對象技術(shù)等一系列優(yōu)點。具體的,包括以下優(yōu)點:
      [0208](I)普適性:能廣泛應用于各種計算機體系結(jié)構(gòu)中,如:單處理器系統(tǒng)、多向量系統(tǒng)、大規(guī)模并行系統(tǒng)、對稱多處理系統(tǒng)、集群系統(tǒng)、向量機、巨型機、嵌入式系統(tǒng)等;也能廣泛應用于各類處理器架構(gòu)或各種CPU中,如:X86架構(gòu)、RISC架構(gòu)、ARM處理器、8051微處理器、單片機等;也能廣泛應用于各類操作系統(tǒng)、各類軟件系統(tǒng)中,如:IBM 0S/400系統(tǒng)、Windows系統(tǒng)、Unix系統(tǒng)、iOS系統(tǒng)、vxfforks系統(tǒng)、ucOS II系統(tǒng)、順序編程、結(jié)構(gòu)化編程、模塊化編程、數(shù)據(jù)庫系統(tǒng)等。對于這些千變?nèi)f化的軟硬件環(huán)境,均可使用統(tǒng)一的并發(fā)技術(shù)模型實現(xiàn)。
      [0209](2)廉價性:可以利用現(xiàn)有的軟硬件環(huán)境直接實現(xiàn),與現(xiàn)有的軟硬件系統(tǒng)與技術(shù)也完全相互兼容。為了獲得更多優(yōu)勢,也可以采用非常廉價統(tǒng)一的硬件設施,完成技術(shù)模型中的關鍵原子操作。
      [0210](3)高效性:空間效率高:其核心C語言源代碼不超過數(shù)百行。時間效率高:并發(fā)效率優(yōu)于現(xiàn)有普通線程技術(shù),可以超過一個數(shù)量級以上;如果采用硬件設施、完成關鍵原子操作后,與匯編級別的子程序調(diào)用指令相比,并發(fā)效率可以達到同等級別;也即,可以在數(shù)個或數(shù)十個機器指令周期內(nèi)完成一次并發(fā)調(diào)度操作。開發(fā)效率高:匹配特有的編程模型與組裝復用技術(shù),與現(xiàn)有普通的模塊化編程、對象化編程相比較,開發(fā)效率可以超過一個數(shù)量級以上。
      [0211](4)高可靠性:其核心代碼非常少,非常容易檢查測試正確;采用無鎖或無等待技術(shù)實現(xiàn)并發(fā),核心永不會死鎖崩潰;采用協(xié)同并發(fā)技術(shù),消除大量無謂的臨界條件競爭,避免應用程序時序故障;采用構(gòu)件復用編程模型,重復使用已證明可靠的構(gòu)件組裝系統(tǒng)。
      [0212](5)節(jié)能特性:采用消息與事件驅(qū)動機制。在沒有負荷時,系統(tǒng)能即時自動檢測,并進入節(jié)能狀態(tài)。
      [0213](6)透明分布計算特征。僅由ID號代表系統(tǒng)內(nèi)的并發(fā)算子Actor,并發(fā)算子Actor之間僅通過消息溝通,與該算子存放于何處、在何處執(zhí)行毫無關聯(lián)。因此,天然適應多核處理器CMP (Chip Mult1-Processor)結(jié)構(gòu)、對稱多處理器SMP (SymmetricalMult1-Processor)結(jié)構(gòu)、非對稱多處理器 AMP (AsymmetricalMult1-Processor)結(jié)構(gòu)、非一致存儲訪問NUMA(Non-Uniform Memory Access)結(jié)構(gòu)、海量并行處理MPP(Massive
      Parallel Process)結(jié)構(gòu)、計算機集群、分布式計算......等等并行與分布式環(huán)境。輕松進
      行負載平衡、計算轉(zhuǎn)移等功能,輕松提升計算效能,能在技術(shù)上實現(xiàn)全球統(tǒng)一計算環(huán)境。
      [0214](7)微內(nèi)核特征:核心代碼微小,并通過高效的消息總線,實現(xiàn)并發(fā)機制。操作系統(tǒng)完全可以高效率地架構(gòu)在它上面,與單內(nèi)核系統(tǒng)一爭高下。
      [0215](8)支持面向?qū)ο蠹夹g(shù):能容納超大規(guī)模的并發(fā)算子Actor構(gòu)件,所有算子均通過高效率的消息總線通訊,完美模擬與實現(xiàn)了對象技術(shù)中的主動對象的行為與機制。
      [0216]應用上述協(xié)同并發(fā)式消息總線,本發(fā)明還提供一種主動構(gòu)件組裝模型,所述主動構(gòu)件組裝模型為集合P = {第I層主動構(gòu)件、第2層主動構(gòu)件子集合...第η層主動構(gòu)件子集合},其中,η > 2 ;所述第η層主動構(gòu)件子集合中的各主動構(gòu)件基于第η層虛擬消息總線進行構(gòu)件組裝,得到第η-1層主動構(gòu)件子集合中的單個主動構(gòu)件;所述第η-1層主動構(gòu)件子集合中的各主動構(gòu)件基于第η-1層虛擬消息總線進行構(gòu)件組裝,得到第η-2層主動構(gòu)件子集合中的單個主動構(gòu)件;以此類推,直到所述第3層主動構(gòu)件子集合中的各主動構(gòu)件基于第3層虛擬消息總線進行構(gòu)件組裝,得到第2層主動構(gòu)件子集合中的單個主動構(gòu)件;所述第2層主動構(gòu)件子集合中的各主動構(gòu)件基于權(quán)利要求1-10任一項所述的消息總線進行構(gòu)件組裝,得到所述第I層主動構(gòu)件;
      [0217]其中,集合P中的各層各個所述主動構(gòu)件符合相同的協(xié)議。本發(fā)明中,將多個小主動構(gòu)件進行構(gòu)件組裝,最終得到了與各個小主動構(gòu)件的構(gòu)件協(xié)議相同的大主動構(gòu)件。大主動構(gòu)件完全消除了對下級小主動構(gòu)件的調(diào)用依賴性,使得構(gòu)件之間僅具有數(shù)據(jù)上的松散聯(lián)系。能脫離具體應用環(huán)境,完成獨立的構(gòu)件功能。使得構(gòu)件能夠簡潔、高效率地復用、重構(gòu)、組合,使得整個構(gòu)件系統(tǒng)具備高度復用性。
      [0218]其中,集合P中第I層主動構(gòu)件包括:所述消息總線、接口算子ID映射表、別名鏈接表以及一個以上的算子;其中,所述接口算子ID映射表用于存儲接口算子ID與入口函數(shù)的對應關系;所述別名鏈接表用于存儲引用算子ID與所述接口算子ID的對應關系;其中,所述接口算子ID為所述主動構(gòu)件自身的算子標識;所述引用算子ID為掛接在所述消息總線上的主動構(gòu)件內(nèi)部的算子標識;
      [0219]下面具體說明引用算子ID、別名鏈接表和接口算子ID映射表:
      [0220](I)引用算子ID:
      [0221]當構(gòu)件單獨以源碼或中間庫的形式存在時,該構(gòu)件內(nèi)部所引用到的引用算子ID,僅是待連接確認的符號名,在多個相關的構(gòu)件與配置文件一起編譯連接之后,那些引用算子ID就分配為正式的ID值或變量。
      [0222](2)別名鏈接表
      [0223]別名鏈接表用于存儲引用算子ID與所述接口算子ID的對應關系。優(yōu)選的,別名鏈接表存儲的所述引用算子ID與所述接口算子ID的對應關系為等值映射關系。別名鏈接表,操作上就是告知編譯器,某構(gòu)件內(nèi)所引用到的其它引用算子ID,應該與哪些構(gòu)件的接口算子ID鏈接在一起。本質(zhì)上就是,確定并勾畫構(gòu)件與構(gòu)件之間應有的數(shù)據(jù)通訊連接,以完成系統(tǒng)的預定功能。
      [0224]別名鏈接時,僅把引用算子ID與預定的接口算子ID綁定在一起,不關心算子的入口函數(shù)及其參數(shù)與消息格式。二個函數(shù)的參數(shù)與消息的具體規(guī)格與形式是否匹配,由應用系統(tǒng)自行判定與決策,從而給構(gòu)件鏈接操作以最大的自由度。一般可以在構(gòu)件靜態(tài)編譯連接時,由編譯器進行檢查;也可以在系統(tǒng)動態(tài)運行時,由算子自行檢查確認。
      [0225]別名鏈接的具體實現(xiàn)非常簡單,僅僅是把引用ID變量與已知ID變量綁定為同一個數(shù)值或變量,可以用編程語言里的別名操作或者賦值操作完成。舉例說明,refld為引用算子ID, calcld為已知的接口算子ID。用C++語言實現(xiàn)為:aID_t&refId = calcld ;用C語言實現(xiàn)為:aID_t refld = calcld。
      [0226](3)接口算子ID映射表
      [0227]接口算子ID映射表用于存儲接口算子ID與入口函數(shù)的對應關系。
      [0228]構(gòu)件內(nèi)的消息入口函數(shù)可以與接口算子ID分離。也即,構(gòu)件的功能實現(xiàn)代碼部分,可以不包含接口算子ID的名稱,僅包含入口函數(shù)的代碼。二者的綁定映射,可以滯后一步,在構(gòu)件或系統(tǒng)組裝時,與別名鏈接一起完成。多個接口算子ID,可以映射指向為同一個入口函數(shù)。這在實現(xiàn)靜態(tài)引用多實例對象時,極具價值。
      [0229]所述集合P中第2層主動構(gòu)件子集合到第η層主動構(gòu)件子集合中的各個主動構(gòu)件分別包括:所述虛擬消息總線、所述接口算子ID映射表、所述別名鏈接表以及一個以上的算子。
      [0230]其中,虛擬消息總線是一個邏輯上、概念上的總線,不用實際去關心編碼,不是一個單獨明確出現(xiàn)的總線實體。構(gòu)件總是插接到某根總線上,通過調(diào)用總線API函數(shù),構(gòu)件以硬編碼的形式要求掛接到總線上。但構(gòu)件單獨以源碼、或中間庫的形式存在時,該構(gòu)件并沒有與某根總線實際連接在一起,并沒有把總線的代碼包含在構(gòu)件內(nèi)。只有當完成整個總線節(jié)點、或整個系統(tǒng)的編譯連接之后,構(gòu)件才與某根總線的代碼連接在一起,成為總線的一個掛接部件。構(gòu)件假設自己是在一根總線上在操作,但這根總線暫時還不存在,因此稱之為虛擬消息總線。它不在構(gòu)件內(nèi)部存在,不影響構(gòu)件的獨立性。
      [0231]第η層主動構(gòu)件子集合中的各主動構(gòu)件基于第η層虛擬消息總線進行構(gòu)件組裝,得到第η-1層主動構(gòu)件子集合中的單個主動構(gòu)件,其中,n ^ 3具體為:
      [0232]所述第η層主動構(gòu)件子集合中的各主動構(gòu)件分別包括第η層虛擬消息總線、第η層接口算子ID映射表、第η層別名鏈接表以及一個以上的第η層算子;進行構(gòu)件組裝后得到的第n-Ι層主動構(gòu)件子集合中的單個主動構(gòu)件包括第n-Ι層虛擬消息總線、第n-Ι層接口算子ID映射表、第n-Ι層別名鏈接表以及一個以上的第n-Ι層算子;
      [0233]在進行構(gòu)件組裝時,將各個所述第η層虛擬消息總線進行總線融合,得到第n-Ι層虛擬消息總線;將各個所述第η層接口算子ID映射表進行表格融合,得到第n-Ι層接口算子ID映射表;將各個所述第η層別名鏈接表進行表格融合,得到第n-Ι層別名鏈接表;將各個所述第η層算子進行融合,得到第n-Ι層算子。
      [0234]第2層主動構(gòu)件子集合中的各主動構(gòu)件基于所述的消息總線進行構(gòu)件組裝,得到所述第I層主動構(gòu)件具體為:
      [0235]所述第2層主動構(gòu)件子集合中的各主動構(gòu)件分別包括所述第2層虛擬消息總線、第2層接口算子ID映射表、第2 層別名鏈接表以及一個以上的第2層算子;進行構(gòu)件組裝后得到的第I層主動構(gòu)件包括所述消息總線、第I層接口算子ID映射表、第I層別名鏈接表以及一個以上的第I層算子;
      [0236]在進行構(gòu)件組裝時,將各個所述第2層虛擬消息總線進行總線融合,得到所述消息總線;將各個所述第2層接口算子ID映射表進行表格融合,得到第I層接口算子ID映射表;將各個所述第2層別名鏈接表進行表格融合,得到第I層別名鏈接表;將各個所述第2層算子進行融合,得到第I層算子。
      [0237]具體的,構(gòu)件組裝時,虛擬消息總線只是一個邏輯概念,不用實際去關心編碼。因此,實際只需要完成接口算子ID映射表與別名鏈接表即可,這二者可以放在同一個配置文件里。因此,構(gòu)件組裝操作,就簡化對應于完成一個簡潔的配置文件。而實際的算子函數(shù)代碼,則可存放于一個算子函數(shù)庫里。該庫的算子函數(shù)之間,沒有任何的相互調(diào)用關系,僅僅是簡單的羅列關系,大家并行存在于同一個庫而已。
      [0238]配置文件里的內(nèi)容,只是簡單的羅列而已:接口算子ID與入口函數(shù)的對應關、弓丨用算子ID與接口算子的對應關系。構(gòu)件的引用、拆分、修改、重利用等等,也都僅僅是改變其中的對應關系而已,非常簡單明了。當需要完全包含另外一個構(gòu)件,使它成為自己的一個部分時,只要簡單地把該構(gòu)件的配置文件包含進來即可,不需更改它的函數(shù)代碼部分。
      [0239]并發(fā)算子作為最基本的基礎構(gòu)件,可以組裝構(gòu)成更大、更高級的構(gòu)件。在組成更大的構(gòu)件之后,作為基礎的算子之間,仍然沒有直接的函數(shù)調(diào)用關系,僅有數(shù)據(jù)通訊關系,仍保持相互之間通過總線進行消息溝通的特點。通過一張局部的別名鏈接表,確定構(gòu)件內(nèi)部的各算子之間的數(shù)據(jù)連接與通訊關系。由于本消息總線的消息調(diào)度效率,接近或與匯編級別的順序call調(diào)用相同,因此,大量存在的算子極少或不會降低系統(tǒng)的運行效率。
      [0240] 如圖5所示,為本發(fā)明提供的構(gòu)件組裝實例示意圖,從圖中可以看出,構(gòu)件3、構(gòu)件4需要組成一個大的構(gòu)件Ca,然后構(gòu)件Ca與構(gòu)件1、構(gòu)件2需要組成更大的構(gòu)件Cb。構(gòu)件
      1、構(gòu)件2、構(gòu)件3、構(gòu)件4之間的數(shù)據(jù)傳送關系,如圖中左半部分所示;實際組成的構(gòu)件裝配運行結(jié)構(gòu),如圖中右半部分所示。
      [0241 ] 構(gòu)件1、構(gòu)件2、構(gòu)件3、構(gòu)件4實際的函數(shù)代碼,并行存放于另外的一個算子函數(shù)庫中,不用關心。構(gòu)件Ca的配置文件內(nèi)容包含:算子ID3a、ID3b與構(gòu)件3內(nèi)的入口函數(shù)的對應關系,算子ID4與構(gòu)件4內(nèi)的入口函數(shù)的對應關系;構(gòu)件3引用ID4、構(gòu)件4引用ID3b的對應關系;對外公布的算子ID3a、構(gòu)件4引用的算子。構(gòu)件Cb的配置內(nèi)容類似,不再贅述。
      [0242]以上,描述了構(gòu)件組裝的通用模型與具體實施案例,通過上述構(gòu)件組裝通用模型,使得小型基礎構(gòu)件能輕易組裝成大型構(gòu)件,同時,大型構(gòu)件也極容易分解為小型基礎構(gòu)件。并發(fā)算子屬于推模式的主動消息構(gòu)件。應用本消息總線的構(gòu)件,對外呈現(xiàn)的接口為一個或多個算子,每個算子綁定一個消息入口函數(shù),被一個算子ID所代表。
      [0243]對于上述主動構(gòu)件組裝模型,本發(fā)明還提供了一種對上述的主動構(gòu)件組裝模型進行構(gòu)件拆分方法,包括以下步驟:
      [0244]預先設定構(gòu)件拆分規(guī)則,當所述主動構(gòu)件組裝模型滿足所述構(gòu)件拆分規(guī)則時,按所述構(gòu)件拆分規(guī)則拆分所述主動構(gòu)件組裝模型。
      [0245]本發(fā)明提供下列四種構(gòu)件拆分規(guī)則:
      [0246](I)第一種構(gòu)件拆分規(guī)則
      [0247]構(gòu)件拆分規(guī)則為:當所述消息總線的調(diào)度程序由兩個以上內(nèi)核或處理器執(zhí)行時,將所述消息總線分裂為與所述內(nèi)核數(shù)量或所述處理器數(shù)量相同的分布式的對等的子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件分別掛接到對應的所述子總線上。
      [0248]具體的,由于總線是協(xié)同調(diào)度與執(zhí)行的,因此,一根總線只適合于由一個處理器的一個內(nèi)核執(zhí)行總線的調(diào)度程序,不能由多核或多處理器同時執(zhí)行同一根總線的調(diào)度程序。在多核或多處理器系統(tǒng)中,如果一根總線的消息負荷非常大,僅由一個處理器的一個內(nèi)核執(zhí)行該總線的調(diào)度程序,顯得力不從心。那么,可以根據(jù)內(nèi)核與處理器的數(shù)量,把該總線分裂成2根甚至多根子總線,每個處理器內(nèi)核負責運行一根子總線。這樣,就能完成負荷的自動轉(zhuǎn)移工作。由于算子之間都是消息通訊,某個算子具體在哪根子總線上運行,并不影響原來單根系統(tǒng)總線上算子的數(shù)據(jù)通訊關系。由于信息的局部性原理,構(gòu)件內(nèi)部的算子之間的通訊,相對于構(gòu)件外部的通訊,一般應該頻繁很多。因此,總線分裂的原則,應該以構(gòu)件為單位進行劃分。這樣,構(gòu)件內(nèi)部原來不存在的虛擬消息總線,現(xiàn)在又重新實體化為實際的子總線。當然,如果需要總線分裂,那么原來在編譯鏈接時,很多可以舍棄的構(gòu)件信息,就需要保持記錄,以保證能夠重建與復現(xiàn)原來的構(gòu)件結(jié)構(gòu)與信息。
      [0249](2)第二種構(gòu)件拆分規(guī)則
      [0250]所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)件的負荷,根據(jù)預設的負載均衡原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件或算子分別掛接到對應的所述子總線上。[0251](3)第三種構(gòu)件拆分規(guī)則
      [0252]所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)件的能效t匕,根據(jù)預設的節(jié)能原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件或算子分別掛接到對應的所述子總線上。
      [0253](4)第四種構(gòu)件拆分規(guī)則
      [0254]所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)件的失效率,根據(jù)預設的可靠性原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件或算子分別掛接到對應的所述子總線上。
      [0255]本發(fā)明提供的協(xié)同并發(fā)式消息總線、主動構(gòu)件組裝模型及構(gòu)件拆分方法,能夠有效克服現(xiàn)有“并發(fā)”實現(xiàn)技術(shù)的弱點,高效可靠地實現(xiàn)“并發(fā)”技術(shù)、并行編程,具有普適、廉價、高效、可靠、節(jié)能、復用、透明分布、微內(nèi)核、內(nèi)在支持對象技術(shù)等一系列優(yōu)點。
      [0256]以上所述僅是本發(fā)明的優(yōu)選實施方式,應當指出,對于本【技術(shù)領域】的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視本發(fā)明的保護范圍。
      【權(quán)利要求】
      1.一種協(xié)同并發(fā)式消息總線,其特征在于,包括:信息獲取模塊、并行環(huán)形分配器、線性內(nèi)存塊、消息填充模塊、并行入隊器、消息隊列池、排隊順序管理器、入口映射表和系統(tǒng)堆棧; 其中,所述信息獲取模塊用于從接收到的待處理的外部并行的消息中獲取目標算子ID以及消息長度值;其中,所述目標算子ID為處理所述消息的算子標識;同時用于獲取附加管理消息的附加管理消息長度值,然后計算所述附加管理消息長度值與獲取到的所述消息長度值的和,得到消息占用空間值;其中,所述附加管理消息長度值> O ; 所述并行環(huán)形分配器為非阻塞式并行的空間環(huán)形分配器,用于根據(jù)所述信息獲取模塊獲取到的所述消息占用空間值,按環(huán)形劃分原則連續(xù)動態(tài)的劃割所述線性內(nèi)存塊,非阻塞式并行地得到與消息占用空間值相同的空白消息槽; 所述消息填充模塊用于將所述消息及所述附加管理消息填充到所述并行環(huán)形分配器分配的所述空白消息槽,得到非空白消息槽; 所述并行入隊器用于對所述空白消息槽或所述非空白消息槽進行非阻塞式并行入隊操作; 所述消息隊列池用于緩存尚未處理的已入隊消息; 所述排隊順序管理器用于根據(jù)預設調(diào)度策略從所述消息隊列池中選擇需處理的指定消息,對所述指定消息進行協(xié)同的出隊操作; 所述入口映射表,根據(jù)所述目標算子ID查找所述入口映射表,獲得與所述目標算子ID對應的函數(shù)入口地址;根據(jù)所述函數(shù)入口地址以及所述指定消息的指定消息槽地址,調(diào)用對應的算子執(zhí)行函數(shù),從而處理出隊的所述指定消息; 所述系統(tǒng)堆棧為所述消息總線中所有算子共享的堆??臻g;各個算子所共享的系統(tǒng)堆??臻g相互覆蓋,為重疊式,即 非層疊式; 并且,所述消息總線內(nèi)的算子僅具有就緒狀態(tài),即使當所述消息總線內(nèi)不存在任何消息時,所述消息總線內(nèi)的算子仍處于就緒狀態(tài);一旦當所述消息總線內(nèi)到達消息時,且當該消息所對應的算子被調(diào)度時,被調(diào)度到的算子立即獲得處理器。
      2.根據(jù)權(quán)利要求1所述的協(xié)同并發(fā)式消息總線,其特征在于,所述消息為定長消息或變長消息。
      3.根據(jù)權(quán)利要求1所述的協(xié)同并發(fā)式消息總線,其特征在于,當所述并行環(huán)形分配器在所述線性內(nèi)存塊的最末端劃割空白消息槽時,如果所述線性內(nèi)存塊最未端剩余的空閑空間小于所述消息占用空間值,則直接舍棄所述最未端剩余的空閑空間,所述最未端剩余的空閑空間形成廢棄槽。
      4.根據(jù)權(quán)利要求1所述的協(xié)同并發(fā)式消息總線,其特征在于,所述消息填充模塊首先將所述消息及所述附加管理消息填充到所述并行環(huán)形分配器分配的所述空白消息槽,得到非空白消息槽;然后所述并行入隊器對所述非空白消息槽進行非阻塞式并行入隊操作具體為: 所述并行環(huán)形分配器配置有第一頭指針和第一尾指針,當需要分配新的空白消息槽時,直接在當前位置的第一尾指針后面劃出與所述消息占用空間值相同的空間,得到所述新的空白消息槽,然后再將所述第一尾指針非阻塞式并行移動到所述新的空白消息槽的尾部;所述并行入隊器配置有第二頭指針和第二尾指針;通過非阻塞式并行移動所述第二尾指針實現(xiàn)對所述非空白消息槽進行非阻塞式并行入隊操作; 其中,所述并行環(huán)形分配器配置的第一頭指針和第一尾指針不同于所述并行入隊器配置的第二頭指針和第二尾指針。
      5.根據(jù)權(quán)利要求1所述的協(xié)同并發(fā)式消息總線,其特征在于,所述并行入隊器首先對所述空白消息槽進行非阻塞式并行入隊操作,然后所述消息填充模塊再向入隊的所述空白消息槽填充所述消息及所述附加管理消息具體為: 所述并行環(huán)形分配器與所述并行入隊器共用相同的頭指針和尾指針,當所述并行環(huán)形分配器從所述線性內(nèi)存塊中分配出空白消息槽的同時,該空白消息槽也被所述并行入隊器執(zhí)行了入隊操作;然后所述消息填充模塊再向入隊的所述空白消息槽填充所述消息及所述附加管理消息。
      6.根據(jù)權(quán)利要求5所述的協(xié)同并發(fā)式消息總線,其特征在于,在搶先環(huán)境下,在所述并行環(huán)形分配器從所述線性內(nèi)存塊中分配出空白消息槽之前,預先使所述空白消息槽處于休眠狀態(tài),其中,處于休眠狀態(tài)的空白消息槽稱為休眠消息槽;然后所述消息填充模塊向所述休眠消息槽中填充所述消息及所述附加管理消息,當填充完成之后,所述休眠消息槽被激活時,即轉(zhuǎn)變?yōu)榛钴S狀態(tài),其中,處于活躍狀態(tài)的消息槽稱為活躍消息槽;其中,休眠消息槽為不會被所述消息總線調(diào)度給算子執(zhí)行的消息槽;活躍消息槽為屬于所述消息總線正常調(diào)度范圍的消息槽。
      7.根據(jù)權(quán)利要求6所述的協(xié)同并發(fā)式消息總線,其特征在于,采用變長消息時,通過消息槽中寫入的消息長度參數(shù)是否為O區(qū)分所述休眠消息槽和活躍消息槽;當所述消息槽中寫入的消息長度參數(shù)為O時,該消息槽為所述休眠消息槽;當所述消息槽中寫入的消息長度參數(shù)不為O時,該消息槽為所述活躍消息槽。
      8.根據(jù)權(quán)利要求1所述的協(xié)同并發(fā)式消息總線,其特征在于,還包括:監(jiān)控管理中心;所述監(jiān)控管理中心用于對所述消息總線內(nèi)部的消息,進行集中監(jiān)視、分析、控制、過濾和管理。
      9.根據(jù)權(quán)利要求1所述的協(xié)同并發(fā)式消息總線,其特征在于,還包括:空間回收模塊;所述空間回收模塊用于回收所述消息總線內(nèi)的出隊后的消息本身以及所述消息槽。
      10.根據(jù)權(quán)利要求1所述的協(xié)同并發(fā)式消息總線,其特征在于,還包括:節(jié)電裝置;所述節(jié)電裝置用于:當所述消息總線內(nèi)不存在消息時,立即通知使用本消息總線的應用系統(tǒng)進行節(jié)能調(diào)度。
      11.一種應用權(quán)利要求1-10任一項所述的協(xié)同并發(fā)式消息總線的主動構(gòu)件組裝模型,其特征在于,所述主動構(gòu)件組裝模型為集合P = {第I層主動構(gòu)件、第2層主動構(gòu)件子集合...第η層主動構(gòu)件子集合},其中,η > 2 ;所述第η層主動構(gòu)件子集合中的各主動構(gòu)件基于第η層虛擬消息總線進行構(gòu)件組裝,得到第η-1層主動構(gòu)件子集合中的單個主動構(gòu)件;所述第η-1層主動構(gòu)件子集合中的各主動構(gòu)件基于第η-1層虛擬消息總線進行構(gòu)件組裝,得到第η-2層主動構(gòu)件子集合中的單個主動構(gòu)件;以此類推,直到所述第3層主動構(gòu)件子集合中的各主動構(gòu)件基于第3層虛擬消息總線進行構(gòu)件組裝,得到第2層主動構(gòu)件子集合中的單個主動構(gòu)件;所述第2層主動構(gòu)件子集合中的各主動構(gòu)件基于權(quán)利要求1-10任一項所述的消息總線進行構(gòu)件組裝,得到所述第I層主動構(gòu)件;其中,所述集合P中的各層各個所述主動構(gòu)件符合相同的協(xié)議。
      12.根據(jù)權(quán)利要求11所述的主動構(gòu)件組裝模型,其特征在于,所述集合P中第I層主動構(gòu)件包括:所述消息總線、接口算子ID映射表、別名鏈接表以及一個以上的算子;其中,所述接口算子ID映射表用于存儲接口算子ID與入口函數(shù)的對應關系;所述別名鏈接表用于存儲引用算子ID與所述接口算子ID的對應關系;其中,所述接口算子ID為所述主動構(gòu)件自身的算子標識;所述引用算子ID為掛接在所述消息總線上的主動構(gòu)件內(nèi)部的算子標識; 所述集合P中第2層主動構(gòu)件子集合到第η層主動構(gòu)件子集合中的各個主動構(gòu)件分別包括:所述虛擬消息總線、所述接口算子ID映射表、所述別名鏈接表以及一個以上的算子。
      13.根據(jù)權(quán)利要求12所述的主動構(gòu)件組裝模型,其特征在于,所述第η層主動構(gòu)件子集合中的各主動構(gòu)件基于第η層虛擬消息總線進行構(gòu)件組裝,得到第η-1層主動構(gòu)件子集合中的單個主動構(gòu)件,其中,n ^ 3具體為: 所述第η層主動構(gòu)件子集合中的各主動構(gòu)件分別包括第η層虛擬消息總線、第η層接口算子ID映射表、第η層別名鏈接表以及一個以上的第η層算子;進行構(gòu)件組裝后得到的第n-Ι層主動構(gòu)件子集合中的單個主動構(gòu)件包括第n-Ι層虛擬消息總線、第n-Ι層接口算子ID映射表、第n-Ι層別名鏈接表以及一個以上的第n-Ι層算子; 在進行構(gòu)件組裝時,將各 個所述第η層虛擬消息總線進行總線融合,得到第n-Ι層虛擬消息總線;將各個所述第η層接口算子ID映射表進行表格融合,得到第n-Ι層接口算子ID映射表;將各個所述第η層別名鏈接表進行表格融合,得到第n-Ι層別名鏈接表;將各個所述第η層算子進行融合,得到第n-Ι層算子。
      14.根據(jù)權(quán)利要求12所述的主動構(gòu)件組裝模型,其特征在于,所述第2層主動構(gòu)件子集合中的各主動構(gòu)件基于所述的消息總線進行構(gòu)件組裝,得到所述第I層主動構(gòu)件具體為: 所述第2層主動構(gòu)件子集合中的各主動構(gòu)件分別包括所述第2層虛擬消息總線、第2層接口算子ID映射表、第2層別名鏈接表以及一個以上的第2層算子;進行構(gòu)件組裝后得到的第I層主動構(gòu)件包括所述消息總線、第I層接口算子ID映射表、第I層別名鏈接表以及一個以上的第I層算子; 在進行構(gòu)件組裝時,將各個所述第2層虛擬消息總線進行總線融合,得到所述消息總線;將各個所述第2層接口算子ID映射表進行表格融合,得到第I層接口算子ID映射表;將各個所述第2層別名鏈接表進行表格融合,得到第I層別名鏈接表;將各個所述第2層算子進行融合,得到第I層算子。
      15.根據(jù)權(quán)利要求12所述的主動構(gòu)件組裝模型,其特征在于,所述別名鏈接表存儲的所述引用算子ID與所述接口算子ID的對應關系為等值映射關系。
      16.一種對權(quán)利要求11得到的所述的主動構(gòu)件組裝模型進行構(gòu)件拆分方法,其特征在于,包括以下步驟: 預先設定構(gòu)件拆分規(guī)則,當所述主動構(gòu)件組裝模型滿足所述構(gòu)件拆分規(guī)則時,按所述構(gòu)件拆分規(guī)則拆分所述主動構(gòu)件組裝模型。
      17.根據(jù)權(quán)利要求16所述的構(gòu)件拆分方法,其特征在于,所述構(gòu)件拆分規(guī)則為:當所述消息總線的調(diào)度程序由兩個以上內(nèi)核或處理器執(zhí)行時,將所述消息總線分裂為與所述內(nèi)核數(shù)量或所述處理器數(shù)量相同的分布式的對等的子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件分別掛接到對應的所述子總線上;或者所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)件的負荷,根據(jù)預設的負載均衡原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件或算子分別掛接到對應的所述子總線上;或者所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)的能效比,根據(jù)預設的節(jié)能原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述主動構(gòu)件或算子分別掛接到對應的所述子總線上;或者 所述構(gòu)件拆分規(guī)則為:動態(tài)統(tǒng)計所述主動構(gòu)件組裝模型中各個主動構(gòu)件的失效率,根據(jù)預設的可靠性原理,動態(tài)地將所述消息總線分裂為分布式的對等的多個子總線;所述主動構(gòu)件組裝模型中各層各個所述 主動構(gòu)件或算子分別掛接到對應的所述子總線上。
      【文檔編號】G06F9/50GK103473031SQ201310020046
      【公開日】2013年12月25日 申請日期:2013年1月18日 優(yōu)先權(quán)日:2013年1月18日
      【發(fā)明者】龍建 申請人:龍建
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1