一種支持分布式系統(tǒng)的透明進程間通信系統(tǒng)及方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種支持分布式系統(tǒng)的透明進程間通信系統(tǒng)及方法,屬于計算機中的進程間通信的技術(shù)領(lǐng)域,用于航天領(lǐng)域。
【背景技術(shù)】
[0002]近年來,在航天等嵌入式領(lǐng)域,隨著系統(tǒng)的功能越來越復(fù)雜,單處理器嵌入式系統(tǒng)已不能滿足需求,出現(xiàn)了多處理器嵌入式系統(tǒng),對于支持多處理器嵌入式系統(tǒng)的分布式實時操作系統(tǒng)的研究也越來越多。進程間通信(IPC)是操作系統(tǒng)的基礎(chǔ)功能,也是分布式系統(tǒng)的核心。多處理器嵌入式系統(tǒng)與傳統(tǒng)分布式系統(tǒng)相比,具有如下特點:(1)存儲空間有限且對實時性要求嚴(yán)格,針對該系統(tǒng)的進程間通信必須考慮到執(zhí)行效率、實時性和內(nèi)存占用問題,即通信效率問題;(2)多處理器之間的物理通信方式種類繁多,即通信透明問題。支持多處理器嵌入式系統(tǒng)的進程間通信必須要考慮上面兩個特點。
[0003]現(xiàn)有的操作系統(tǒng)內(nèi)進程間通信機制主要有:管道、信號量、消息隊列、共享內(nèi)存等。支持分布式系統(tǒng)的進程間通信機制主要有:套接字(Socket)、RPC、COM、Web服務(wù)及面向消息的中間件等。套接字是傳統(tǒng)的分布式系統(tǒng)中節(jié)點之間進程間通信機制,需要經(jīng)過協(xié)議棧處理,效率低。遠程過程調(diào)用RPC是最常見、最有效的節(jié)點通信方式之一,它隱藏了底層通信過程,應(yīng)用廣泛,是許多分布式系統(tǒng)的基礎(chǔ)。
[0004]上述進程間通信機制中,操作系統(tǒng)內(nèi)進程間通信機制不支持跨操作系統(tǒng)進程間通信,導(dǎo)致通信透明度不夠的問題;支持分布式系統(tǒng)的進程間通信機制要經(jīng)過底層的網(wǎng)絡(luò)通信、協(xié)議棧處理,不滿足分布嵌入式系統(tǒng)的高實時性特點,也無法將操作系統(tǒng)內(nèi)和跨操作系統(tǒng)進程間通信統(tǒng)一起來。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的技術(shù)解決問題為:克服現(xiàn)有技術(shù)不足,提出一種支持分布式系統(tǒng)的透明進程間通信系統(tǒng)及方法,解決了現(xiàn)有的進程間通信技術(shù)無法同時滿足高透明度、高效率的問題,統(tǒng)一了操作系統(tǒng)內(nèi)部進程間通信和跨操作系統(tǒng)進程間通信,滿足分布式實時IPC的兩個重要特性:透明性和實時性。
[0006]本發(fā)明的技術(shù)解決方案是:一種支持分布式系統(tǒng)的透明進程間通信系統(tǒng),包括:多個通信節(jié)點,每個節(jié)點包括進程模塊11和進程模塊12、通信處理模塊、鏈路發(fā)送進程模塊、鏈路接收進程模塊;當(dāng)節(jié)點接收通信系統(tǒng)內(nèi)的其它節(jié)點發(fā)送的消息時,該節(jié)點只需要一個進程模塊11,將接收通信系統(tǒng)內(nèi)的其它節(jié)點發(fā)送的消息的節(jié)點中的進程模塊11作為進程模塊21,即命名為進程模塊21模塊;
[0007]為每個進程設(shè)定一個唯一進程ID號,節(jié)點內(nèi)進程間通信或節(jié)點間進程間通信時,以進程ID號為通信地址進行消息收發(fā);
[0008]進程ID號需要滿足一下條件:①進程ID號由用戶創(chuàng)建該進程時指定,保證該ID號在一個通信系統(tǒng)內(nèi)是唯一的;?針對每個節(jié)點為進程ID進行分段,每個節(jié)點上的進程ID號屬于同一號碼段;
[0009]通信處理模塊為進程模塊11、進程模塊12、鏈路發(fā)送進程模塊和鏈路接收進程模塊創(chuàng)建一個先入先出型(FIFO)接收隊列,用來存放接收到的消息,消息包括消息頭和消息體,消息頭包括:發(fā)送進程ID、接收進程ID和消息體長度;
[0010]鏈路發(fā)送進程模塊負責(zé)該節(jié)點通過通信鏈路向通信系統(tǒng)內(nèi)的其它節(jié)點發(fā)送消息,該通信鏈路用鏈路發(fā)送進程模塊執(zhí)行進程的進程ID號命名,即鏈路號;鏈路接收進程模塊負責(zé)接收通信系統(tǒng)內(nèi)的其它節(jié)點通過通信鏈路向該節(jié)點發(fā)送的消息;每個鏈路發(fā)送進程模塊執(zhí)行一個發(fā)送進程,對應(yīng)一條指向發(fā)送進程要發(fā)送的消息中設(shè)定的接收進程ID號對應(yīng)的進程模塊21所在節(jié)點的物理鏈路;
[0011]在每個節(jié)點的通信處理模塊中創(chuàng)建一個路由表,該路由表包括了接收進程ID號所屬號碼段和從發(fā)送進程所在節(jié)點到該接收進程所在節(jié)點的通信鏈路的鏈路號;如果接收進程與發(fā)送進程在同一個節(jié)點內(nèi),那么該鏈路號對應(yīng)的通信鏈路為通信處理模塊自身,即進程模塊12發(fā)送消息給通信處理模塊轉(zhuǎn)發(fā)至進程模塊11的先入先出型(FIFO)接收隊列中;如果接收進程與發(fā)送進程不在同一節(jié)點,那么通信鏈路是鏈路發(fā)送進程模塊執(zhí)行的進程ID號,即鏈路號,對應(yīng)的通信鏈路;
[0012]在一個節(jié)點內(nèi),當(dāng)進程模塊12需要發(fā)送消息時,首先向通信處理模塊申請一塊內(nèi)存區(qū)域,通信處理模塊根據(jù)進程模塊12的申請分配一塊內(nèi)存區(qū)域,作為消息存放載體,并把分配的內(nèi)存區(qū)域地址,即消息載體地址,反饋給進程模塊12,進程模塊12根據(jù)反饋回的消息載體地址,把發(fā)送進程的ID號、接收進程的ID號和消息體長度寫入發(fā)送消息的消息頭,把需要發(fā)送的信息內(nèi)容寫入消息體,然后進程模塊12把消息載體地址傳遞給通信處理豐吳塊;
[0013]通信處理模塊根據(jù)消息載體地址,獲取該消息的消息頭中的接收進程的ID號,根據(jù)該接收進程的ID號,在步驟(4)創(chuàng)建的路由表中查找從發(fā)送進程所在節(jié)點到該接收進程所在節(jié)點的通信鏈路的鏈路號,如果該鏈路號對應(yīng)的通信鏈路為通信處理模塊自身,通信處理模塊將消息載體地址發(fā)送給進程模塊11,并存放在進程模塊11中的先入先出型(FIFO)接收隊列中,如果進程模塊11處于等待接收消息狀態(tài),使進程模塊11恢復(fù)工作狀態(tài);如果該鏈路號對應(yīng)的通信鏈路為鏈路發(fā)送進程模塊執(zhí)行進程的進程ID號,即鏈路號所對應(yīng)的通信鏈路,通信處理模塊將消息載體地址發(fā)送給鏈路發(fā)送進程模塊,并存放在鏈路發(fā)送進程模塊中的先入先出型(FIFO)接收隊列中,然后該鏈路發(fā)送進程模塊從該鏈路發(fā)送進程模塊中的先入先出型(FIFO)接收隊列中讀取消息載體地址,并將消息載體地址對應(yīng)的消息,通過物理鏈路發(fā)送給進程模塊21所在的節(jié)點的鏈路接收進程模塊,如果該鏈路接收進程模塊處于等待接收消息狀態(tài),使該鏈路接收進程模塊恢復(fù)為工作狀態(tài);進程模塊21所在的節(jié)點的鏈路接收進程模塊向進程模塊21所在的節(jié)點的通信處理模塊申請一塊內(nèi)存區(qū)域,該通信處理模塊根據(jù)進程模塊21所在的節(jié)點的鏈路接收進程模塊的申請,分配一塊內(nèi)存區(qū)域作為消息存放載體,并把分配的內(nèi)存區(qū)域地址,即消息載體地址,反饋給進程模塊21所在的節(jié)點的鏈路接收進程模塊,進程模塊21所在的節(jié)點的鏈路接收進程模塊根據(jù)反饋回的消息載體地址,把從物理鏈路接收的消息寫入分配的消息存放載體,然后進程模塊21所在的節(jié)點的鏈路接收進程模塊把消息載體地址傳遞給進程模塊21所在的節(jié)點的通信處理模塊后轉(zhuǎn)發(fā)給進程21 ;
[0014]當(dāng)進程模塊11接收本節(jié)點內(nèi)部進程12傳來的消息時,判斷進程模塊11的先入先出型(FIFO)接收隊列中是否存有消息載體地址,如果存有消息載體地址,進程模塊11從進程模塊11的先入先出型(FIFO)接收隊列中讀取消息載體地址,根據(jù)該消息載體地址從進程模塊11所在節(jié)點的通信處理模塊讀取消息;否則,進程模塊11不工作,等待消息存入進程模塊11的先入先出型(FIFO)接收隊列中,完成節(jié)點內(nèi)透明進程間通信的消息接收;
[0015]當(dāng)進程模塊21接收通信系統(tǒng)內(nèi)的其它節(jié)點中的進程模塊12發(fā)送來的消息時,判斷進程模塊21的先入先出型(FIFO)接收隊列中是否存有消息載體地址,如果存有消息載體地址,進程模塊21從進程模塊11的先入先出型(FIFO)接收隊列中讀取消息載體地址,根據(jù)該消息載體地址從進程模塊21所在節(jié)點的通信處理模塊讀取消息;否則,進程模塊21不工作,等待消息存入進程模塊21的先入先出型(FIFO)接收隊列中,完成節(jié)點間透明進程間通信的消息接收。
[0016]一種支持分布式系統(tǒng)的透明進程間通信方法,步驟如下:
[0017](1)為每個進程設(shè)定一個唯一進程ID號,節(jié)點內(nèi)進程間通信或節(jié)點間進程間通信時,以進程ID號為通信地址進行消息收發(fā);
[0018](2)進程ID號需要滿足一下條件:①進程ID號由用戶創(chuàng)建該進程時指定,保證該ID號在一個通信系統(tǒng)內(nèi)是唯一的;②針對每個節(jié)點為進程ID進行分段,每個節(jié)點上的進程ID號屬于同一號碼段;
[0019](3)通信處理模塊為進程模塊11、進程模塊12、鏈路發(fā)送進程模塊和鏈路接收進程模塊創(chuàng)建一個先入先出型(FIFO)接收隊列,用來存放接收到的消息,消息包括消息頭和消息體,消息頭包括:發(fā)送進程ID、接收進程ID和消息體長度;
[0020](4)鏈路發(fā)送進程模塊負責(zé)該節(jié)點通過通信鏈路向通信系統(tǒng)內(nèi)的其它節(jié)點發(fā)送消息,該通信鏈路用鏈路發(fā)送進程模塊執(zhí)行進程的進程ID號命名,即鏈路號;鏈路接收進程模塊負責(zé)接收通信系統(tǒng)內(nèi)的其它節(jié)點通過通信鏈路向該節(jié)點發(fā)送的消息,并把接收到的消息轉(zhuǎn)發(fā)出去;每個鏈路發(fā)送進程模塊執(zhí)行一個發(fā)送進程,對應(yīng)一條指向發(fā)送進程要發(fā)送的消息中設(shè)定的接收進程ID號對應(yīng)的進程模塊21所在節(jié)點的物理鏈路;每個鏈路接收進程模塊執(zhí)行一個接收進程;
[0021](5)在每個節(jié)點的通信處理模塊中創(chuàng)建一個路由表,該路由表包括了接收進程ID號所屬號碼段和從發(fā)送進程所在節(jié)點到該接收進程所在節(jié)點的通信鏈路的鏈路號;如果接收進程與發(fā)送進程在同一個節(jié)點內(nèi),那么該鏈路號對應(yīng)的通信鏈路為通信處理模塊自身,即進程模塊12發(fā)送消息給通信處理模