本發(fā)明屬于計算機軟件工程中的程序設(shè)計和軟件開發(fā)領(lǐng)域。
背景技術(shù):
模塊化編程根據(jù)問題域來分解系統(tǒng),一個程序通常包含各種獨立而又互相調(diào)用的模塊(本專利中所說的模塊指程序設(shè)計中的對象、函數(shù)、方面、子程序等)。模塊化編程可以降低程序復(fù)雜度,使程序設(shè)計、調(diào)試和維護等操作簡單化。各模塊互相獨立還可以支持各模塊的獨立開發(fā)和代碼重用,從而提高軟件開發(fā)的速度。為了支持模塊化編程中各模塊之間的通訊,通常使用函數(shù)調(diào)用、信號量、管道、全局變量等方法實現(xiàn)。傳統(tǒng)模塊化編程的不足之處在于,將系統(tǒng)分解成模塊破壞了問題域中各部分功能之間的聯(lián)系。現(xiàn)有的通訊方法雖然能支持分解后各模塊之間的通訊,但效率低,實現(xiàn)起來復(fù)雜,增加了系統(tǒng)開發(fā)和維護的難度。在實際應(yīng)用中,經(jīng)常會出現(xiàn)有些功能很難模塊化的問題。
本發(fā)明提出一種層次化編程模型,通過構(gòu)建互相連接的線程,使系統(tǒng)中的模塊能進行互相通訊?;ミB的模塊按照預(yù)定義的協(xié)議,通過線程連接網(wǎng)絡(luò),進行層層通訊。層次化編程(也叫協(xié)議編程)定義一系列的協(xié)議,控制和協(xié)調(diào)各模塊之間的通訊。提供服務(wù)(本發(fā)明中的所提到的服務(wù),指模塊提供的功能,如函數(shù)等)的模塊按照預(yù)定義的協(xié)議發(fā)布和注冊服務(wù),需要服務(wù)的模塊同樣按照協(xié)議申請服務(wù)。模塊之間的通訊利用線程之間互相發(fā)送消息來實現(xiàn)。
以本發(fā)明相近的方法,已經(jīng)有很多研究。消息傳遞接口(messagepassinginterface,mpi)是一個面向高性能并行計算的編程接口。mpi的核心構(gòu)造是消息傳遞:一個進程將信息打包成消息,并將該消息發(fā)送給其他進程。mpi包含一些例程,這些例程可以同步進程、求分布在進程集中的數(shù)值的總和、在同一個進程集中分配數(shù)據(jù),以及實現(xiàn)更多的功能。mpi作為一種消息傳遞編程模型,其目的是為了服務(wù)于進程間的通信。mapreduce作為一種編程模型,主要用于大規(guī)模數(shù)據(jù)集的并行運算。它極大地方便了編程人員在不會分布式并行編程的情況下,將自己的程序運行在分布式系統(tǒng)上。當(dāng)前的軟件實現(xiàn)是指定一個map(映射)函數(shù),用來把一組鍵值對映射成一組新的鍵值對,指定并發(fā)的reduce(歸約)函數(shù),用來保證所有映射的鍵值對中的每一個共享相同的鍵組。erlang是一種通用的面向并發(fā)的編程語言,是一個結(jié)構(gòu)化,動態(tài)類型編程語言,內(nèi)建并行計算支持。最初是由愛立信專門為通信應(yīng)用設(shè)計的,比如控制交換機或者變換協(xié)議等,因此非常適合于構(gòu)建分布式,實時軟并行計算系統(tǒng)。使用erlang編寫出的應(yīng)用運行時通常由成千上萬個輕量級進程組成,并通過消息傳遞相互通訊。進程間上下文切換對于erlang來說僅僅只是一兩個環(huán)節(jié),比起c程序的線程切換要高效得多得多了。corba(commonobjectrequestbrokerarchitecture,公共對象請求代理體系結(jié)構(gòu),通用對象請求代理體系結(jié)構(gòu))是由omg組織制訂的一種標(biāo)準(zhǔn)的面向?qū)ο髴?yīng)用程序體系規(guī)范?;蛘哒fcorba體系結(jié)構(gòu)是對象管理組織(omg)為解決分布式處理環(huán)境(dce)中,硬件和軟件系統(tǒng)的互連而提出的一種解決方案。
以上幾種相關(guān)的方法均采用進程或線程之間的消息傳遞來支持分布式或并行的編程環(huán)境。本發(fā)明同樣基于消息傳遞機制,重點在于構(gòu)建一個線程連接網(wǎng)絡(luò),用于連接實例化的模塊(如,對象等),從而支持層次化編程模型。
技術(shù)實現(xiàn)要素:
本發(fā)明提出一種層次化編程方法。該方法通過構(gòu)建線程連接網(wǎng)絡(luò)的,為程序設(shè)計中每個實例化的模塊提供一種消息傳遞機制。系統(tǒng)中的所有模塊通過線程連接網(wǎng)絡(luò)互相通訊。從而實現(xiàn)互相之間的消息傳遞,如:函數(shù)調(diào)用、結(jié)果返回等。從而支持各模塊之間的并行,分布式和流水等并發(fā)計算。其模型框架如附圖1所示。
面向線程連接網(wǎng)絡(luò)的層次化編程下的系統(tǒng)實現(xiàn)可以包含三層:傳輸層、服務(wù)層和應(yīng)用層。其中的傳輸層和服務(wù)層統(tǒng)稱協(xié)議實現(xiàn)。每一層由一個類實現(xiàn)。相鄰層的類通過繼承,實現(xiàn)下層對上層的支持。實現(xiàn)傳輸層的類即為基類,其中聲明了三個線程:配置線程、連接線程和行為線程。配置線程用于模塊的配置和初始化。連接線程用于構(gòu)件線程連接網(wǎng)絡(luò),提供消息傳統(tǒng)功能。行為線程用于處理傳輸層中定義的其它功能。在服務(wù)層中聲明了一個執(zhí)行線程,用于執(zhí)行模塊中提供的服務(wù)。如果模塊以線程方式提供服務(wù),則在應(yīng)用層應(yīng)聲明一個工作線程。
本發(fā)明的貢獻在于:①提出了一種層次化編程模型。②提出了面向線程連接網(wǎng)絡(luò)的消息傳遞機制。③提出了基于線程連接網(wǎng)絡(luò)的的兩種服務(wù)請求方式(同步請求和異步請求)和兩種執(zhí)行模式(函數(shù)服務(wù)和線程服務(wù))。
附圖說明
圖1是本發(fā)明所述層次化編程模型的示意圖。
具體實施方案
面向線程連接網(wǎng)絡(luò)的層次化編程框架是本專利提出的一種編程模型,是傳統(tǒng)模塊化編程模型的擴展和延伸。具體實現(xiàn)可以包含三層:傳輸層、服務(wù)層、應(yīng)用層。具體如下所述:
1.傳輸層
傳輸層的主要任務(wù)是構(gòu)建一個線程連接網(wǎng)絡(luò),從而支持各模塊之間的消息傳遞。為了構(gòu)建線程連接網(wǎng)絡(luò),每個模塊需要實例化一個連接線程。該線程的句柄可以通過全局變量、參數(shù)傳遞等方式告知其它模塊,從而使模塊之間知道對方線程的句柄。由于所有連接線程是并發(fā)的,可以在模塊中定義一個配置線程來配置各模塊中的連接線程。線程連接網(wǎng)絡(luò)可以采用星形、樹形、環(huán)形等拓?fù)浣Y(jié)構(gòu)。
線程連接網(wǎng)絡(luò)支持各模塊之間的互聯(lián)互通,模塊之間通過消息傳遞實現(xiàn)通訊。消息的內(nèi)容在一個消息類中聲明,其中包括消息的目的地、發(fā)送者、消息類型、行為類型、跳步、時間戳、參數(shù)以及路由信息等。其中目的地和發(fā)送者均為模塊的地址,本發(fā)明使用模塊的連接線程的句柄作為地址。消息類型指消息所屬的層(傳輸層、服務(wù)層等)。行為類型指該層所支持的行為。
傳輸層主要為服務(wù)層提供消息傳遞服務(wù)。傳輸層對服務(wù)層是透明的,保證其設(shè)計和實現(xiàn)的獨立性。服務(wù)層利用傳輸層中的連接線程的句柄作為發(fā)送消息的入口。在傳輸層如果收到的消息屬于服務(wù)層,則調(diào)用傳輸層中聲明的一個純虛函數(shù)處理該消息。該函數(shù)即為傳輸層的出口。由于服務(wù)層的類需要繼承傳輸層的類,該函數(shù)需要在服務(wù)層的類中聲明。
2.服務(wù)層
服務(wù)層本身不支持具體的應(yīng)用服務(wù),而是負(fù)責(zé)管理服務(wù)。面向應(yīng)用的服務(wù)通常由應(yīng)用層提供。服務(wù)層負(fù)責(zé)服務(wù)的注冊、請求、執(zhí)行等。以服務(wù)相關(guān)的信息在一個服務(wù)描述類中聲明。每個服務(wù)有一個服務(wù)描述。其中包含服務(wù)名、服務(wù)的地址(通常為提供服務(wù)的模塊的地址)、服務(wù)方式(函數(shù)和線程)、提供服務(wù)的函數(shù)的地址或提供服務(wù)的線程的句柄、執(zhí)行服務(wù)的代碼是否可重入、服務(wù)的路由信息等相關(guān)內(nèi)容。
每個服務(wù)的描述在傳輸層的線程連接網(wǎng)絡(luò)建立起來后,按照協(xié)議在系統(tǒng)的模塊之間發(fā)布。比如在星形拓?fù)涞木€程連接網(wǎng)絡(luò)中,所有模塊可以將服務(wù)注冊到中心節(jié)點。服務(wù)的請求機制對應(yīng)于服務(wù)的注冊機制,可按協(xié)議路由每個模塊的服務(wù)請求。服務(wù)層中可以定義一個成員變量(以下稱服務(wù)描述變量),繼承服務(wù)層的模塊用來存儲提供的服務(wù)的相關(guān)信息。系統(tǒng)初始化的時候,服務(wù)層自動讀取該變量中的信息按定義的協(xié)議發(fā)布服務(wù)。
服務(wù)層的另一主要功能是管理服務(wù)的執(zhí)行。服務(wù)的請求是通過消息傳遞實現(xiàn)。服務(wù)的請求通過調(diào)用服務(wù)層中定義的函數(shù)實現(xiàn)(以下稱請求函數(shù))。請求函數(shù)接收服務(wù)名稱、服務(wù)所需參數(shù)、是否需要返回結(jié)果、服務(wù)請求類型(同步和異步)等為參數(shù),然后封裝成消息,利用傳輸層的入口(連接線程的句柄)將消息發(fā)送到線程連接網(wǎng)絡(luò)。發(fā)送消息的模塊可以選擇同步和異步服務(wù)請求。同步服務(wù)請求在消息發(fā)出后會在請求函數(shù)中自動阻塞,等待響應(yīng)消息的到達后自動喚醒。在異步服務(wù)請求中,消息發(fā)出后即可執(zhí)行下一條語句。請求服務(wù)的消息在線程連接網(wǎng)絡(luò)中按照定義的路由協(xié)議到達提供該服務(wù)的模塊的傳輸層。該模塊取下地址匹配的信息,如果識別出該消息屬于服務(wù)層,則調(diào)用傳輸層中的出口來處理該消息。請求消息到達服務(wù)層后,根據(jù)服務(wù)描述判斷執(zhí)行的方式,即函數(shù)執(zhí)行或是線程執(zhí)行。如果執(zhí)行服務(wù)的代碼在服務(wù)描述中聲明是可重入的。則可以提供該服務(wù)的并發(fā)執(zhí)行。執(zhí)行結(jié)束后根據(jù)請求消息中的字段,返回或不返回執(zhí)行的結(jié)果。
服務(wù)層對應(yīng)用層的接口為服務(wù)描述變量和請求函數(shù)。提供服務(wù)的模塊將服務(wù)描述存儲在服務(wù)描述變量中,請求服務(wù)的模塊通過調(diào)用請求函數(shù)發(fā)送服務(wù)請求。從而保證了服務(wù)層對應(yīng)用層設(shè)計和實現(xiàn)的獨立性。
3.應(yīng)用層
應(yīng)用層可以定義多個類來實現(xiàn)。每個類都需要繼承服務(wù)層的類。從而保證以該類實例化的所有模塊可以具備傳輸層和服務(wù)層的功能。所有模塊中至少生成一個連接線程(能正確的連接到線程連接網(wǎng)絡(luò)),一個行為線程(能處理到達的消息)和一個執(zhí)行線程(能處理服務(wù)層的消息)。
應(yīng)用層中的模塊利用服務(wù)層的接口(服務(wù)描述變量和請求函數(shù))發(fā)布服務(wù)和請求服務(wù)。