專利名稱:一種服務器之間的數(shù)據(jù)傳輸方法和服務器的制作方法
技術領域:
本申請涉及通信和計算機技術領域,特別是涉及一種服務器之間的數(shù)據(jù)傳輸方法和服務器。
背景技術:
在各種網絡環(huán)境中,經常會涉及服務器之間的數(shù)據(jù)傳輸。例如,位于前端的服務器會將自身的數(shù)據(jù)發(fā)送給后端服務器,由后端服務器對數(shù)據(jù)進行處理;后端服務器在對數(shù)據(jù)進行處理后,還會將處理過的數(shù)據(jù)返回給前端服務器。在現(xiàn)有技術中,一種實現(xiàn)服務器之間的數(shù)據(jù)傳輸方法是在服務器A中,由操作系統(tǒng)將應用進程中的數(shù)據(jù)拷貝到內核中(第一次數(shù)據(jù)拷貝),再通過進程之間的通信機制,如 unix domain機制,將內核中的數(shù)據(jù)發(fā)送給數(shù)據(jù)分發(fā)進程;數(shù)據(jù)分發(fā)進程收到數(shù)據(jù)后,操作系統(tǒng)分配一個內存空間1,將數(shù)據(jù)拷貝到內存空間1中(第二次數(shù)據(jù)拷貝);最后,數(shù)據(jù)分發(fā)進程利用發(fā)送(send)機制將內存空間1中的數(shù)據(jù)發(fā)送給服務器B,其中,當數(shù)據(jù)分發(fā)進程利用send機制發(fā)送數(shù)據(jù)時,操作系統(tǒng)分配一個新的內存空間2,并將內存空間1中的數(shù)據(jù)拷貝到內存空間2中(第三次數(shù)據(jù)拷貝),使一個數(shù)據(jù)結構skjxiffer與內存空間2相映射,將數(shù)據(jù)結構sk_buffer發(fā)送給網卡進行驅動。顯然,在上述的整個數(shù)據(jù)傳輸過程中,需要經歷三次數(shù)據(jù)拷貝,比較耗費時間和CPU資源。另一種實現(xiàn)服務器之間的數(shù)據(jù)傳輸方法是在服務器A中,由數(shù)據(jù)分發(fā)進程預測所有應用進程中的數(shù)據(jù)需要占用的內存空間,并根據(jù)預測結果預先創(chuàng)建一個固定大小的共享內存,各個應用進程將自身數(shù)據(jù)拷貝到共享內存上(第一次數(shù)據(jù)拷貝),當數(shù)據(jù)分發(fā)進程獲知共享內存有數(shù)據(jù)到達時,從共享內存中獲取到達的數(shù)據(jù),利用send機制將獲取的數(shù)據(jù)發(fā)送給服務器B(第二次數(shù)據(jù)拷貝)。顯然,在上述的整個數(shù)據(jù)傳輸過程中,仍需要經歷二次數(shù)據(jù)拷貝,盡管相對于第一個現(xiàn)有技術方案來說,一定程度地節(jié)省了時間和CPU資源。但是,發(fā)明人在研究中發(fā)現(xiàn),在上述第二種數(shù)據(jù)傳輸方法中,由數(shù)據(jù)分發(fā)進程和應用進程共享的共享內存是由數(shù)據(jù)分發(fā)進程根據(jù)預測結果而預先創(chuàng)建的一個大小不可以改變的空間,在實際應用中,如果創(chuàng)建的共享內存的空間小于所有應用進程的數(shù)據(jù)所需的空間,則無法滿足應用進程的空間需求,導致應用進程無法正常工作;如果創(chuàng)建的共享內存的空間大于所有應用進程的數(shù)據(jù)所需的空間,又會浪費系統(tǒng)資源。
發(fā)明內容
為了解決上述技術問題,本申請實施例提供了一種服務器之間的數(shù)據(jù)傳輸方法和服務器,以在節(jié)省系統(tǒng)資源的情況下,同時保證應用進程正常工作。本申請實施例公開了如下技術方案一種服務器之間的數(shù)據(jù)傳輸方法,包括應用進程根據(jù)各自對內存空間的需求創(chuàng)建各自的文件,將創(chuàng)建的文件映射為一個共享內存,并將創(chuàng)建的文件句柄發(fā)送給服務器中的數(shù)據(jù)分發(fā)進程,所述文件句柄攜帶共享內存信息;應用進程根據(jù)各自創(chuàng)建的文件的文件句柄攜帶的共享內存信息檢測各自創(chuàng)建的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù),如果有,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存中;數(shù)據(jù)分發(fā)進程根據(jù)接收的文件句柄檢測是否有應用進程各自待處理的數(shù)據(jù)到達各自的共享內存,如果有,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù);數(shù)據(jù)分發(fā)進程將獲取的數(shù)據(jù)發(fā)送給遠端服務器。一種服務器,包括共享內存創(chuàng)建模塊,用于根據(jù)各個應用進程各自對內存空間的需求分別為各個應用進程創(chuàng)建各自的文件,將創(chuàng)建的文件映射為一個共享內存,并將創(chuàng)建的文件的文件句柄發(fā)送給剩余空間檢測模塊和數(shù)據(jù)到達檢測模塊,所述文件句柄攜帶共享內存信息;剩余空間檢測模塊,用于根據(jù)接收的文件句柄中攜帶的共享內存信息檢測所述共享內存創(chuàng)建模塊創(chuàng)建的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù),如果有,將應用進程各自待處理的數(shù)據(jù)拷貝到各自的共享內存中;數(shù)據(jù)到達檢測模塊,用于根據(jù)接收的文件句柄中攜帶的共享內存信息檢測是否有應用進程各自待處理的數(shù)據(jù)到達各自的共享內存,如果有,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù);數(shù)據(jù)傳輸模塊,用于將所述數(shù)據(jù)到達檢測模塊獲取的數(shù)據(jù)發(fā)送給遠端服務器。由上述實施例可以看出,由各個應用進程在啟動時,根據(jù)各自對內存空間的實際需求創(chuàng)建各自的文件,并將創(chuàng)建的文件映射為一個共享內存。當應用進程檢測到自身創(chuàng)建的共享內存有剩余空間存儲數(shù)據(jù)時,即將數(shù)據(jù)拷貝到各自的共享內存中,而當數(shù)據(jù)分發(fā)進程檢測到應用進程的數(shù)據(jù)到達共享內存后,從共享內存中獲取應用進程的數(shù)據(jù),最后將數(shù)據(jù)發(fā)送給遠端服務器。因此,在數(shù)據(jù)傳輸過程中,共享內存是根據(jù)應用進程的使用需求設置,在保證應用進程正常工作的同時,節(jié)省了系統(tǒng)資源,提高了數(shù)據(jù)傳輸?shù)男屎头掌鞯男阅堋?br>
為了更清楚地說明本申請實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn)有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,對于本領域普通技術人員而言,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1為本申請一種服務器之間的數(shù)據(jù)傳輸?shù)姆椒ǖ囊粋€實施例的流程圖;圖2為本申請初始時循環(huán)隊列的示意圖;圖3為本申請取數(shù)據(jù)后循環(huán)隊列的示意圖;圖4為本申請插入數(shù)據(jù)后循環(huán)隊列的示意圖;圖5為本申請一種服務器之間的數(shù)據(jù)傳輸方法的一個實施例的流程圖;圖6為本申請一種對循環(huán)隊列的可讀性和可寫性進行判斷的步驟的具體流程示意圖;圖7為本申請一種服務器的一個實施例的結構示意圖;圖8為本申請一種服務器的另一個實施例的結構示意圖。
具體實施例方式為使本申請的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結合附圖對本申請實施例進行詳細描述。
買施例一請參閱圖1,其為本申請一種服務器之間的數(shù)據(jù)傳輸?shù)姆椒ǖ囊粋€實施例的流程圖,該方法包括以下步驟步驟101 應用進程根據(jù)各自對內存空間的需求創(chuàng)建各自的文件,將創(chuàng)建的文件映射為一個共享內存,并將創(chuàng)建的文件句柄發(fā)送給服務器中的數(shù)據(jù)分發(fā)進程,所述文件句柄攜帶共享內存信息;例如,在現(xiàn)有技術中,是由數(shù)據(jù)分發(fā)進程預先創(chuàng)建一個固定大小的共享內存,然后再分配給不同的應用進程使用。在本申請中,各個應用進程根據(jù)各自對內存空間的需求自己創(chuàng)建各自的文件,如,各個應用進程在啟動時根據(jù)各自對內存空間的需求創(chuàng)建各自的文件。當創(chuàng)建文件后,將創(chuàng)建的文件映射為一個共享內存,以便應用進程將自身待處理的數(shù)據(jù)存儲在自己創(chuàng)建的共享內存中。如,以三個應用進程A、B和C為了進行說明,在應用進程 A、B和C根據(jù)各自對內存空間的需求分別自己創(chuàng)建文件,應用進程A創(chuàng)建文件1,應用進程 B創(chuàng)建文件2,應用進程C創(chuàng)建文件3,應用進程A再將文件1映射為共享內存1 ‘,應用進程B再將文件2映射為共享內存2',應用進程C再將文件3映射為共享內存3'。同時, 三個應用進程還將創(chuàng)建的文件句柄發(fā)送給服務器中的數(shù)據(jù)分發(fā)進程,文件句柄中攜帶有共享內存信息。該共享內存信息可以是共享內容的地址和容量等信息。步驟102 應用進程根據(jù)各自創(chuàng)建的文件的文件句柄攜帶的共享內存信息檢測各自創(chuàng)建的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù),如果有,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存中;例如,當位于某一個服務器上的應用進程由于各種各樣的使用需要,需要將自身待處理的數(shù)據(jù)發(fā)送給遠端的服務器代為處理時,上述三個應用進程檢測各自創(chuàng)建的共享內存是否有剩余空間存儲各自的數(shù)據(jù),如果有,將各自的數(shù)據(jù)拷貝到各自創(chuàng)建的共享內存中。優(yōu)選地,所述應用進程根據(jù)各自創(chuàng)建的文件的文件句柄攜帶的共享內存信息檢測各自創(chuàng)建的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù),如果有,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存中包括應用進程將各自創(chuàng)建的文件的文件句柄作為參數(shù)傳給接口函數(shù),所述文件句柄攜帶有開始標識、終止標識和共享內存的容量,所述開始標識標記共享內存中第一個數(shù)據(jù)的前一位序號,所述終止標識標記共享內存中最后一個數(shù)據(jù)的序號,接口函數(shù)將接收的文件句柄指示的共享內存作為一個循環(huán)隊列,并根據(jù)所述開始標識、終止標識和共享內存的容量判斷所述循環(huán)隊列是否可寫,如果可寫,向應用進程返回共享內存有剩余空間的結果;應用進程在接收到所述結果后,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存中, 更新所述文件句柄中的開始標識或終止標識。例如,每個應用進程在將各自待處理的數(shù)據(jù)拷貝到各自的共享內存之前,需要檢測各自的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù)。如,應用進程可以通過一個接口函數(shù)實現(xiàn)上述檢測過程。在該接口函數(shù)中,需要接收每個應用進程傳遞的各自文件的文件句柄這個參數(shù)。其中,文件句柄中攜帶有開始標識、終止標識和共享內存容量,開始標識標記共享內存中第一個數(shù)據(jù)的前一位序號,終止標識標記共享內存中最后一個數(shù)據(jù)的序號。同時,接口函數(shù)會將一個共享內存作為一個循環(huán)隊列。如,請參閱圖2,其為本申請初始時循環(huán)隊列的示意圖,循環(huán)隊列中存儲有3個數(shù)據(jù)datal、data2和data3,其在共享內存中的序號依次為1、2和3。開始標識標記共享內存中第一個數(shù)據(jù)datal的前一位序號,即,開始標識為0,終止標識標記共享內存中最后一個數(shù)據(jù)data3的序號,即,終止標記為3。當從循環(huán)隊列中取數(shù)據(jù)時,可設定先讀取開始標識標記的值,再將開始標識標記的值加1 ;當從循環(huán)隊列中插入數(shù)據(jù)時,可設定先讀取終止標識標記的值,再將終止標記的值加1。圖3為本申請取數(shù)據(jù)后循環(huán)隊列的示意圖,圖4所示為本申請插入數(shù)據(jù)后循環(huán)隊列的示意圖。當接口函數(shù)接收到文件句柄后,即可根據(jù)文件句柄中攜帶的開始標識、終止標識和共享內存的容量判斷該循環(huán)隊列是否可寫,如果可寫,向應用進程返回共享內存有剩余空間的結果。每個應用進程在接收到接口函數(shù)返回的可寫的結果后,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存中,同時,還要更新文件句柄中的開始標識或終止標識。步驟103 數(shù)據(jù)分發(fā)進程根據(jù)接收的文件句柄檢測是否有應用進程各自待處理的數(shù)據(jù)到達各自的共享內存,如果有,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù);優(yōu)選地,所述數(shù)據(jù)分發(fā)進程根據(jù)接收的文件句柄檢測是否有應用進程各自待處理的數(shù)據(jù)達到各自的共享內存,如果有,從應用進程各自的共享內存中獲取所述應用進程各自待處理的數(shù)據(jù)包括數(shù)據(jù)分發(fā)進程將接收的文件句柄作為參數(shù)傳給接口函數(shù),所述文件句柄攜帶有開始標識、終止標識和共享內存的容量,所述開始標識標記共享內存中第一個數(shù)據(jù)的前一位序號,所述終止標識標記共享內存中最后一個數(shù)據(jù)的序號,接口函數(shù)將接收的文件句柄指示的共享內存作為一個循環(huán)隊列,并根據(jù)所述開始標識、終止標識和共享內存的容量判斷所述循環(huán)隊列是否可讀,如果可讀,向應用進程返回有數(shù)據(jù)到達所述共享內存的結果;數(shù)據(jù)分發(fā)進程在接收到所述結果后,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù),并更新所述文件句柄中攜帶的終止標識或開始標識。例如,數(shù)據(jù)分發(fā)進程在從某一個共享內存中獲取某一個應用進程待處理的數(shù)據(jù)之前,需要檢測該應用進程的數(shù)據(jù)是否到達該共享內存。如,前面提到,一個應用可以通過接口函數(shù)實現(xiàn)一種檢測過程。同樣,數(shù)據(jù)分發(fā)進程也可以通過一個接口函數(shù)實現(xiàn)上述檢測過程。在該接口函數(shù)中,需要接收數(shù)據(jù)分發(fā)進程傳遞的某個文件的文件句柄。其中,文件句柄中攜帶有開始標識、終止標識和共享內存容量。開始標識標記共享內存中第一個數(shù)據(jù)的前一位序號,終止標識標記共享內存中最后一個數(shù)據(jù)的序號。同時,接口函數(shù)會將一個共享內存作為一個循環(huán)隊列,前面已經詳細地描述了循環(huán)隊列,故此處不再贅述。當接口函數(shù)接收到文件句柄后,即可根據(jù)文件句柄中攜帶的開始標識、終止標識和共享內存的容量判斷該循環(huán)隊列是否可讀,如果可讀,向數(shù)據(jù)分發(fā)進程返回有數(shù)據(jù)到達共享內存的結果。當數(shù)據(jù)分發(fā)進程接收到接口函數(shù)返回的有數(shù)據(jù)到達共享內存的結果后,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù),同時,并更新文件句柄中的終止標識或開始標識。步驟104 數(shù)據(jù)分發(fā)進程將獲取的數(shù)據(jù)發(fā)送給遠端服務器。其中,所述一服務器中的數(shù)據(jù)分發(fā)進程可以利用現(xiàn)有的send發(fā)送機制將獲取的數(shù)據(jù)發(fā)送給遠端服務器,也可以利用文件發(fā)送(sendfile)發(fā)送機制將獲取的數(shù)據(jù)發(fā)送給遠端服務器。利用sendfile機制將獲取的數(shù)據(jù)發(fā)送給遠端服務器包括數(shù)據(jù)分發(fā)進程調用一個數(shù)據(jù)結構,所述數(shù)據(jù)結構存儲獲取的數(shù)據(jù),且與所述共享內存相映射;數(shù)據(jù)分發(fā)進程將所述數(shù)據(jù)結構發(fā)送給網卡進行驅動。
在Linux系統(tǒng)中包括有兩種發(fā)送機制send發(fā)送機制和sendfile發(fā)送機制。與現(xiàn)有技術中數(shù)據(jù)分發(fā)進程利用send發(fā)送機制將數(shù)據(jù)發(fā)送給遠端服務器不同,本申請實施例中數(shù)據(jù)分發(fā)進程優(yōu)選利用sendfile發(fā)送機制將數(shù)據(jù)發(fā)送給遠端服務器。其中,數(shù)據(jù)結構直接與共享內存相映射,并由網卡驅動數(shù)據(jù)結構。進一步的,上述數(shù)據(jù)傳輸方法還包括當應用進程退出時,釋放退出的應用進程創(chuàng)建的共享內存。例如,本申請中的服務器可通過調用現(xiàn)有技術中的flush函數(shù)實現(xiàn)釋放退出的應用進程創(chuàng)建的共享內存。在調用flush函數(shù)后,數(shù)據(jù)分發(fā)進程關閉退出的應用進程所創(chuàng)建的文件的文件句柄,所述flush函數(shù)重載退出的應用進程創(chuàng)建的文件。當某一個應用進程A無論是正常還是異常退出時,在調用flush函數(shù)后,該flush 函數(shù)重載了應用進程A創(chuàng)建的文件。此時,該應用進程A創(chuàng)建的文件從文件系統(tǒng)中解除,即, 該應用進程A創(chuàng)建的文件對于數(shù)據(jù)分發(fā)進程來說是不可見的。數(shù)據(jù)分發(fā)進程在調用flush 函數(shù)后,關閉應用進程A創(chuàng)建的文件的文件句柄,例如,當數(shù)據(jù)分發(fā)進程無法獲取至此文件句柄,應用進程A創(chuàng)建的文件被刪除,與該文件相映射的共享內存被釋放。需要說明的是,本申請實施例中的“一服務器”和“遠端服務器”僅為互相之間由于各種各樣的應用而進行數(shù)據(jù)傳輸?shù)膬蓚€服務器,而對其具體指代哪個服務器并不進行限定。例如,如果“一服務器”為前端服務器,則“遠端服務器”即為與前端服務器進行數(shù)據(jù)傳輸?shù)暮蠖朔掌鳎粗嗳?。由上述實施例可以看出,由各個應用進程在啟動時,根據(jù)各自對內存空間的實際需求創(chuàng)建各自的文件,并將創(chuàng)建的文件映射為一個共享內存。當應用進程檢測到自身創(chuàng)建的共享內存有剩余空間存儲數(shù)據(jù)時,即將數(shù)據(jù)拷貝到各自的共享內存中,而當數(shù)據(jù)分發(fā)進程檢測到應用進程的數(shù)據(jù)到達共享內存后,從共享內存中獲取應用進程的數(shù)據(jù),最后將數(shù)據(jù)發(fā)送給遠端服務器。因此,在數(shù)據(jù)傳輸過程中,共享內存是根據(jù)應用進程的使用需求設置,在保證應用進程正常工作的同時,節(jié)省了系統(tǒng)資源,提高了數(shù)據(jù)傳輸?shù)男屎头掌鞯男阅?。當應用進程退出時,由每個應用進程創(chuàng)建的共享內存也會隨之被釋放,節(jié)省了系統(tǒng)資源。另外,當本申請實施例采用sendfile機制將數(shù)據(jù)發(fā)送給遠端服務器,與現(xiàn)有的 send機制發(fā)送數(shù)據(jù)相比,可以節(jié)省一次數(shù)據(jù)拷貝過程。進一步地節(jié)省了數(shù)據(jù)傳輸時間和 CPU資源。實施例二下面以一個具體的應用場景為例詳細說明服務器之間的數(shù)據(jù)傳輸方法。其中,在該應用場景中,為前端服務器與后端服務器之間的數(shù)據(jù)傳輸。另外,為了方便描述過程,假設前端服務器有多個應用進程進行數(shù)據(jù)傳輸,由于各應用進程均可采用本申請中的方案進行數(shù)據(jù)傳輸,因此在本實施例中僅以其中的一個應用進程A進行說明。請參閱圖5,其為本申請一種服務器之間的數(shù)據(jù)傳輸方法的一個實施例的流程圖,如圖5所示,所述數(shù)據(jù)傳輸方法包括步驟501 前端服務器的應用進程A在啟動時,根據(jù)自身對內存空間的需求創(chuàng)建一個文件1,并將創(chuàng)建的文件1映射為一個共享內存a ;
步驟502 在應用進程A將自身的數(shù)據(jù)拷貝到共享內存a之前,應用進程將文件1 的文件句柄作為參數(shù)傳給epoll接口函數(shù),由印oil接口函數(shù)判斷共享內存a是否可寫;其中,印oil是Linux內核為處理大批量句柄而作了改進的接口函數(shù),它能顯著減少程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率。epoll接口函數(shù)具有判斷循環(huán)隊列是否可寫和是否可讀的兩種工作方式。其中,文件句柄中攜帶有開始標識、終止標識和共享內存的容量,開始標識標記共享內存中第一數(shù)據(jù)的第一位序號,終止標識標記共享內存中最后一個數(shù)據(jù)的序號。印oil接口函數(shù)將共享內存a作為一個循環(huán)隊列,按照判斷循環(huán)隊列是否可寫的方式,根據(jù)獲得的開始標識、終止標識和共享內存的容量,判斷循環(huán)隊列是否可寫,即可獲知共享內存a是否可寫。,并且,印oil接口函數(shù)根據(jù)獲得的開始標識、終止標識和共享內存的容量,判斷循環(huán)隊列是否可讀,即可獲知共享內存a是否可讀。下面將一同說明epoll接口函數(shù)根據(jù)獲得的開始標識、終止標識和共享內存的容量判斷循環(huán)隊列是否可讀是否可寫的具體步驟。請參閱圖6,其為本申請中對循環(huán)隊列的可讀性和可寫性進行判斷的步驟的優(yōu)選流程示意圖,其中,在初始狀態(tài)下,終止標識標記的序號大于開始標識標記的序號,該過程包括步驟601 獲取文件1的文件句柄中的開始標識、終止標識和共享內存容量;步驟602 判斷開始標識標記的序號數(shù)是否大于終止標識標記的序號數(shù),如果是, 進入步驟603,如果否,進入步驟604 ;步驟603 當開始標識標記的序號數(shù)大于終止標識標記的序號數(shù)時,判斷開始標識標記的序號數(shù)與終止標識標記的序號數(shù)之差是否大于1,如果是,進入步驟605,如果否, 進入步驟606 ;步驟604 當開始標識標記的序號數(shù)小于或等于終止標識標記的序號數(shù)時,判斷終止標識標記的序號數(shù)與開始標識標記的序號數(shù)之差是否大于1,如果是,進入步驟607, 如果否,進入步驟608 ;步驟605 判定循環(huán)隊列可寫,進入步驟610 ;步驟606 判斷終止標識標記的序號數(shù)加上共享內存的容量再減去1后的值是否大于開始標識標記的序號數(shù),如果是,進入步驟614,如果否,進入步驟613 ;步驟607 判定循環(huán)隊列可讀,進入步驟609 ;步驟608 當判定循環(huán)隊列可讀時,判斷開始標識標記的序號數(shù)加上共享內存的容量再減去1后是否大于終止標識標記的序號數(shù),如果是,進入步驟611,如果否,進入步驟 614 ;步驟609 當判定循環(huán)隊列可讀時,判斷開始標識標記的序號數(shù)加上共享內存的容量再減去1后是否大于終止標識標記的序號數(shù),如果是,進入步驟612,如果否,進入步驟 613 ;步驟610 判斷終止標識標記的序號數(shù)加上共享內存的容量再減去1后的值是否大于開始標識標記的序號數(shù),如果是,進入步驟611,如果否,進入步驟612;步驟611 判定循環(huán)隊列既可讀又可讀,進入步驟615 ;步驟612 判定循環(huán)隊列只可寫不可讀,進入步驟615 ;
步驟613,判定循環(huán)隊列不可讀不可寫,進入步驟615 ;步驟614,判定循環(huán)隊列只可讀不可寫,進入步驟615 ;步驟615,返回判定結果,即分別對應返回步驟611 614中的判定結果,結束流程。需要說明的是,上述步驟606和步驟610,以及步驟608和步驟609的判定內容均分別相同,為清楚表述可讀性和可寫性進行判斷的步驟才將其分開描述,本申請實施例中也可將其合并。通過執(zhí)行上述過程,epoll接口函數(shù)向應用進程返回循環(huán)隊列是否可寫的判定結果,或者,向數(shù)據(jù)分發(fā)進程返回循環(huán)隊列是否可讀的判定結果。應用進程根據(jù)循環(huán)隊列是否可寫執(zhí)行對應的數(shù)據(jù)寫入操作。數(shù)據(jù)分發(fā)進程根據(jù)循環(huán)隊列是否可讀執(zhí)行對應的數(shù)據(jù)獲取操作。步驟503 當應用進程A從印oil接口函數(shù)返回的結果獲知共享內存a可寫后,將數(shù)據(jù)拷貝到共享內存a中;步驟504 前端服務器的數(shù)據(jù)分發(fā)進程將文件1的文件句柄作為參數(shù)傳給印oil 接口函數(shù),由印oil接口函數(shù)判斷共享內存a是否可讀;其中,印oil接口函數(shù)判斷共享內存a是否可讀已經包括在附圖6所示流程中,故此處不再贅述。的判斷結果。步驟505:當數(shù)據(jù)分發(fā)進程從epoll接口函數(shù)返回的結果獲知共享內存a可讀后, 從共享內存a中獲取應用進程A的數(shù)據(jù);步驟506 數(shù)據(jù)分發(fā)進程利用sendfile機制將獲取的數(shù)據(jù)發(fā)送給后端服務器。在實施例一中,已經對數(shù)據(jù)分發(fā)進程利用sendfile機制發(fā)送數(shù)據(jù)的過程已經進行了詳細地描述,故此處不再贅述。當應用進程退出時,由每個應用進程創(chuàng)建的共享內存也會隨之被釋放,節(jié)省了系統(tǒng)資源。由上述實施例可以看出,由各個應用進程開始運行時,根據(jù)各自對內存空間的實際需求創(chuàng)建各自的文件,并將創(chuàng)建的文件映射為一個共享內存。當應用進程檢測到自身創(chuàng)建的共享內存有剩余空間存儲數(shù)據(jù)時,即將數(shù)據(jù)拷貝到各自的共享內存中,而當數(shù)據(jù)分發(fā)進程檢測到應用進程的數(shù)據(jù)到達共享內存后,從共享內存中獲取應用進程的數(shù)據(jù),最后通過senfile機制將數(shù)據(jù)發(fā)送給遠端服務器。在數(shù)據(jù)傳輸過程中,由于共享內存是根據(jù)應用進程的使用需求設置的,因此在保證應用進程正常工作的同時,節(jié)省了系統(tǒng)資源,提高了數(shù)據(jù)傳輸?shù)男屎头掌鞯男阅堋A硗?,本申請實施例采用sendfile機制將數(shù)據(jù)發(fā)送給遠端服務器,與現(xiàn)有的send 機制發(fā)送數(shù)據(jù)相比,可以節(jié)省一次數(shù)據(jù)拷貝過程。進一步節(jié)省了數(shù)據(jù)傳輸?shù)臅r間和CPU資源。如下表所示,將本申請的數(shù)據(jù)傳輸方法所產生的傳輸性能與本申請背景技術中的第二個數(shù)據(jù)傳輸方法所產生的傳輸性能進行對比發(fā)現(xiàn),本申請的傳輸性能優(yōu)于本申請背景技術中的第二個數(shù)據(jù)傳輸方法的性能。并且,可看出,對于大的數(shù)據(jù),本申請能夠顯著提高每秒查詢率(Queries-per-seconcbQPQ。QPS是對一個特定的查詢服務器在規(guī)定時間內所處理流量多少的衡量標準,在因特網上,作為服務器的機器的性能經常用每秒查詢率來衡量。
權利要求
1.一種服務器之間的數(shù)據(jù)傳輸方法,其特征在于,包括應用進程根據(jù)各自對內存空間的需求創(chuàng)建各自的文件,將創(chuàng)建的文件映射為一個共享內存,并將創(chuàng)建的文件句柄發(fā)送給服務器中的數(shù)據(jù)分發(fā)進程,所述文件句柄攜帶共享內存 信息;應用進程根據(jù)各自創(chuàng)建的文件的文件句柄攜帶的共享內存信息檢測各自創(chuàng)建的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù),如果有,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存中;數(shù)據(jù)分發(fā)進程根據(jù)接收的文件句柄檢測是否有應用進程各自待處理的數(shù)據(jù)到達各自的共享內存,如果有,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù);數(shù)據(jù)分發(fā)進程將獲取的數(shù)據(jù)發(fā)送給遠端服務器。
2.根據(jù)權利要求1所述的服務器之間的數(shù)據(jù)傳輸方法,其特征在于,所述應用進程根據(jù)各自創(chuàng)建的文件的文件句柄攜帶的共享內存信息檢測各自創(chuàng)建的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù),如果有,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存包括應用進程將各自創(chuàng)建的文件的文件句柄作為參數(shù)傳給接口函數(shù),所述文件句柄攜帶有開始標識、終止標識和共享內存的容量,所述開始標識標記共享內存中第一個數(shù)據(jù)的前一位序號,所述終止標識標記共享內存中最后一個數(shù)據(jù)的序號,接口函數(shù)將接收的文件句柄指示的共享內存作為一個循環(huán)隊列,并根據(jù)所述開始標識、終止標識和共享內存的容量判斷所述循環(huán)隊列是否可寫,如果可寫,向應用進程返回共享內存有剩余空間的結果;應用進程在接收到所述結果后,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存中,更新所述文件句柄中的開始標識或終止標識。
3.根據(jù)權利要求1所述的服務器之間的數(shù)據(jù)傳輸方法,其特征在于,所述數(shù)據(jù)分發(fā)進程根據(jù)接收的文件句柄檢測是否有應用進程各自待處理的數(shù)據(jù)到達各自的共享內存,如果有,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù)包括數(shù)據(jù)分發(fā)進程將接收的文件句柄作為參數(shù)傳給接口函數(shù),所述文件句柄攜帶有開始標識、終止標識和共享內存的容量,所述開始標識標記共享內存中第一個數(shù)據(jù)的前一位序號, 所述終止標識標記共享內存中最后一個數(shù)據(jù)的序號,接口函數(shù)將接收的文件句柄指示的共享內存作為一個循環(huán)隊列,并根據(jù)所述開始標識、終止標識和共享內存的容量判斷所述循環(huán)隊列是否可讀,如果可讀,向應用進程返回有數(shù)據(jù)到達所述共享內存的結果;數(shù)據(jù)分發(fā)進程在接收到所述結果后,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù),并更新所述文件句柄中攜帶的終止標識或開始標識。
4.根據(jù)權利要求1所述的服務器之間的數(shù)據(jù)傳輸方法,其特征在于,所述數(shù)據(jù)分發(fā)進程將獲取的數(shù)據(jù)發(fā)送給遠端服務器包括數(shù)據(jù)分發(fā)進程調用一個數(shù)據(jù)結構,所述數(shù)據(jù)結構存儲獲取的數(shù)據(jù),且與所述共享內存相映射;數(shù)據(jù)分發(fā)進程將所述數(shù)據(jù)結構發(fā)送給網卡進行驅動。
5.根據(jù)權利要求1-4任意一項所述的服務器之間的數(shù)據(jù)傳輸方法,其特征在于,還包括當應用進程退出時,釋放退出的應用進程創(chuàng)建的共享內存。
6.一種服務器,其特征在于,包括共享內存創(chuàng)建模塊,用于根據(jù)各個應用進程各自對內存空間的需求分別為各個應用進程創(chuàng)建各自的文件,將創(chuàng)建的文件映射為一個共享內存,并將創(chuàng)建的文件的文件句柄發(fā)送給剩余空間檢測模塊和數(shù)據(jù)到達檢測模塊,所述文件句柄攜帶共享內存信息;剩余空間檢測模塊,用于根據(jù)接收的文件句柄中攜帶的共享內存信息檢測所述共享內存創(chuàng)建模塊創(chuàng)建的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù),如果有,將應用進程各自待處理的數(shù)據(jù)拷貝到各自的共享內存中;數(shù)據(jù)到達檢測模塊,用于根據(jù)接收的文件句柄中攜帶的共享內存信息檢測是否有應用進程各自待處理的數(shù)據(jù)到達各自的共享內存,如果有,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù);數(shù)據(jù)傳輸模塊,用于將所述數(shù)據(jù)到達檢測模塊獲取的數(shù)據(jù)發(fā)送給遠端服務器。
7.根據(jù)權利要求6所述的服務器,其特征在于,所述剩余空間檢測模塊包括第一接口模塊,用于接收所述共享內存創(chuàng)建模塊發(fā)送的文件句柄,將接收的文件句柄指示的共享內存作為一個循環(huán)隊列,并根據(jù)所述開始標識、終止標識和共享內存的容量判斷所述循環(huán)隊列是否可寫,如果可寫,向數(shù)據(jù)拷貝模塊返回共享內存有剩余空間的結果,所述文件句柄攜帶有開始標識、終止標識和共享內存的容量,所述開始標識標記共享內存中第一個數(shù)據(jù)的第一位序號,所述終止標識標記共享內存中最后一個數(shù)據(jù)的序號;數(shù)據(jù)拷貝模塊,用于在接收到所述結果后,將應用進程各自待處理的數(shù)據(jù)拷貝到各自的共享內存中,并更新接收的文件句柄中攜帶的開始標識或終止標識。
8.根據(jù)權利要求6所述的服務器,其特征在于,所述數(shù)據(jù)到達檢測模塊包括第二接口模塊,用于接收所述共享內存創(chuàng)建模塊發(fā)送的文件句柄,將接收的文件句柄指示的共享內存作為一個循環(huán)隊列,并根據(jù)所述開始標識、終止標識和共享內存的容量判斷所述循環(huán)隊列是否可讀,如果可讀,向數(shù)據(jù)獲取模塊返回有數(shù)據(jù)到達所述共享內存的結果,所述文件句柄攜帶有開始標識、終止標識和共享內存的容量,所述開始標識標記共享內存中第一數(shù)據(jù)的第一位序號,所述終止標識標記共享內存中最后一個數(shù)據(jù)的序號;數(shù)據(jù)獲取模塊,用于在接收到所述結果后,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù),并更新所述文件句柄中攜帶的開始標識或終止標識。
9.根據(jù)權利要求6所述的服務器,其特征在于,所述數(shù)據(jù)傳輸模塊包括數(shù)據(jù)結構創(chuàng)建模塊,用于創(chuàng)建一個數(shù)據(jù)結構,所述數(shù)據(jù)結構存儲獲取的數(shù)據(jù),且與所述共享內存相映射;數(shù)據(jù)發(fā)送模塊,用于將所述數(shù)據(jù)結構發(fā)送給網卡進行驅動。
10.根據(jù)權利要求6-9任意一項所述的服務器,其特征在于,還包括 釋放模塊,用于當應用進程退出時,釋放退出的應用進程創(chuàng)建的共享內存。
全文摘要
本申請實施例公開了一種服務器之間的數(shù)據(jù)傳輸方法和服務器。方法包括應用進程根據(jù)各自對內存空間的需求創(chuàng)建各自的文件,將文件映射為共享內存,并將創(chuàng)建的文件句柄發(fā)送給數(shù)據(jù)分發(fā)進程;應用進程檢測各自創(chuàng)建的共享內存是否有剩余空間存儲各自待處理的數(shù)據(jù),如果有,將各自待處理的數(shù)據(jù)拷貝到各自的共享內存中;數(shù)據(jù)分發(fā)進程檢測是否有應用進程各自待處理的數(shù)據(jù)到達各自的共享內存,如果有,從應用進程各自的共享內存中獲取應用進程各自待處理的數(shù)據(jù);數(shù)據(jù)分發(fā)進程將獲取的數(shù)據(jù)發(fā)送給遠端服務器。根據(jù)本申請實施例,在保證應用進程正常工作的同時,節(jié)省了系統(tǒng)資源,提高了數(shù)據(jù)傳輸?shù)男屎头掌鞯男阅堋?br>
文檔編號H04L29/06GK102340489SQ20101023492
公開日2012年2月1日 申請日期2010年7月20日 優(yōu)先權日2010年7月20日
發(fā)明者董昊 申請人:阿里巴巴集團控股有限公司