專利名稱::基于cpu總線互聯(lián)的底層通信協(xié)議實現(xiàn)方法
技術(shù)領(lǐng)域:
:本發(fā)明一種基于CPU總線互聯(lián)的底層通信協(xié)議實現(xiàn)方法,具體涉及一種集群板內(nèi)系統(tǒng)CPU通過總線互聯(lián)通信的方法,屬于計算機系統(tǒng)通信技術(shù)研究領(lǐng)域,尤其是涉及一種以共享buffer方案實現(xiàn)系統(tǒng)間通信的技術(shù)。
背景技術(shù):
:集群系統(tǒng)由于具有投資小,研制周期短,性能價格比高,可擴展性高,使用方便等特點,再加上可移植異構(gòu)編程環(huán)境PVM和標準的消息傳遞平臺MPI等并行編程環(huán)境的日益普及,目前已經(jīng)成為高性能計算領(lǐng)域重要的發(fā)展方向。然而集群系統(tǒng)的通信網(wǎng)絡(luò)的性能往往成為整個集群式系統(tǒng)性能的瓶頸,目前主要存在的問題是通信帶寬低、延時大、通信網(wǎng)絡(luò)的可擴展性差等缺點,為了改善集群系統(tǒng)的通信性能,解決集群網(wǎng)絡(luò)可擴展性的問題,現(xiàn)在基本有兩個走勢,一是為集群系統(tǒng)設(shè)計專用網(wǎng)絡(luò),以此來改善集群系統(tǒng)的通信,二是對于單機在板內(nèi)采用大規(guī)模處理器系統(tǒng),通過總線技術(shù)實現(xiàn)芯片級、主板級、系統(tǒng)級的通信。設(shè)計專用通信網(wǎng)絡(luò)MyrinelQsNet、InfiniBand是為解決集群系統(tǒng)通信問題設(shè)計的專用通信網(wǎng)絡(luò),其中InfiniBand網(wǎng)絡(luò)是一種全新的、功能強大、被設(shè)計用來支持基礎(chǔ)設(shè)施互連的體系結(jié)構(gòu),被工業(yè)界的頂級公司所支持,是唯一既提供機箱內(nèi)底板互連解決方案,又可以實現(xiàn)機箱間的高帶寬互連,把I/O和SAN統(tǒng)一起來的標準。使用總線技術(shù)實現(xiàn)芯片級、主板級、系統(tǒng)級的通信未來隨著工藝的提升多核芯片的規(guī)模也將隨之擴大,互聯(lián)結(jié)構(gòu)直接決定整體系統(tǒng)的規(guī)模及可擴展性,需要既能滿足當前結(jié)構(gòu)規(guī)模的需要,同時又要為未來的擴展設(shè)計提供便利。HyperTransport總線在此背景下應(yīng)運而生,它不僅可以解決高速CPU與外設(shè)間的互聯(lián)的問題,同時也為CPU間的互聯(lián)提供了解決方案。通信協(xié)議TCP/IP:TCP/IP通訊協(xié)議是人們最為熟知的應(yīng)用于互聯(lián)網(wǎng)通信的協(xié)議,采用了四層(應(yīng)用層,傳輸層,互連網(wǎng)絡(luò)層,網(wǎng)絡(luò)接口層)的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的功能來完成自己的需求,存在的不足是由于協(xié)議實現(xiàn)過于復(fù)雜,通信效率很低。RDP:RDP協(xié)議是ReliableDataProtocol的簡寫,稱為可靠數(shù)據(jù)協(xié)議。RDP協(xié)議是面向連接的傳輸層協(xié)議,可以提供可靠的數(shù)據(jù)傳輸,其原理和TCP協(xié)議相似,都是采用序號和重傳機制來保證數(shù)據(jù)正確到達目的節(jié)點。RDP協(xié)議和TCP協(xié)議的最大不同是TCP是面向字節(jié)流的,而RDP協(xié)議是面向消息的,即面向數(shù)據(jù)包流的,存在的不足是應(yīng)用范圍較窄。VMMC=VMMC是一種基于虛擬內(nèi)存映射的通信機制,它支持消息數(shù)據(jù)在通信進程的虛擬地址空間之間進行有保護的直接傳送,可以提供有序、可靠和高效的消息傳遞并滿足多種類型應(yīng)用程序的通信需求,缺點是需要專門的硬件來支持。ActiveMessage:ActiveMessage是美國California大學(xué)Berkeley分校的Eicken等人在1992年提出的一種異步通信機制,它采用了與傳統(tǒng)的通信機制完全不同的設(shè)計思路,更直接地使用通信硬件提供的功能,存在的不足是在死鎖處理和同步上較差。FastSockets:FastSocketsCaliforniaic^BerkeleyCuller教授等于1996年開發(fā)的一種面向局域網(wǎng)的通信軟件,它采用新的高效通信協(xié)議在用戶空間實現(xiàn)了網(wǎng)絡(luò)通信協(xié)議(TCP/IP),使得通信過程中軟件開銷最小,同時又能保持FastSockets與現(xiàn)有應(yīng)用程序以及廣域網(wǎng)通信協(xié)議的兼容性,存在的不足是需要專用的平臺接口才能實現(xiàn)。綜上所訴,集群通信正在朝著兩個方向走,一是為集群系統(tǒng)設(shè)計專用的網(wǎng)絡(luò),二是在板內(nèi)使用大規(guī)模處理器,通過高速總線互聯(lián)的技術(shù)實現(xiàn)芯片間、甚至是系統(tǒng)間的通信任務(wù)。
發(fā)明內(nèi)容本發(fā)明的目的在于提供一種基于CPU總線互聯(lián)的底層通信協(xié)議實現(xiàn)方法,為板內(nèi)CPU通過總線互聯(lián)的系統(tǒng)提供共享buffer的通信方式,優(yōu)勢在于采用共享buffer方式的通信效率遠遠高于采用以太網(wǎng)或者是IB網(wǎng)絡(luò)實現(xiàn)的主機間的通信。本系統(tǒng)的特點在于CPU通過總線進行互聯(lián)的系統(tǒng)彼此間可以進行直接內(nèi)存訪問。本發(fā)明在基于系統(tǒng)間可以共享物理內(nèi)存的機制上,對于每一個系統(tǒng)都分配出一塊物理空間,為各個系統(tǒng)共享,這樣系統(tǒng)間的通信就可以通過直接讀、寫遠程主機的共享buffer來實現(xiàn)系統(tǒng)間的通信。本發(fā)明一種基于CPU總線互聯(lián)的底層通信協(xié)議實現(xiàn)方法,是一種通過系統(tǒng)間共享物理內(nèi)存的方式實現(xiàn)系統(tǒng)間的通信,具體實現(xiàn)方式如下步驟一、定義地址映射對于板內(nèi)的各個系統(tǒng)而言,系統(tǒng)間是獨立的,劃分的buffer地址范圍在物理上是一致的,系統(tǒng)間實現(xiàn)buffer共享,需要每個系統(tǒng)對外都能提供邏輯地址空間,之后系統(tǒng)間的互訪就可以通過訪問邏輯地址空間實現(xiàn)。實現(xiàn)邏輯地址到物理地址變換可以通過HTl地址映射來完成,每個HT控制器提供了最多八個可用的地址映射窗口,現(xiàn)考慮的地址映射方案采用雙向環(huán)的策略,一個是順時針環(huán),一個是逆時針環(huán),這樣的設(shè)計使得每個系統(tǒng)都能訪問其相鄰的系統(tǒng)以及其對角線的系統(tǒng),并且使得訪問對角線的系統(tǒng)可以采用不同的環(huán)路徑到達,這樣的設(shè)計保證在一個環(huán)出現(xiàn)問題的情況下,可以通過另一個環(huán)來完成系統(tǒng)間的通信任務(wù)。步驟二、定義內(nèi)核數(shù)據(jù)結(jié)構(gòu)和預(yù)留sbuf的結(jié)構(gòu)本通信協(xié)議的任務(wù)是完成主機間的數(shù)據(jù)傳輸?shù)娜蝿?wù),主要包括數(shù)據(jù)發(fā)送和數(shù)據(jù)接收,對于收發(fā)的數(shù)據(jù)不僅要記錄發(fā)送、接收的具體數(shù)據(jù),還要記錄收發(fā)收據(jù)的協(xié)議描述信息,類似于TCP/IP協(xié)議的頭部,在內(nèi)核中需要開辟空間維護四個隊列,依次是“消息發(fā)送隊列”、“消息發(fā)送完成隊列”、“消息接收隊列”、“消息接收完成隊列”?!跋l(fā)送隊列”主要記錄的是上層應(yīng)用程序發(fā)送的消息,這些發(fā)送的消息還沒有通知給消息的接收方?!跋l(fā)送完成隊列”記錄的上層應(yīng)用程序發(fā)送的消息,這些消息已經(jīng)通知給消息的接收方,消息的接收方還沒有傳遞消息接收完成的通知?!跋⒔邮贞犃小庇涗浿h程主機發(fā)給本主機的消息,記錄著這些消息的基本信息,如數(shù)據(jù)類型以及數(shù)據(jù)量大小、數(shù)據(jù)存放在buffer中位置等的信息,本機可以根據(jù)這些信息獲取遠程主機發(fā)給本主機的數(shù)據(jù)?!跋⒔邮胀瓿申犃小庇涗浿l(fā)送方發(fā)給本主機消息的記錄,接收方已將這些消息提交給了上層應(yīng)用程序,但還沒有反饋給消息的發(fā)送方。此外,在內(nèi)核中還需要開辟空間記錄數(shù)據(jù)buffer的使用,包括為基于HT互聯(lián)的通信模塊預(yù)留的數(shù)據(jù)buffer哪些已經(jīng)被使用,哪些可以使用,可以使用數(shù)據(jù)buffer的單元大小等信息。預(yù)留的sbuf主要是用于兩臺通信的主機交換信息使用,這是兩臺獨立主機溝通的唯一渠道,這片buffer空間是操作系統(tǒng)為基于HT互聯(lián)的通信模塊預(yù)留出的空間,對于這片空間操作系統(tǒng)不用于分配,而是把對這片空間的使用權(quán)完全交給基于HT互聯(lián)的通信模塊,通信模塊將這片預(yù)留的sbuf進行了劃分,具體分為兩個部分,一部分記錄系統(tǒng)交互的信息,一部分記錄兩個系統(tǒng)間具體傳輸?shù)臄?shù)據(jù)。后一部分比較簡單,僅僅記錄系統(tǒng)間交互的數(shù)據(jù),它由buffer管理結(jié)構(gòu)對其進行管理。第一部分比較復(fù)雜,因為涉及到兩個系統(tǒng)對這片預(yù)留buffer區(qū)域的操作,互斥的問題需要重點解決,下面做以介紹。記錄系統(tǒng)交互的信息部分這部分主要涉及兩個結(jié)構(gòu),一個是“sbuf接收隊列”,一個是“sbuf接收完成隊列”。這兩個隊列都是供遠程主機寫入,本機讀取的隊列。對于“sbuf接收隊列”而言,它主要是接收其他主機發(fā)給本主機的消息,這些消息僅僅包括消息頭,這些消息頭給出了發(fā)送數(shù)據(jù)具體存放的位置,數(shù)據(jù)的長度,數(shù)據(jù)的類型等信息,本機能夠根據(jù)這些消息頭所表達的信息,取得消息所包含的數(shù)據(jù),這里取數(shù)據(jù)的操作主要是操作遠端內(nèi)存,因為接收的數(shù)據(jù)真正是存放在消息的發(fā)送方?!皊buf接收完成隊列”存放的是數(shù)據(jù)接收方主機通告的數(shù)據(jù)已經(jīng)接收完的通告,發(fā)送方根據(jù)這個通告,得知發(fā)送給接收方的數(shù)據(jù)哪些已經(jīng)被提交給上層應(yīng)用程序,已經(jīng)提交的數(shù)據(jù),發(fā)送方需要釋放數(shù)據(jù)所占用的buffer空間。由于對“sbuf接收隊列”和“sbuf接收完成隊列”這個隊列的操作是由兩臺主機來完成,通常的鎖機制在這里并不能使用,為了保證對這些預(yù)留buffer操作的互斥性,在sbuf中設(shè)置了一些代表鎖結(jié)構(gòu)的標識一些特殊的標識并使用一定的策略來達到互斥的效果。下面將具體的介紹如何利用這些標識和相關(guān)的策略來達到對預(yù)留buffer操作的互斥性。對于兩臺主機都能訪問的結(jié)構(gòu)加入額外兩個鎖,不妨稱其為l0CkA,l0CkB,假設(shè)主機A和主機B是對共享buffer區(qū)域操作的兩臺主機,這片buffer空間是主機A為HT互聯(lián)通信預(yù)留的buffer空間,那么主機A對這片buffer的操作相當于操作本地內(nèi)存,主機B對這片buffer空間的操作相當于操作遠端內(nèi)存,主機A和主機B可以分別使用IockA和IockB鎖住這片空間,其中IockA與IockB在初始化階段都被設(shè)置為非鎖定狀態(tài),每臺主機想操作這片buffer空間都需要在對方?jīng)]有鎖定的情況下才可以。下面簡述一下過程,假如主機A想操作這片共享的空間,它先使用IockA把這片空間鎖住,之后獲取IockB這個鎖的狀態(tài),如果主機B沒有鎖定這片buffer空間那么它就可以操作,操作完成后,打開自己加的鎖,如果主機B已將buffer空間鎖定,主機A就直接打開自己加的鎖,不然會造成死鎖;對于主機B而言,它要想操作這片空間,也需要獲得對方的鎖,它首先通過自己的鎖IockB把共享的buffer鎖定,之后獲取IockA的狀態(tài),如果對方加鎖,它直接釋放掉自己加的鎖,如果鎖可以獲得,它并不能馬上操作這片空間,而是要多詢問幾次,如果鎖在詢問過程中一直都可以獲得,它才去操作這片空間,操作后釋放掉自己加的鎖,如果有一次詢問的結(jié)果是主機A已對buffer空間加鎖,主機B無條件釋放對這片buffer空間加上的鎖,原因在于這片buffer空間可能事先主機A和主機B對它都沒有操作,雙方的鎖都是打開的狀態(tài),主機A和主機B可能同時去獲取鎖,這樣就造成了主機A和主機B都對這片buffer空間有操作權(quán),這當然會出問題,為了避免這種情況的發(fā)生,采用了讓主機B這個操作遠端內(nèi)存的主機多次詢問的方式來避免該種情況的發(fā)生,即在主機A和主機B都同時獲得了對這片buffer空間的操作權(quán)時,其實最終能夠操作這片buffer空間的主機是主機A,主機B沒有對這片buffer空間做任何操作。步驟三、關(guān)鍵方法定義基于以上的數(shù)據(jù)結(jié)構(gòu),需要主要定義如下方法并實現(xiàn)才能保證通信協(xié)議正常運轉(zhuǎn)。定義的主要方法分別是“發(fā)送操作”,“接收操作”,“獲取buffer”,“釋放buffer”,“監(jiān)控發(fā)送隊列”,“監(jiān)控接收完成隊列”,“監(jiān)控Sbuf接收隊列”,“監(jiān)控Sbuf接收完成隊列”,下面分別加以介紹?!鞍l(fā)送操作”是通信協(xié)議為上層應(yīng)用程序提供的調(diào)用接口,它負責(zé)的功能是解析用戶的請求,具體包括解析應(yīng)用程序?qū)褦?shù)據(jù)發(fā)送到那里,數(shù)據(jù)的大小,數(shù)據(jù)的類型信息,發(fā)送函數(shù)根據(jù)這些信息去調(diào)用“獲取buffer”函數(shù),來確定剩余的預(yù)留buffer空間是否還能夠滿足用戶的請求,如果空間不夠,向用戶程序通告發(fā)送失敗的消息,如果可以滿足請求,那么發(fā)送函數(shù)將用戶要發(fā)送的數(shù)據(jù)由用戶空間拷貝到內(nèi)核空間,同時生產(chǎn)記錄表項,包括數(shù)據(jù)buffer使用的記錄,發(fā)送的消息記錄,之后獲取數(shù)據(jù)接收方的鎖,看是否可以把發(fā)送的信息通告給數(shù)據(jù)接收方(獲取鎖的過程在步驟二中有詳細的介紹),如果可以將通告信息通知給數(shù)據(jù)接收方,那么“發(fā)送操作”就向接收方的sbuf中寫入通告信息,同時生產(chǎn)發(fā)送完成表項插入到自己的發(fā)送完成隊列中,如果通告信息不能通告給數(shù)據(jù)的接收方,那么“發(fā)送操作”將生產(chǎn)發(fā)送表項,插入到自身的發(fā)送隊列,等待monitor的掃描對該隊列包含的請求做出處理?!敖邮詹僮鳌币彩峭ㄐ拍K為上層應(yīng)用程序提供的調(diào)用接口,這個函數(shù)主要負責(zé)解析用戶程序調(diào)用傳遞的參數(shù),根據(jù)數(shù)據(jù)來源、消息標示等信息在“接收隊列”中搜索,如果找到了匹配的項,說明數(shù)據(jù)已經(jīng)正確的接收,這時將數(shù)據(jù)提交給上層應(yīng)用程序,并釋放相應(yīng)的接收表項,數(shù)據(jù)提交后還需要通告消息發(fā)送方數(shù)據(jù)已正確接收,以便發(fā)送方能夠及時釋放掉已發(fā)送數(shù)據(jù)占用的buffer空間,對于這個操作,“接收操作”需要獲取消息發(fā)送方sbuf結(jié)構(gòu)的鎖(步驟二中詳細給出了獲得鎖的過程),如果消息發(fā)送方的sbuf中可以寫入接收完成通告表項,那么就將通告寫入到發(fā)送方的sbuf中的接收完成隊列中即可,如果不能寫入,就需要生產(chǎn)接收完成表項插入到自身的接收完成隊列中,等待monitor的掃描把通告發(fā)送給消息的發(fā)送方?!矮@取buffer”操作是根據(jù)申請的buffer大小信息,在數(shù)據(jù)buffer管理結(jié)構(gòu)中查找這樣的buffer,如果能夠找到,就分配buffer,并對buffer使用記錄做更改,如果不能分配buffer,就返回buffer請求失敗的信息?!搬尫舃uffer”要做的操作是根據(jù)調(diào)用的參數(shù)確定即將釋放buffer的起始地址和需要釋放buffer的大小,之后掃描數(shù)據(jù)buffer管理結(jié)構(gòu)的隊列,來完成具體buffer回收的操作,由于buffer的分配和釋放采用的是buddy算法,這是個成型的算法,這里不做過多介紹,由于buffer的分配和回收是獨立的模塊,在buffer管理中完全可以使用另一種分配算法來實現(xiàn)數(shù)據(jù)buffer的管理,由于這里關(guān)于buffer管理使用的buddy算法是本領(lǐng)域技術(shù)人員所公知的算法,所以不再做更多介紹,如果需要了解可以參考相關(guān)書籍?!氨O(jiān)控發(fā)送隊列”完成的功能是在monitor掃描該隊列時,首先確定隊列中是否有請求沒有得到處理,如果沒有,該操作什么都不做,如果有請求沒有處理,那么去獲得遠程主機的sbuf鎖(鎖獲取請參考步驟二),如果鎖獲取失敗,那么什么都不做,如果鎖獲取成功,再查看遠程Sbuf中可以接收的表項數(shù)目,如果為零,說明遠程主機的Sbuf中不能再接收新的表項,那么什么都不做,如果不為零,取發(fā)送隊列中表項數(shù)和遠程主機Sbuf中可以接收表項數(shù)中較小的值,將相應(yīng)的發(fā)送表項寫入到遠程主機的Sbuf的接收隊列中,同時需要釋放發(fā)送表項,并生產(chǎn)發(fā)送完成表項插入到發(fā)送完成隊列中,這之后需要相應(yīng)更改發(fā)送隊列、發(fā)送完成隊列、Sbuf接收隊列中的表項數(shù)目值?!氨O(jiān)控接收完成隊列”完成的功能是在monitor掃描該隊列時,確定是否有接收完成通告需要通知給消息的發(fā)送方,如果該隊列為空,什么都不做,如果隊列不空,說明有請求需要處理,之后獲取遠程主機Sbuf鎖(鎖獲取請參考步驟二),如果鎖獲取失敗,那么什么都不做,如果鎖獲取成功,再查看遠程Sbuf中可以接收的表項數(shù)目,如果為零,說明遠程主機的Sbuf中不能再接收新的表項,那么什么都不做,如果不為零,取接收完成隊列中表項數(shù)和遠程主機Sbuf中可以接收表項數(shù)中較小的值,將相應(yīng)的接收完成表項寫入到遠程主機的Sbuf的“接收完成隊列”中,同時需要釋放接收完成表項,這之后需要相應(yīng)更改接收完成隊列、Sbuf接收完成隊列中的表項數(shù)目值?!氨O(jiān)控sbuf接收隊列”完成的功能是首先獲取sbuf的鎖(鎖獲取請參考步驟二),如果鎖獲取失敗,什么都不做,如果鎖獲取成功,查看Sbuf中的表項數(shù)目,如果數(shù)目為零,什么都不做,如果數(shù)目不為零,那么在內(nèi)核空間申請與Sbuf中表項數(shù)目相應(yīng)的接收表項數(shù)目,考慮到在內(nèi)核空間去申請空間可能會失敗,那么會得到一個實際申請到的接收表項數(shù)目值,根據(jù)這個值,將Sbuf中的表項數(shù)目拷貝到接收隊列中,同時更改Sbuf中接收表項數(shù)目的值和接收隊列中表項數(shù)目的值?!氨O(jiān)控sbuf接收完成隊列”完成的功能是首先獲取sbuf的鎖(鎖獲取請參考步驟二),如果鎖獲取失敗,什么都不做,如果鎖獲取成功,查看Sbuf中的表項數(shù)目,如果數(shù)目為零,什么都不做,如果數(shù)目不為零,那么在發(fā)送完成隊列中搜索相應(yīng)的表項,將搜索到的表項記錄從發(fā)送完成隊列中銷毀,同時需要釋放該消息數(shù)據(jù)所占用的buffer單元,調(diào)用“釋放buffer”函數(shù)回收數(shù)據(jù)buffer,處理過sbuf中的所有表項后,那么更改sbuf接收完成隊列中表項的記錄數(shù)以及發(fā)送完成隊列中的表項數(shù)。步驟四、協(xié)議啟動、數(shù)據(jù)初始化階段本階段主要完成通信模塊中的一些信息初始化工作,主要包括在內(nèi)核中申請的一些記錄信息的初始化,為基于HT互聯(lián)的通信模塊預(yù)留的buffer空間的初始化,具體包括“發(fā)送隊列”,“發(fā)送完成隊列”,“接收隊列”,“接收完成隊列”的初始化,“數(shù)據(jù)buffer管理結(jié)構(gòu)”的初始化,“sbuf中鎖”的初始化,“sbuf中接收表項數(shù)目和接收完成表項數(shù)目”初始化,“sbuf中接收隊列”初始化,“sbuf中接收完成隊列”初始化。步驟五、monitor啟動,監(jiān)控各個隊列Monitor使用內(nèi)核定時器,在設(shè)定的時間到達時刻去掃描“發(fā)送隊列”,“接收完成隊列”,“sbuf接收隊列”,“sbuf接收完成隊列”,如果隊列中有請求需要處理,就調(diào)用相應(yīng)函數(shù)對該請求做出適當?shù)奶幚恚绻犃兄袩o需要處理的請求,monitor會繼續(xù)掃描下一個隊列,掃描隊列完成,重新設(shè)置定時器,之后采用休眠,在定時時刻再次到來時再去掃描各個隊列,monitor在協(xié)議啟動后處于一直運行的狀態(tài),直到協(xié)議關(guān)閉,這里可以對monitor掃描的時間做動態(tài)的調(diào)整,這個統(tǒng)計可以基于每次掃描處理請求的時間來做調(diào)整。步驟六、處理收發(fā)操作當用戶程序有數(shù)據(jù)收發(fā)請求時,將調(diào)用內(nèi)核中的通信模塊,對于發(fā)送操作,通信模塊負責(zé)對發(fā)送的信息做以記錄,并將數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間,并通知數(shù)據(jù)接收方數(shù)據(jù)已發(fā)送,等待數(shù)據(jù)接收方取數(shù)據(jù);對于數(shù)據(jù)接收操作,用戶程序調(diào)用處于內(nèi)核態(tài)下的通信模塊,通信模塊負責(zé)去查找要接收的數(shù)據(jù)是否已經(jīng)正確接收到,如果正確接收到,將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間,同時銷毀一些記錄信息,并通知數(shù)據(jù)發(fā)送方,數(shù)據(jù)接收已完成,發(fā)送方接收到接收完成通告將銷毀一些記錄信息同時釋放數(shù)據(jù)所占用的buffer空間,如果用戶程序要接收的數(shù)據(jù)還沒有正確接收,那么內(nèi)核模塊將不返回任何數(shù)據(jù),通告用戶程序數(shù)據(jù)未正確接收。步驟七,協(xié)議關(guān)閉階段本階段發(fā)生在卸載通信模塊階段,否則,該通信模塊將一直運行在內(nèi)核態(tài)下,為用戶的請求提供服務(wù),在模塊卸載階段,將銷毀在協(xié)議啟動階段所分配的內(nèi)核空間。本發(fā)明一種基于CPU總線互聯(lián)的底層通信協(xié)議實現(xiàn)方法,其優(yōu)點及功效在于采用共享buffer方式的通信效率遠遠高于采用以太網(wǎng)或者是IB網(wǎng)絡(luò)實現(xiàn)的主機間的通信。本發(fā)明在基于系統(tǒng)間可以共享物理內(nèi)存的機制上,對于每一個系統(tǒng)都分配出一塊物理空間,為各個系統(tǒng)共享,這樣系統(tǒng)間的通信就可以通過直接讀、寫遠程主機的共享buffer來實現(xiàn)系統(tǒng)間的通信。圖116片龍芯3互聯(lián)系統(tǒng)結(jié)構(gòu)2地址映射方案3協(xié)議運行流程框4預(yù)留buffer數(shù)據(jù)結(jié)構(gòu)5(a)數(shù)據(jù)發(fā)送流程5(b)數(shù)據(jù)接收流程6buffer管理流程7協(xié)議涉及的主要模塊及數(shù)據(jù)結(jié)構(gòu)具體實施例方式1.方法概述本專利使用共享內(nèi)存技術(shù)實現(xiàn)板上各個操作系統(tǒng)間的通信,各個操作系統(tǒng)都預(yù)留出一片buffer空間給基于HT互聯(lián)的通信模塊專用,對于每臺主機預(yù)留的buffer空間,其他的主機都可以通過邏輯地址空間來訪問,邏輯地址空間到物理地址空間的映射由HT控制器完成映射的過程,地址映射方案的配置可以采用多種方案,本專利中采用了順時針映射和逆時針映射相結(jié)合的方式,通過這樣的映射方式,每臺主機訪問相鄰的主機有一種方案,訪問邏輯對角線的主機,可以采用兩種不同的方式,即順時針的方式和逆時針的方式。在地址映射方案的基礎(chǔ)上,內(nèi)核通信模塊負責(zé)處理用戶提出的發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的請求,自動完成buffer空間的請求,信息的記錄,最終完成數(shù)據(jù)的發(fā)送和接收功能,如圖7,在內(nèi)核空間需要維護③④⑤⑥四個隊列,其中③④隊列記錄著發(fā)給其他主機消息的記錄,③隊列中記錄的消息還沒有通知給接收主機,④隊列記錄的消息已經(jīng)通知給了接收主機;⑤⑥隊列記錄的消息是其他主機發(fā)給本主機的消息,主機可以根據(jù)這些記錄通過遠程內(nèi)存訪問獲得消息所包含的數(shù)據(jù),⑤隊列記錄的消息上層應(yīng)用程序還沒有取走,⑥隊列記錄的消息上層應(yīng)用程序已經(jīng)取走,等待給發(fā)送主機通告消息,以便發(fā)送方主機可以及時釋放已提交數(shù)據(jù)所占用的buffer空間。⑦⑧⑨⑩對應(yīng)的隊列開辟在基于HT互聯(lián)的通信模塊預(yù)留的buffer空間中,⑦隊列用于接收遠程主機發(fā)送的消息通告,本主機可以根據(jù)這些通告信息獲取發(fā)送的消息對應(yīng)的具體數(shù)據(jù),⑧隊列用于接收遠程主機發(fā)送的消息已接收的通告,主機根據(jù)這些通告能夠確定發(fā)給其他主機的消息數(shù)據(jù)哪些被提交給了上層應(yīng)用程序,已提交的消息數(shù)據(jù),主機將釋放其占用的buffer空間,⑨⑩用于確定哪些主機還在參與活動,它們維護了系統(tǒng)當前的信息和先前的信息,通過這些信息的比較能夠確定主機是否存活。①②對應(yīng)了是操作sbuf的鎖,其中①由遠程主機持有,遠程主機可對其進行修改,本主機只能讀取該鎖,②由本主機持有,本主機可對該鎖進行修改,遠程主機只能讀取該鎖,①②使用的目的就在于使得兩臺主機能夠互斥的操作這片共享buffer空間。模塊A、B、C、D、E是協(xié)議運行中必不可少的模塊,模塊A完成地址映射的功能,這是協(xié)議能夠正常運行的基礎(chǔ),模塊B提供了對buffer的管理的功能,模塊C是對遠程主機的請求進行選擇處理的模塊,現(xiàn)在選用的策略很簡單,即采用了先請求先服務(wù)的策略。模塊D用于搜集主機活動的信息,參與活動的主機是存活的,不參與活動的主機可能已經(jīng)死掉,通信模塊根據(jù)模塊D搜集的信息來確定消息路由的方案,避免將數(shù)據(jù)發(fā)往或經(jīng)過死掉的主機。模塊E用于對數(shù)據(jù)傳輸錯誤做出恰當?shù)奶幚?,如果傳輸?shù)臄?shù)據(jù)經(jīng)過校驗發(fā)生錯誤,模塊E能夠保證發(fā)送方將再次進行數(shù)據(jù)傳輸,最終使得數(shù)據(jù)能夠被正確傳輸。2.通信模塊的特點通信模塊封裝了所有通信的細節(jié),包括系統(tǒng)存在的感知,傳輸數(shù)據(jù)的校驗,為通信模塊預(yù)留buffer的管理,所有這些細節(jié)都由模塊自適應(yīng)的解決,通信模塊以模塊的形式插入到內(nèi)核,為上層應(yīng)用程序提供服務(wù),上層應(yīng)用程序以系統(tǒng)調(diào)用的形式來實現(xiàn)對通信模塊的調(diào)用。通信模塊接收到用戶的請求,完成與目的端內(nèi)核通信模塊的交互,最終完成數(shù)據(jù)收發(fā)的交互。3.系統(tǒng)結(jié)構(gòu)基于HT互聯(lián)的通信模塊按功能流程分為如下幾個模塊模塊一、地址映射對于板內(nèi)的各個系統(tǒng)而言,系統(tǒng)間是獨立的,劃分的buffer地址范圍在物理上是一致的,系統(tǒng)間實現(xiàn)buffer共享,需要每個系統(tǒng)對外都能提供邏輯地址空間,之后系統(tǒng)間的互訪就可以通過訪問邏輯地址空間實現(xiàn)。實現(xiàn)邏輯地址到物理地址變換可以通過HTl地址映射來完成,每個HT控制器提供了最多八個可用的地址映射窗口,用戶可自行配置其映射方式,地址映射配置需要具體考慮到編碼的易實現(xiàn)行、系統(tǒng)的可用性等因素,現(xiàn)考慮的地址映射方案采用雙向環(huán)的策略,一個是順時針環(huán),一個是逆時針環(huán),這樣的設(shè)計使得每個系統(tǒng)都能訪問其相鄰的系統(tǒng)以及其對角線的系統(tǒng),并且使得訪問對角線的系統(tǒng)可以采用不同的環(huán)路徑到達,這樣的設(shè)計保證在一個環(huán)出現(xiàn)問題的情況下,可以通過另一個環(huán)來完成系統(tǒng)間的通信任務(wù),如圖2所示,Al,A2,A3,A4構(gòu)成了順時針環(huán),Bi,B2,B3,B4構(gòu)成了逆時針環(huán),sysO想訪問sys2可以通過sysl也可以通過sys3,sysO訪問sysl使用的地址是sysl的邏輯地址,但sysl真正能夠識別的地址是它本身的物理地址,這樣的轉(zhuǎn)換由地址映射來完成,在sysO訪問sysl這個實例中,需要配置Al的地址映射方式,具體可以參考表1中的映射方式,表的第二列對應(yīng)于sysO訪問sysl使用的地址,表的第三列對應(yīng)于邏輯地址經(jīng)過地址映射后被轉(zhuǎn)換的地址,特別強調(diào)的是以O(shè)XlEO開頭的地址經(jīng)地址轉(zhuǎn)換后訪問的是相鄰的主機,以O(shè)XlEl開頭的地址經(jīng)地址轉(zhuǎn)換后訪問的是對角線的主機。本專利中并未采用全映射的方案,即每一個系統(tǒng)都可以通過順時針或者是逆時針訪問板上的其它系統(tǒng),因為這樣的映射方案會加大主機訪問遠程內(nèi)存的時間,影響通信協(xié)議的運行效率。Al<table>tableseeoriginaldocumentpage14</column></row><table><table>tableseeoriginaldocumentpage15</column></row><table>A3<table>tableseeoriginaldocumentpage16</column></row><table>A4<table>tableseeoriginaldocumentpage17</column></row><table><table>tableseeoriginaldocumentpage18</column></row><table><table>tableseeoriginaldocumentpage19</column></row><table><table>tableseeoriginaldocumentpage20</column></row><table><table>tableseeoriginaldocumentpage21</column></row><table>用buddy這種在Iinux內(nèi)存管理中使用的比較成熟的算法,可以高效的實現(xiàn)buffer的分配和回收的操作,盡量減少buffer碎片的產(chǎn)生。同時考慮到buffer在分配、回收中可能經(jīng)常產(chǎn)生需要拆分大的buffer結(jié)構(gòu),之后又合并小buffer為大的buffer這樣的操作,可以預(yù)留一片固定大小的buffer,在有buffer請求時將其分配出去,在buffer使用后只是簡單的將其標記已回收,如圖6,bufManager是一個數(shù)組,每個數(shù)組元素都包括三個域,分別對應(yīng)于包含表項的數(shù)目,指向第一個表項的指針,指向最后一個表項的指針,每個表項給出可以分配的buffer的大小,大小由bufManager下標i給出,由2~i指定可分配buffer單元的大小,鏈表鏈接的可分配buffer的地址是從小到大排序的,在buffer分配、回收的過程中也不會破壞這個性質(zhì)。模塊三、自適應(yīng)的buffer請求調(diào)度模塊考慮到應(yīng)用程序的需求,在通信協(xié)議的運行中,會接收到很多buffer的使用請求,但buffer容量有限,某些請求不能立即滿足,需緩存起來待請求可滿足時再行處理,對不同系統(tǒng)、不同進程的請求,需考慮處理順序的問題,即調(diào)度問題,好的調(diào)度策略應(yīng)該兼顧響應(yīng)時間、優(yōu)先級、吞吐量等因素,當然當系統(tǒng)任務(wù)很龐大很復(fù)雜時,如果調(diào)度策略的執(zhí)行要花費非常長的時間,簡單的調(diào)度策略應(yīng)該被采用,所以調(diào)度策略應(yīng)被設(shè)計成可動態(tài)調(diào)節(jié)的,根據(jù)系統(tǒng)任務(wù)的特點及系統(tǒng)buffer使用的情況來決定任務(wù)調(diào)度的策略,這里我們稱之為“自適應(yīng)的buffer請求調(diào)度策略”,這里我們采用了非常簡單的調(diào)度策略,即先來先服務(wù)的策略,可以針對通信的特點,采用適應(yīng)的策略。模塊四、可用性保障模塊基于HT互聯(lián)的通信協(xié)議需要在操作系統(tǒng)基礎(chǔ)上運行,一旦某個操作系統(tǒng)出現(xiàn)問題,其相應(yīng)的通信協(xié)議模塊也必然癱瘓,對于一個大節(jié)點上的各個系統(tǒng)而言,希望保證各個系統(tǒng)的通信協(xié)議模塊互不影響,所以需要設(shè)計這樣的可用性保證模塊,可以在個別的系統(tǒng)出現(xiàn)問題的情況下,其他系統(tǒng)的通信協(xié)議模塊依然可以正常工作,減小系統(tǒng)間的耦合,現(xiàn)在的實現(xiàn)是各個系統(tǒng)間約定一個溝通的機制,每個存在的系統(tǒng)都參與,每個系統(tǒng)在運行中都會在特定的時間向其它系統(tǒng)告知自身的存在并去查看其他系統(tǒng)是否在參與活動,如果發(fā)現(xiàn)某些系統(tǒng)處于非活躍狀態(tài),可以確定系統(tǒng)已死掉或是其通信模塊已不可用,這樣系統(tǒng)在進行數(shù)據(jù)收發(fā)時要采取相應(yīng)的策略避免將數(shù)據(jù)發(fā)給已死掉的系統(tǒng)或是在數(shù)據(jù)傳輸時避免經(jīng)過已不可用的系統(tǒng)。模塊五、錯誤處理模塊對于總線的通信,數(shù)據(jù)傳輸?shù)目煽啃苑浅8?,錯誤極少發(fā)生,但尚存在可能,基于HT互聯(lián)的通信協(xié)議設(shè)計中需要考慮各種情況,錯誤處理模塊是其協(xié)議可用性的重要一塊,當基于HT互聯(lián)的通信協(xié)議在通信中有錯誤發(fā)生時,需要通信協(xié)議模塊能發(fā)現(xiàn)錯誤,對錯誤做出及時處理。在現(xiàn)有的協(xié)議設(shè)計中,幾乎每種協(xié)議都加入了錯誤處理模塊,然而各系統(tǒng)采用的錯誤處理機制各不相同,有的僅僅是發(fā)現(xiàn)錯誤,之后通知發(fā)送方進行數(shù)據(jù)重傳,有的系統(tǒng)采用糾錯的機制,每種錯誤處理方式都有其優(yōu)缺點,對于我們的系統(tǒng)而言,由于其通信的可靠性非常高,所以錯誤處理模塊可做的盡量簡單,現(xiàn)采用簡單的發(fā)現(xiàn)錯誤并通知發(fā)送方進行數(shù)據(jù)重傳的機制,發(fā)現(xiàn)錯誤現(xiàn)采用crc校驗的機制,即發(fā)送方對傳輸?shù)臄?shù)據(jù)生成一個crc校驗值附在發(fā)送數(shù)據(jù)的尾端,接收端接收到數(shù)據(jù)后,也采用同樣的crc校驗方式對數(shù)據(jù)進行校驗,之后與數(shù)據(jù)尾端的crc校驗值去比較,如果相同,說明數(shù)據(jù)傳輸沒有錯誤發(fā)生,如果比較的值不同,說明數(shù)據(jù)在傳輸中有錯誤發(fā)生。4.系統(tǒng)工作流程初始化階段發(fā)送隊列和發(fā)送完成隊列的初始化接收隊列和接收完成隊列的初始化為基于HT互聯(lián)的通信模塊預(yù)留buffer的初始化,包括固定結(jié)構(gòu)的初始化和數(shù)據(jù)buffer的初始化數(shù)據(jù)buffer管理結(jié)構(gòu)的初始化Monitor啟動,監(jiān)控各個隊列階段數(shù)據(jù)收發(fā)的處理下面結(jié)合附圖,詳述具體實施步驟如下步驟一、定義地址映射對于板內(nèi)的各個系統(tǒng)而言,系統(tǒng)間是獨立的,劃分的buffer地址范圍在物理上是一致的,系統(tǒng)間實現(xiàn)buffer共享,需要每個系統(tǒng)對外都能提供邏輯地址空間,之后系統(tǒng)間的互訪就可以通過訪問邏輯地址實現(xiàn)。實現(xiàn)邏輯地址到物理地址變換可以通過HTl地址映射來完成,每個HT控制器提供了最多八個可用的地址映射窗口,現(xiàn)考慮的地址映射方案采用雙向環(huán)的策略,一個是順時針環(huán),一個是逆時針環(huán),這樣的設(shè)計使得每個系統(tǒng)都能訪問其相鄰的系統(tǒng)以及其對角線的系統(tǒng),并且使得訪問對角線的系統(tǒng)可以采用不同的環(huán)路徑到達,這樣的設(shè)計保證在一個環(huán)出現(xiàn)問題的情況下,可以通過另一個環(huán)來完成系統(tǒng)間的通信任務(wù),關(guān)于地址映射的例子可以參考模塊一中的介紹。步驟二、定義內(nèi)核數(shù)據(jù)結(jié)構(gòu)和預(yù)留sbuf的結(jié)構(gòu)本通信協(xié)議的任務(wù)是完成主機間的數(shù)據(jù)傳輸?shù)娜蝿?wù),主要包括數(shù)據(jù)發(fā)送和數(shù)據(jù)接收,對于收發(fā)的數(shù)據(jù)不僅要記錄發(fā)送、接收的具體數(shù)據(jù),還要記錄收發(fā)數(shù)據(jù)的協(xié)議描述信息,類似與TCP/IP協(xié)議的頭部,在內(nèi)核中需要開辟空間維護四個隊列,見圖7,依次是③④⑤⑥。③主要記錄的是上層應(yīng)用程序發(fā)送的消息,這些發(fā)送的消息還沒有通知給消息的接收方。④記錄的上層應(yīng)用程序發(fā)送的消息,這些消息已經(jīng)通知給消息的接收方,消息的接收方還沒有傳遞消息接收完成的通知。⑤記錄著遠程主機發(fā)給本主機的消息,記錄著這些消息的基本信息,如數(shù)據(jù)類型,以及數(shù)據(jù)量大小、數(shù)據(jù)存放在buffer中位置等的信息,本機可以根據(jù)這些信息獲取遠程主機發(fā)給本主機的數(shù)據(jù)。⑥記錄著發(fā)送方發(fā)給本主機消息的記錄,這些消息接收方已經(jīng)提交給上層應(yīng)用程序,但還沒有反饋給消息的發(fā)送方。此外,在內(nèi)核中還需要開辟空間記錄數(shù)據(jù)buffer的使用,包括為基于HT互聯(lián)的通信模塊預(yù)留的數(shù)據(jù)buffer哪些已經(jīng)被使用,那些可以使用,可以使用數(shù)據(jù)buffer的單元大小等信息。預(yù)留的sbuf主要是用于兩臺通信的主機交換信息使用,這是兩臺獨立主機溝通的唯一渠道,這片buffer空間是操作系統(tǒng)為基于HT互聯(lián)的通信模塊預(yù)留出的空間,對于這片空間操作系統(tǒng)不用于分配,而是把對這片空間的使用權(quán)完全交給基于HT互聯(lián)的通信模塊,通信模塊將這片預(yù)留的sbuf進行了劃分,具體分為兩個部分,一部分記錄系統(tǒng)交互的信息,一部分記錄兩個系統(tǒng)間具體傳輸?shù)臄?shù)據(jù)。后一部分比較簡單,僅僅記錄系統(tǒng)間交互的數(shù)據(jù),它由buffer管理結(jié)構(gòu)對其進行管理。第一部分比較復(fù)雜,因為涉及到兩個系統(tǒng)對這片預(yù)留buffer區(qū)域的操作,互斥的問題需要重點解決,下面做以介紹。這部分主要涉及兩個結(jié)構(gòu),一個是⑦,一個是⑧。這兩個隊列都是供遠程主機寫入,本機讀取的隊列。對于⑦而言,它主要是接收其他主機發(fā)給本主機的消息,這些消息僅僅包括消息頭,這些消息頭給出了發(fā)送數(shù)據(jù)具體存放的位置,數(shù)據(jù)的長度,數(shù)據(jù)的類型等信息,本機能夠根據(jù)這些消息頭所表達的信息,取得消息所包含的數(shù)據(jù),這里取數(shù)據(jù)的操作主要是操作遠端內(nèi)存,因為接收的數(shù)據(jù)真正是存放在消息的發(fā)送方。⑧存放的是數(shù)據(jù)接收方主機通告的數(shù)據(jù)已經(jīng)接收完的通告,發(fā)送方根據(jù)這個通告,得知發(fā)送給接收方的數(shù)據(jù)哪些已經(jīng)被提交給上層應(yīng)用程序,已經(jīng)提交的數(shù)據(jù),發(fā)送方需要釋放數(shù)據(jù)所占用的buffer空間。由于對這個隊列的操作是由兩臺主機來完成,通常的鎖機制在這里并不能使用,為了保證對這些預(yù)留buffer操作的互斥性,在sbuf中設(shè)置了一些特殊的標識并使用一定的策略來達到互斥的效果。下面給出了使用相應(yīng)標識和策略來達到互斥訪問共享buffer的介紹。對于兩臺主機都能訪問的結(jié)構(gòu)加入額外兩個鎖,不妨稱其為lockA,lockB,假設(shè)主機A和主機B是對共享buffer區(qū)域操作的兩臺主機,這片buffer空間是主機A預(yù)留的buffer空間,那么主機A對這片buffer的操作相當于操作本地內(nèi)存,主機B對這片buffer空間的操作相當于操作遠端內(nèi)存,主機A能夠通過IockA鎖住這片空間,主機B可以通過IockB來鎖住這片空間,其中IockA與IockB在初始化階段都設(shè)置為非鎖定的狀態(tài),這樣在兩臺主機想操作這片空間時都需要在對方?jīng)]有鎖定這片空間時才可以操作。下面簡述一下過程,假如主機A想操作這片共享的空間,它先使用IockA把這片空間鎖住,之后獲取IockB這個鎖的狀態(tài),如果對方?jīng)]有鎖定那么它就操作這片空間,操作完成后,打開自己加的鎖,如果不能獲得,就直接打開自己加的鎖,不然會造成死鎖;對于主機B而言,它要想操作這片空間,也需要獲得對方的鎖,它首先通過自己的鎖IockB把共享的buffer鎖定,之后獲取IockA的狀態(tài),如果對方加鎖,它直接釋放掉自己加的鎖,如果鎖可以獲得,它并不能馬上操作這片空間,而是要多詢問幾次,如果鎖在詢問過程中一直都可以獲得,它才去操作這片空間,操作后釋放掉自己加的鎖,如果有一次詢問的結(jié)果是對方已加鎖,主機B無條件釋放對這片buffer空間加上的鎖,原因在于這片空間可能事先主機A和主機B對它都沒有操作,雙方的鎖都是打開的狀態(tài),主機A和主機B可能同時去獲取鎖,這樣就造成了主機A和B都對這片buffer空間有操作權(quán),這當然會出問題,為了避免這種情況的發(fā)生,采用了讓主機B這個操作遠端內(nèi)存的主機多次詢問了方式來避免該種情況的方式,即在主機A和主機B都同時獲得了對這片buffer空間的操作權(quán)時,其實最終能夠操作這片buffer空間的主機是主機A,主機B沒有對這片buffer空間做任何操作。步驟三、關(guān)鍵方法定義基于以上的數(shù)據(jù)結(jié)構(gòu),需要主要定義如下方法并實現(xiàn)才能保證通信協(xié)議可以正常運轉(zhuǎn)。定義的主要方法分別是“發(fā)送操作”,“接收操作”,“獲取buffer”,“釋放buffer”,“監(jiān)控發(fā)送隊列”,“監(jiān)控接收完成隊列”,“監(jiān)控sbuf接收隊列”,“監(jiān)控sbuf接收完成隊列”,下面分別加以介紹?!薄鞍l(fā)送操作”是通信協(xié)議為上層應(yīng)用程序提供的調(diào)用接口,它負責(zé)的功能是解析用戶的請求,具體包括解析應(yīng)用程序?qū)褦?shù)據(jù)發(fā)送到那里,數(shù)據(jù)的大小,數(shù)據(jù)的類型信息,發(fā)送函數(shù)根據(jù)這些信息去調(diào)用“獲取buffer”函數(shù),來確定剩余的預(yù)留buffer空間是否還能夠滿足用戶的請求,如果空間不夠,向用戶程序通告發(fā)送失敗的消息,如果可以滿足請求,那么發(fā)送函數(shù)將用戶要發(fā)送的數(shù)據(jù)由用戶空間拷貝到內(nèi)核空間,同時生產(chǎn)記錄表項,包括數(shù)據(jù)buffer使用的記錄,發(fā)送的消息記錄,之后獲取數(shù)據(jù)接收方的鎖,看是否可以把發(fā)送的信息通告給數(shù)據(jù)接收方(獲取鎖的過程在步驟二中有詳細的介紹),如果可以將通告信息通知給數(shù)據(jù)接收方,那么“發(fā)送操作”就向接收方的sbuf中寫入通告信息,同時生產(chǎn)發(fā)送完成表項插入到自己的發(fā)送完成隊列中,如果通告信息不能通告給數(shù)據(jù)的接收方,那么“發(fā)送操作”將生產(chǎn)發(fā)送表項,插入到自身的發(fā)送隊列,等待monitor的掃描對該隊列包含的請求做出處理,圖5(a)給出數(shù)據(jù)發(fā)送流程框圖?!敖邮詹僮鳌币彩峭ㄐ拍K為上層應(yīng)用程序提供的調(diào)用接口,這個函數(shù)主要負責(zé)解析用戶程序調(diào)用傳遞的參數(shù),根據(jù)數(shù)據(jù)來源、消息標示等信息在“接收隊列”中搜索,如果找到了匹配的項,說明數(shù)據(jù)已經(jīng)正確的接收,這時將數(shù)據(jù)提交給上層應(yīng)用程序,并釋放相應(yīng)的接收表項,數(shù)據(jù)提交后還需要通告消息發(fā)送方數(shù)據(jù)已正確接收,以便發(fā)送方能夠及時釋放掉已發(fā)送數(shù)據(jù)占用的buffer空間,對于這個操作,“接收操作”需要獲取消息發(fā)送方sbuf結(jié)構(gòu)的鎖(步驟二中詳細給出了獲得鎖的過程),如果消息發(fā)送方的sbuf中可以寫入接收完成通告表項,那么就將通告寫入到發(fā)送方的sbuf中的接收完成隊列中即可,如果不能寫入,“接收完成”操作就需要生產(chǎn)接收完成表項插入到自身的接收完成隊列中,等待monitor的掃描把通告發(fā)送給消息的發(fā)送方,圖5(b)給出了數(shù)據(jù)接收的流程框圖?!矮@取buffer”操作是根據(jù)申請的buffe大小信息,在數(shù)據(jù)buffer管理結(jié)構(gòu)中查找這樣的buffer,如果能夠找到,就分配buffer,并對buffer使用記錄做更改,如果不能分配buffer,就返回buffer請求失敗的信息?!搬尫舃uffer”要做的操作是根據(jù)調(diào)用的參數(shù)確定即將釋放buffer的起始地址和需要釋放buffer的大小,之后掃描數(shù)據(jù)buffer管理結(jié)構(gòu)的隊列,來完成具體buffer回收的操作,由于buffer的分配和釋放采用的是buddy算法,這是個成型的算法,這里不做過多介紹,由于buffer的分配和回收是獨立的模塊,在buffer管理中完全可以使用另一種分配算法來實現(xiàn)數(shù)據(jù)buffer的管理,這里關(guān)于buffer管理使用的buddy算法不做更多介紹,如果需要可以參考相關(guān)書籍。“監(jiān)控發(fā)送隊列”完成的功能是在monitor掃描該隊列時,首先確定隊列中是否有請求沒有得到處理,如果沒有,該操作什么都不做,如果有請求沒有處理,那么去獲得遠程主機的sbuf鎖(鎖獲取請參考步驟二),如果鎖獲取失敗,那么什么都不做,如果鎖獲取成功,再查看遠程Sbuf中可以接收的表項數(shù)目,如果為零,說明遠程主機的Sbuf中不能再接收新的表項,那么什么都不做,如果不為零,取發(fā)送隊列中表項數(shù)和遠程主機Sbuf中可以接收表項數(shù)中較小的值,將相應(yīng)的發(fā)送表項寫入到遠程主機的Sbuf的接收隊列中,同時需要釋放發(fā)送表項,并生產(chǎn)發(fā)送完成表項插入到發(fā)送完成隊列中,這之后需要相應(yīng)更改發(fā)送隊列、發(fā)送完成隊列、Sbuf接收隊列中的表項數(shù)目值?!氨O(jiān)控接收完成隊列”完成的功能是在monitor掃描該隊列時,確定是否有接收完成通告需要通知給消息的發(fā)送方,如果該隊列為空,什么都不做,如果隊列不空,說明有請求需要處理,之后獲取遠程主機Sbuf鎖(鎖獲取請參考步驟二),如果鎖獲取失敗,那么什么都不做,如果鎖獲取成功,再查看遠程Sbuf中可以接收的表項數(shù)目,如果為零,說明遠程主機的Sbuf中不能再接收新的表項,那么什么都不做,如果不為零,取接收完成隊列中表項數(shù)和遠程主機Sbuf中可以接收表項數(shù)中較小的值,將相應(yīng)的接收完成表項寫入到遠程主機的Sbuf的接收完成隊列中,同時需要釋放接收完成表項,這之后需要相應(yīng)更改接收完成隊列、Sbuf接收完成隊列中的表項數(shù)目值?!氨O(jiān)控sbuf接收隊列”完成的功能是首先獲取sbuf的鎖(鎖獲取請參考步驟二),如果鎖獲取失敗,什么都不做,如果鎖獲取成功,查看Sbuf中的表項數(shù)目,如果數(shù)目為零,什么都不做,如果數(shù)目不為零,那么在內(nèi)核空間申請與Sbuf中表項數(shù)目相應(yīng)的接收表項數(shù)目,考慮到在內(nèi)核空間去申請空間可能會失敗,那么會得到一個實際申請到得接收表項數(shù)目值,根據(jù)這個值,將Sbuf中的表項數(shù)目拷貝到接收隊列中,同時更改Sbuf中接收表項數(shù)目的值和接收隊列中表項數(shù)目的值?!氨O(jiān)控sbuf接收完成隊列”完成的功能是首先獲取sbuf的鎖(鎖獲取請參考步驟二),如果鎖獲取失敗,什么都不做,如果鎖獲取成功,查看Sbuf中的表項數(shù)目,如果數(shù)目為零,什么都不做,如果數(shù)目不為零,那么在發(fā)送完成隊列中搜索相應(yīng)的表項,將搜索到的表項記錄從發(fā)送完成隊列中銷毀,同時需要釋放該消息數(shù)據(jù)所占用的buffer單元,調(diào)用“釋放buffer”函數(shù)回收數(shù)據(jù)buffer,處理過sbuf中的所有表項后,那么更改sbuf接收完成隊列中表項的記錄數(shù)以及發(fā)送完成隊列中的表項數(shù)。步驟四、協(xié)議啟動、數(shù)據(jù)初始化階段本階段主要完成通信模塊中的一些信息初始化工作,主要包括在內(nèi)核中申請的一些記錄信息的初始化,為基于HT互聯(lián)的通信模塊預(yù)留的buffer空間的初始化,具體包括“發(fā)送隊列”初始化,“發(fā)送完成隊列”初始化,“接收隊列”初始化,“接收完成隊列”初始化,“數(shù)據(jù)buffer管理結(jié)構(gòu)”初始化,“sbuf中鎖”初始化,“sbuf中接收表項數(shù)目和接收完成表項數(shù)目”初始化,“sbuf中接收隊列”初始化,“sbuf中接收完成隊列”初始化,其中圖4中給出了sbuf中鎖的描述,sbuf中接收隊列和接收完成隊列有著類似的結(jié)構(gòu),這里僅介紹sbuf中接收隊列,sbuf中的接收隊列需要設(shè)置為三份,分別與其他三臺主機共享,其中①③⑤是遠程主機所持有的鎖,②④⑥是本地主機所持有的鎖,關(guān)于鎖的獲取請參考步驟二。步驟五、monitor啟動,監(jiān)控各個隊列Monitor使用內(nèi)核定時器,在設(shè)定的時間到達時刻去掃描“發(fā)送隊列”,“接收完成隊列”,“sbuf接收隊列”,“sbuf接收完成隊列”,如果隊列中有請求需要處理,就調(diào)用相應(yīng)函數(shù)對該請求做出適當?shù)奶幚?,如果隊列中無需要處理的請求,monitor會繼續(xù)掃描下一個隊列,掃描隊列完成,重新設(shè)置定時器,之后采用休眠,在定時時刻再次到來時再去掃描各個隊列,monitor在協(xié)議啟動后處于一直運行的狀態(tài),直到協(xié)議關(guān)閉,這里可以對monitor掃描的時間做動態(tài)的調(diào)整,這個統(tǒng)計可以基于每次掃描處理請求的時間來做調(diào)整,圖3給出了協(xié)議運行的流程框圖。步驟六、處理收發(fā)操作當用戶程序有數(shù)據(jù)收發(fā)請求時,將調(diào)用內(nèi)核中的通信模塊,對于發(fā)送操作,通信模塊負責(zé)對發(fā)送的信息做以記錄,并將數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間,并通知數(shù)據(jù)接收方數(shù)據(jù)已發(fā)送,等待數(shù)據(jù)接收方取數(shù)據(jù);對于數(shù)據(jù)接收操作,用戶程序調(diào)用處于內(nèi)核態(tài)下的通信模塊,通信模塊負責(zé)去查找要接收的數(shù)據(jù)是否已經(jīng)正確接收到,如果正確接收到,將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間,同時銷毀一些記錄信息,并通知數(shù)據(jù)發(fā)送方,數(shù)據(jù)接收已完成,發(fā)送方接收到接收完成通告將銷毀一些記錄信息同時釋放數(shù)據(jù)所占用的buffer空間,如果用戶程序要接收的數(shù)據(jù)還沒有正確接收,那么內(nèi)核模塊將不返回任何數(shù)據(jù),通告用戶程序數(shù)據(jù)未正確接收,圖5(a)、圖5(b)分別給出數(shù)據(jù)發(fā)送和數(shù)據(jù)接收的流程圖,關(guān)于數(shù)據(jù)發(fā)送和接收的詳細過程請參考“發(fā)送操作”和“接收操作”。步驟七,協(xié)議關(guān)閉階段本階段發(fā)生在卸載通信模塊階段,否則,該通信模塊將一直運行在內(nèi)核態(tài)下,為用戶的請求提供服務(wù),在模塊卸載階段,將銷毀在協(xié)議啟動階段所分配的內(nèi)核空間。本發(fā)明為板內(nèi)CPU通過總線互聯(lián)的系統(tǒng)提供了共享buffer的通信方式,該通信協(xié)議能夠極大的改善集群板內(nèi)主機間的通信效率,同時有望在MPI庫中加入對該通信模塊的支持,最終將帶來集群系統(tǒng)通信效率的改善。權(quán)利要求一種基于CPU總線互聯(lián)的底層通信協(xié)議實現(xiàn)方法,是一種通過系統(tǒng)間共享物理內(nèi)存的方式實現(xiàn)系統(tǒng)間的通信,其特征在于該方法的具體實現(xiàn)方式如下步驟一、定義地址映射對于板內(nèi)的各個系統(tǒng)而言,系統(tǒng)間是獨立的,劃分的buffer地址范圍在物理上是一致的,系統(tǒng)間實現(xiàn)buffer共享,需要每個系統(tǒng)對外都能提供邏輯地址空間,之后系統(tǒng)間的互訪就可以通過訪問邏輯地址空間實現(xiàn);實現(xiàn)邏輯地址到物理地址變換可以通過HT1地址映射來完成,每個HT控制器提供了最多八個可用的地址映射窗口,現(xiàn)考慮的地址映射方案采用雙向環(huán)的策略,一個是順時針環(huán),一個是逆時針環(huán),這樣的設(shè)計使得每個系統(tǒng)都能訪問其相鄰的系統(tǒng)以及其對角線的系統(tǒng),并且使得訪問對角線的系統(tǒng)可以采用不同的環(huán)路徑到達,這樣的設(shè)計保證在一個環(huán)出現(xiàn)問題的情況下,可以通過另一個環(huán)來完成系統(tǒng)間的通信任務(wù);步驟二、定義內(nèi)核數(shù)據(jù)結(jié)構(gòu)和預(yù)留sbuf的結(jié)構(gòu)本通信協(xié)議的任務(wù)是完成主機間的數(shù)據(jù)傳輸?shù)娜蝿?wù),主要包括數(shù)據(jù)發(fā)送和數(shù)據(jù)接收,對于收發(fā)的數(shù)據(jù)不僅要記錄發(fā)送、接收的具體數(shù)據(jù),還要記錄收發(fā)收據(jù)的協(xié)議描述信息,類似于TCP/IP協(xié)議的頭部,在內(nèi)核中需要開辟空間維護四個隊列,依次是“消息發(fā)送隊列”、“消息發(fā)送完成隊列”、“消息接收隊列”、“消息接收完成隊列”;“消息發(fā)送隊列”主要記錄的是上層應(yīng)用程序發(fā)送的消息,這些發(fā)送的消息還沒有通知給消息的接收方;“消息發(fā)送完成隊列”記錄的上層應(yīng)用程序發(fā)送的消息,這些消息已經(jīng)通知給消息的接收方,消息的接收方還沒有傳遞消息接收完成的通知;“消息接收隊列”記錄著遠程主機發(fā)給本主機的消息,記錄著這些消息的基本信息,如數(shù)據(jù)類型以及數(shù)據(jù)量大小、數(shù)據(jù)存放在buffer中位置等的信息,本機可以根據(jù)這些信息獲取遠程主機發(fā)給本主機的數(shù)據(jù);“消息接收完成隊列”記錄著發(fā)送方發(fā)給本主機消息的記錄,接收方已將這些消息提交給了上層應(yīng)用程序,但還沒有反饋給消息的發(fā)送方;此外,在內(nèi)核中還需要開辟空間記錄數(shù)據(jù)buffer的使用,包括為基于HT互聯(lián)的通信模塊預(yù)留的數(shù)據(jù)buffer哪些已經(jīng)被使用,哪些可以使用,可以使用數(shù)據(jù)buffer的單元大小等信息;預(yù)留的sbuf主要是用于兩臺通信的主機交換信息使用,這是兩臺獨立主機溝通的唯一渠道,這片buffer空間是操作系統(tǒng)為基于HT互聯(lián)的通信模塊預(yù)留出的空間,對于這片空間操作系統(tǒng)不用于分配,而是把對這片空間的使用權(quán)完全交給基于HT互聯(lián)的通信模塊,通信模塊將這片預(yù)留的sbuf進行了劃分,具體分為兩個部分,一部分記錄系統(tǒng)交互的信息,一部分記錄兩個系統(tǒng)間具體傳輸?shù)臄?shù)據(jù);后一部分比較簡單,僅僅記錄系統(tǒng)間交互的數(shù)據(jù),它由buffer管理結(jié)構(gòu)對其進行管理;第一部分比較復(fù)雜,因為涉及到兩個系統(tǒng)對這片預(yù)留buffer區(qū)域的操作,互斥的問題需要重點解決,下面做以介紹;記錄系統(tǒng)交互的信息部分這部分主要涉及兩個結(jié)構(gòu),一個是“sbuf接收隊列”,一個是“sbuf接收完成隊列”;這兩個隊列都是供遠程主機寫入,本機讀取的隊列;對于“sbuf接收隊列”而言,它主要是接收其他主機發(fā)給本主機的消息,這些消息僅僅包括消息頭,這些消息頭給出了發(fā)送數(shù)據(jù)具體存放的位置,數(shù)據(jù)的長度,數(shù)據(jù)的類型等信息,本機能夠根據(jù)這些消息頭所表達的信息,取得消息所包含的數(shù)據(jù),這里取數(shù)據(jù)的操作主要是操作遠端內(nèi)存,因為接收的數(shù)據(jù)真正是存放在消息的發(fā)送方;“sbuf接收完成隊列”存放的是數(shù)據(jù)接收方主機通告的數(shù)據(jù)已經(jīng)接收完的通告,發(fā)送方根據(jù)這個通告,得知發(fā)送給接收方的數(shù)據(jù)哪些已經(jīng)被提交給上層應(yīng)用程序,已經(jīng)提交的數(shù)據(jù),發(fā)送方需要釋放數(shù)據(jù)所占用的buffer空間;由于對“sbuf接收隊列”和“sbuf接收完成隊列”這個隊列的操作是由兩臺主機來完成,通常的鎖機制在這里并不能使用,為了保證對這些預(yù)留buffer操作的互斥性,在sbuf中設(shè)置了一些代表鎖結(jié)構(gòu)的標識一些特殊的標識并使用一定的策略來達到互斥的效果;下面將具體的介紹如何利用這些標識和相關(guān)的策略來達到對預(yù)留buffer操作的互斥性;對于兩臺主機都能訪問的結(jié)構(gòu)加入額外兩個鎖,稱其為lockA,lockB,假設(shè)主機A和主機B是對共享buffer區(qū)域操作的兩臺主機,這片buffer空間是主機A為HT互聯(lián)通信預(yù)留的buffer空間,那么主機A對這片buffer的操作相當于操作本地內(nèi)存,主機B對這片buffer空間的操作相當于操作遠端內(nèi)存,主機A和主機B可以分別使用lockA和lockB鎖住這片空間,其中l(wèi)ockA與lockB在初始化階段都被設(shè)置為非鎖定狀態(tài),每臺主機想操作這片buffer空間都需要在對方?jīng)]有鎖定的情況下才可以;下面簡述一下過程,假如主機A想操作這片共享的空間,它先使用lockA把這片空間鎖住,之后獲取lockB這個鎖的狀態(tài),如果主機B沒有鎖定這片buffer空間那么它就可以操作,操作完成后,打開自己加的鎖,如果主機B已將buffer空間鎖定,主機A就直接打開自己加的鎖,不然會造成死鎖;對于主機B而言,它要想操作這片空間,也需要獲得對方的鎖,它首先通過自己的鎖lockB把共享的buffer鎖定,之后獲取lockA的狀態(tài),如果對方加鎖,它直接釋放掉自己加的鎖,如果鎖可以獲得,它并不能馬上操作這片空間,而是要多詢問幾次,如果鎖在詢問過程中一直都可以獲得,它才去操作這片空間,操作后釋放掉自己加的鎖,如果有一次詢問的結(jié)果是主機A已對buffer空間加鎖,主機B無條件釋放對這片buffer空間加上的鎖,原因在于這片buffer空間可能事先主機A和主機B對它都沒有操作,雙方的鎖都是打開的狀態(tài),主機A和主機B可能同時去獲取鎖,這樣就造成了主機A和主機B都對這片buffer空間有操作權(quán),這當然會出問題,為了避免這種情況的發(fā)生,采用了讓主機B這個操作遠端內(nèi)存的主機多次詢問的方式來避免該種情況的發(fā)生,即在主機A和主機B都同時獲得了對這片buffer空間的操作權(quán)時,其實最終能夠操作這片buffer空間的主機是主機A,主機B沒有對這片buffer空間做任何操作;步驟三、關(guān)鍵方法定義基于以上的數(shù)據(jù)結(jié)構(gòu),需要主要定義如下方法并實現(xiàn)才能保證通信協(xié)議正常運轉(zhuǎn);定義的主要方法分別是“發(fā)送操作”,“接收操作”,“獲取buffer”,“釋放buffer”,“監(jiān)控發(fā)送隊列”,“監(jiān)控接收完成隊列”,“監(jiān)控sbuf接收隊列”,“監(jiān)控sbuf接收完成隊列”,下面分別加以介紹“發(fā)送操作”是通信協(xié)議為上層應(yīng)用程序提供的調(diào)用接口,它負責(zé)的功能是解析用戶的請求,具體包括解析應(yīng)用程序?qū)褦?shù)據(jù)發(fā)送到那里,數(shù)據(jù)的大小,數(shù)據(jù)的類型信息,發(fā)送函數(shù)根據(jù)這些信息去調(diào)用“獲取buffer”函數(shù),來確定剩余的預(yù)留buffer空間是否還能夠滿足用戶的請求,如果空間不夠,向用戶程序通告發(fā)送失敗的消息,如果可以滿足請求,那么發(fā)送函數(shù)將用戶要發(fā)送的數(shù)據(jù)由用戶空間拷貝到內(nèi)核空間,同時生產(chǎn)記錄表項,包括數(shù)據(jù)buffer使用的記錄,發(fā)送的消息記錄,之后獲取數(shù)據(jù)接收方的鎖,看是否可以把發(fā)送的信息通告給數(shù)據(jù)接收方,如果可以將通告信息通知給數(shù)據(jù)接收方,那么“發(fā)送操作”就向接收方的sbuf中寫入通告信息,同時生產(chǎn)發(fā)送完成表項插入到自己的發(fā)送完成隊列中,如果通告信息不能通告給數(shù)據(jù)的接收方,那么“發(fā)送操作”將生產(chǎn)發(fā)送表項,插入到自身的發(fā)送隊列,等待monitor的掃描對該隊列包含的請求做出處理;“接收操作”也是通信模塊為上層應(yīng)用程序提供的調(diào)用接口,這個函數(shù)主要負責(zé)解析用戶程序調(diào)用傳遞的參數(shù),根據(jù)數(shù)據(jù)來源、消息標示等信息在“接收隊列”中搜索,如果找到了匹配的項,說明數(shù)據(jù)已經(jīng)正確的接收,這時將數(shù)據(jù)提交給上層應(yīng)用程序,并釋放相應(yīng)的接收表項,數(shù)據(jù)提交后還需要通告消息發(fā)送方數(shù)據(jù)已正確接收,以便發(fā)送方能夠及時釋放掉已發(fā)送數(shù)據(jù)占用的buffer空間,對于這個操作,“接收操作”需要獲取消息發(fā)送方sbuf結(jié)構(gòu)的鎖,如果消息發(fā)送方的sbuf中可以寫入接收完成通告表項,那么就將通告寫入到發(fā)送方的sbuf中的接收完成隊列中即可,如果不能寫入,就需要生產(chǎn)接收完成表項插入到自身的接收完成隊列中,等待monitor的掃描把通告發(fā)送給消息的發(fā)送方;“獲取buffer”操作是根據(jù)申請的buffer大小信息,在數(shù)據(jù)buffer管理結(jié)構(gòu)中查找這樣的buffer,如果能夠找到,就分配buffer,并對buffer使用記錄做更改,如果不能分配buffer,就返回buffer請求失敗的信息;“釋放buffer”要做的操作是根據(jù)調(diào)用的參數(shù)確定即將釋放buffer的起始地址和需要釋放buffer的大小,之后掃描數(shù)據(jù)buffer管理結(jié)構(gòu)的隊列,來完成具體buffer回收的操作;“監(jiān)控發(fā)送隊列”完成的功能是在monitor掃描該隊列時,首先確定隊列中是否有請求沒有得到處理,如果沒有,該操作什么都不做,如果有請求沒有處理,那么去獲得遠程主機的sbuf鎖,如果鎖獲取失敗,那么什么都不做,如果鎖獲取成功,再查看遠程sbuf中可以接收的表項數(shù)目,如果為零,說明遠程主機的sbuf中不能再接收新的表項,那么什么都不做,如果不為零,取發(fā)送隊列中表項數(shù)和遠程主機sbuf中可以接收表項數(shù)中較小的值,將相應(yīng)的發(fā)送表項寫入到遠程主機的sbuf的接收隊列中,同時需要釋放發(fā)送表項,并生產(chǎn)發(fā)送完成表項插入到發(fā)送完成隊列中,這之后需要相應(yīng)更改發(fā)送隊列、發(fā)送完成隊列、sbuf接收隊列中的表項數(shù)目值;“監(jiān)控接收完成隊列”完成的功能是在monitor掃描該隊列時,確定是否有接收完成通告需要通知給消息的發(fā)送方,如果該隊列為空,什么都不做,如果隊列不空,說明有請求需要處理,之后獲取遠程主機sbuf鎖,如果鎖獲取失敗,那么什么都不做,如果鎖獲取成功,再查看遠程sbuf中可以接收的表項數(shù)目,如果為零,說明遠程主機的sbuf中不能再接收新的表項,那么什么都不做,如果不為零,取接收完成隊列中表項數(shù)和遠程主機sbuf中可以接收表項數(shù)中較小的值,將相應(yīng)的接收完成表項寫入到遠程主機的sbuf的“接收完成隊列”中,同時需要釋放接收完成表項,這之后需要相應(yīng)更改接收完成隊列、sbuf接收完成隊列中的表項數(shù)目值;“監(jiān)控sbuf接收隊列”完成的功能是首先獲取sbuf的鎖,如果鎖獲取失敗,什么都不做,如果鎖獲取成功,查看sbuf中的表項數(shù)目,如果數(shù)目為零,什么都不做,如果數(shù)目不為零,那么在內(nèi)核空間申請與sbuf中表項數(shù)目相應(yīng)的接收表項數(shù)目,考慮到在內(nèi)核空間去申請空間可能會失敗,那么會得到一個實際申請到的接收表項數(shù)目值,根據(jù)這個值,將sbuf中的表項數(shù)目拷貝到接收隊列中,同時更改sbuf中接收表項數(shù)目的值和接收隊列中表項數(shù)目的值;“監(jiān)控sbuf接收完成隊列”完成的功能是首先獲取sbuf的鎖,如果鎖獲取失敗,什么都不做,如果鎖獲取成功,查看sbuf中的表項數(shù)目,如果數(shù)目為零,什么都不做,如果數(shù)目不為零,那么在發(fā)送完成隊列中搜索相應(yīng)的表項,將搜索到的表項記錄從發(fā)送完成隊列中銷毀,同時需要釋放該消息數(shù)據(jù)所占用的buffer單元,調(diào)用“釋放buffer”函數(shù)回收數(shù)據(jù)buffer,處理過sbuf中的所有表項后,那么更改sbuf接收完成隊列中表項的記錄數(shù)以及發(fā)送完成隊列中的表項數(shù);步驟四、協(xié)議啟動、數(shù)據(jù)初始化階段本階段主要完成通信模塊中的一些信息初始化工作,主要包括在內(nèi)核中申請的一些記錄信息的初始化,為基于HT互聯(lián)的通信模塊預(yù)留的buffer空間的初始化,具體包括“發(fā)送隊列”,“發(fā)送完成隊列”,“接收隊列”,“接收完成隊列”的初始化,“數(shù)據(jù)buffer管理結(jié)構(gòu)”的初始化,“sbuf中鎖”的初始化,“sbuf中接收表項數(shù)目和接收完成表項數(shù)目”初始化,“sbuf中接收隊列”初始化,“sbuf中接收完成隊列”初始化;步驟五、monitor啟動,監(jiān)控各個隊列Monitor使用內(nèi)核定時器,在設(shè)定的時間到達時刻去掃描“發(fā)送隊列”,“接收完成隊列”,“sbuf接收隊列”,“sbuf接收完成隊列”,如果隊列中有請求需要處理,就調(diào)用相應(yīng)函數(shù)對該請求做出適當?shù)奶幚恚绻犃兄袩o需要處理的請求,monitor會繼續(xù)掃描下一個隊列,掃描隊列完成,重新設(shè)置定時器,之后采用休眠,在定時時刻再次到來時再去掃描各個隊列,monitor在協(xié)議啟動后處于一直運行的狀態(tài),直到協(xié)議關(guān)閉,這里可以對monitor掃描的時間做動態(tài)的調(diào)整,這個統(tǒng)計可以基于每次掃描處理請求的時間來做調(diào)整;步驟六、處理收發(fā)操作當用戶程序有數(shù)據(jù)收發(fā)請求時,將調(diào)用內(nèi)核中的通信模塊,對于發(fā)送操作,通信模塊負責(zé)對發(fā)送的信息做以記錄,并將數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間,并通知數(shù)據(jù)接收方數(shù)據(jù)已發(fā)送,等待數(shù)據(jù)接收方取數(shù)據(jù);對于數(shù)據(jù)接收操作,用戶程序調(diào)用處于內(nèi)核態(tài)下的通信模塊,通信模塊負責(zé)去查找要接收的數(shù)據(jù)是否已經(jīng)正確接收到,如果正確接收到,將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間,同時銷毀一些記錄信息,并通知數(shù)據(jù)發(fā)送方,數(shù)據(jù)接收已完成,發(fā)送方接收到接收完成通告將銷毀一些記錄信息同時釋放數(shù)據(jù)所占用的buffer空間,如果用戶程序要接收的數(shù)據(jù)還沒有正確接收,那么內(nèi)核模塊將不返回任何數(shù)據(jù),通告用戶程序數(shù)據(jù)未正確接收;步驟七,協(xié)議關(guān)閉階段本階段發(fā)生在卸載通信模塊階段,否則,該通信模塊將一直運行在內(nèi)核態(tài)下,為用戶的請求提供服務(wù),在模塊卸載階段,將銷毀在協(xié)議啟動階段所分配的內(nèi)核空間。全文摘要本發(fā)明涉及一種基于CPU總線互聯(lián)的底層通信協(xié)議實現(xiàn)方法,是一種通過系統(tǒng)間共享物理內(nèi)存的方式實現(xiàn)系統(tǒng)間的通信,其特征在于該方法的具體實現(xiàn)方式如下步驟一、定義地址映射;步驟二、定義內(nèi)核數(shù)據(jù)結(jié)構(gòu)和預(yù)留sbuf的結(jié)構(gòu);步驟三、關(guān)鍵方法定義;步驟四、協(xié)議啟動、數(shù)據(jù)初始化階段;步驟五、monitor啟動,監(jiān)控各個隊列;步驟六、處理收發(fā)操作;步驟七,協(xié)議關(guān)閉階段。本發(fā)明在基于系統(tǒng)間可以共享物理內(nèi)存的機制上,對于每一個系統(tǒng)都分配出一塊物理空間,為各個系統(tǒng)共享,這樣系統(tǒng)間的通信就可以通過直接讀、寫遠程主機的共享buffer來實現(xiàn)系統(tǒng)間的通信。文檔編號H04L29/12GK101827088SQ20101012612公開日2010年9月8日申請日期2010年3月15日優(yōu)先權(quán)日2010年3月15日發(fā)明者李勇男,田力,田媛媛,祝明發(fā),胡耀輝,陳瀟申請人:北京航空航天大學(xué)