專利名稱:一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)絡(luò)通信技術(shù)領(lǐng)域,特別是涉及一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法及裝置。
背景技術(shù):
操作系統(tǒng)的應(yīng)用程序在與其他程序進行數(shù)據(jù)傳輸時,需要通過建立的連接發(fā)送或者接收數(shù)據(jù)。連接的底層緩存分為底層接收緩存和底層發(fā)送緩存,兩者互相獨立,互不重疊。底層接收緩存是操作系統(tǒng)為每個連接提供的用于存放連接上已經(jīng)收到的數(shù)據(jù)的存儲空間,這些已經(jīng)收到的數(shù)據(jù)有待應(yīng)用程序來讀取。底層發(fā)送緩存是操作系統(tǒng)為每個連接提供的用于存放應(yīng)用程序遞交給操作系統(tǒng)的數(shù)據(jù)的存儲空間,這些需要遞交的數(shù)據(jù)有待操作系統(tǒng)來發(fā)送。操作系統(tǒng)的應(yīng)用程序有兩種工作模式,一種是水平觸發(fā)模式,另一種是邊緣觸發(fā)模式。對于接收操作來說,水平觸發(fā)模式是指只要連接的底層接收緩存的狀態(tài)不為空,操作系統(tǒng)就會通知應(yīng)用程序從底層接收緩存中讀取數(shù)據(jù);而邊緣觸發(fā)模式是指只有當連接的底層接收緩存的狀態(tài)從“空”變?yōu)椤安豢铡睍r,操作系統(tǒng)才通知應(yīng)用程序從底層接收緩存中讀取數(shù)據(jù)。對于發(fā)送操作來說,水平觸發(fā)模式是指只要連接的底層發(fā)送緩存的狀態(tài)不為滿,操作系統(tǒng)就會通知應(yīng)用程序往底層發(fā)送緩存中寫入數(shù)據(jù);而邊緣觸發(fā)模式是指只有當連接的底層發(fā)送緩存的狀態(tài)從“滿”變?yōu)椤安粷M”時,操作系統(tǒng)才通知應(yīng)用程序往底層發(fā)送緩存中寫入數(shù)據(jù)。因此可見邊緣觸發(fā)的模式性能要高于水平觸發(fā),因為如果一個連接既沒有收到數(shù)據(jù),又沒有數(shù)據(jù)需要發(fā)送,此時如果是水平觸發(fā)模式,則操作系統(tǒng)通知應(yīng)用程序可以持續(xù)的往該連接的底層發(fā)送緩存中寫入數(shù)據(jù),這會導致CPU利用率居高不下,而邊緣觸發(fā)模式不存在以上問題。當應(yīng)用程序工作在邊緣觸發(fā)模式下,當操作系統(tǒng)通知應(yīng)用程序某連接的底層接收緩存有數(shù)據(jù)需要讀取,如果此時應(yīng)用程序不接收完該連接底層接收緩存里的所有數(shù)據(jù)讓底層接收緩存的狀態(tài)變?yōu)榭?,那么后續(xù)即便操作系統(tǒng)再收到該連接上的數(shù)據(jù)時,也將不再通知應(yīng)用程序該連接的底層緩存數(shù)據(jù)有數(shù)據(jù)需要讀取。所以,為了能夠不遺漏任何連接的數(shù)據(jù)接收,應(yīng)用程序必須在操作系統(tǒng)通知某連接的底層接收緩存有數(shù)據(jù)需要接收時,就要把該連接上的所有已經(jīng)在連接底層接收緩存的數(shù)據(jù)都接收完畢,以使底層接收緩存的狀態(tài)變?yōu)椤翱铡?。進一步的,如果某連接上的底層接收緩存收到很多數(shù)據(jù),而應(yīng)用程序拷貝底層接收緩存的數(shù)據(jù)時用的緩存不夠大,那就需要循環(huán)來接收該連接上的數(shù)據(jù),直到把該底層接收緩存里已經(jīng)收到的數(shù)據(jù)都拷貝完畢。例如一個連接發(fā)送大量數(shù)據(jù)給應(yīng)用程序,應(yīng)用程序在接收該連接的底層接收緩存的數(shù)據(jù)時,又源源不斷有新的數(shù)據(jù)進入到該連接的底層接收緩存,這將導致應(yīng)用程序始終無法把該連接的底層接收緩存里的數(shù)據(jù)讀完,應(yīng)用程序就會陷入無盡循環(huán)來接收該連接的數(shù)據(jù),最終造成應(yīng)用程序只為該連接服務(wù),而其他連接無法得到該應(yīng)用程序的服務(wù)。這樣,就造成應(yīng)用程序在多連接邊緣觸發(fā)模式下接收數(shù)據(jù)出現(xiàn)服務(wù)不可用的問題了。為了解決上述服務(wù)不可用的問題,現(xiàn)有技術(shù)存在兩種方法,第一種是給每個連接都分配一個大容量的緩存,足夠讓應(yīng)用程序一次性拷貝完某一個連接(例如A連接)的底層接收緩存上所有的數(shù)據(jù),這時該連接的底層接收緩存的狀態(tài)就為“空”,同時應(yīng)用程序會接著去讀取其他連接(例如B連接)的底層接收緩存中的數(shù)據(jù),等到B連接的底層接收緩存中的數(shù)據(jù)也讀完完畢之后,應(yīng)用程序再接著詢問操作系統(tǒng)是否有新數(shù)據(jù)需要讀取。這樣就不會出現(xiàn)因循環(huán)讀某一個連接的底層接收緩存而導致應(yīng)用程序服務(wù)不可用的現(xiàn)象了。另一種是應(yīng)用程序申請一個所有連接公用的大容量緩存,來接收底層接收緩存中的數(shù)據(jù),確保讓應(yīng)用程序可以一次性讀完某連接的底層接收緩存上的所有數(shù)據(jù)。應(yīng)用程序在接收每個連接的底層接收緩存數(shù)據(jù)時,先用公用的那塊大容量緩存來接收,然后再把大容量緩存里實際收到的數(shù)據(jù)拷貝到應(yīng)用程序為每個連接單獨分配的緩存里(如果超出為連接獨立分配的緩存的大小,應(yīng)用程序會讓該獨立分配的緩存的容量擴大)。應(yīng)用程序就不會出現(xiàn)因陷入循環(huán)讀某個連接的數(shù)據(jù)導致應(yīng)用程序服務(wù)不可用。但是上述第一種方法因為應(yīng)用程序為每個連接都分配了大量的緩存,導致了內(nèi)存空間浪費的問題,進一步的,因為應(yīng)用程序所能使用的內(nèi)存總量是固定的,所以最終導致應(yīng)用程序可以支持的連接數(shù)目也有限。第二種方法又會導致應(yīng)用程序在每次接收每個連接的數(shù)據(jù)時,都需要進行額外的一次內(nèi)存拷貝,降低了應(yīng)用程序的運行速度。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是,提供一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法, 以在解決在應(yīng)用程序工作在邊緣觸發(fā)模式下時,對于多連接數(shù)據(jù)接收時某些連接的應(yīng)用程序服務(wù)不可用的問題的同時,也能夠節(jié)約內(nèi)存空間,并且提升應(yīng)用程序的運行速度。本發(fā)明的另一個目的是將上述構(gòu)思應(yīng)用于具體的應(yīng)用環(huán)境中,提供一種數(shù)據(jù)接收裝置,從而保證該方法的實現(xiàn)和應(yīng)用。為解決上述技術(shù)問題,本發(fā)明實施例提供了一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存;所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存; 所述方法包括采用分散讀機制依次對所述多連接的底層接收緩存中的數(shù)據(jù)進行接收,所述接收過程包括從當前連接的底層接收緩存中讀取初始數(shù)據(jù);比較所述初始數(shù)據(jù)與所述當前連接的第一緩存的大小如果所述初始數(shù)據(jù)大于所述第一緩存,則將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中;如果所述初始數(shù)據(jù)小于或等于所述當前連接的第一緩存,則將所述初始數(shù)據(jù)全部存儲至所述當前連接的第一緩存中;判斷所述多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢,如果否,則以未接收的任一個連接為當前連接執(zhí)行所述接收過程,直至所述多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。可選的,在所述初始數(shù)據(jù)大于所述當前連接的第一緩存的情況下,將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中之后,還包括依據(jù)所述初始數(shù)據(jù)在所述第二緩存中占用的存儲空間的大小擴充所述第一緩存。
可選的,還包括將所述初始數(shù)據(jù)在第二緩存中存儲的那部分拷貝至所述擴充后的第一緩存中??蛇x的,所述采用分散讀機制從當前連接的底層接收緩存中讀取初始數(shù)據(jù),具體包括從所述當前連接的底層接收緩存中讀取當前所有的初始數(shù)據(jù),并在讀取的同時對所述讀取操作進行鎖定??蛇x的,還包括當所述當前連接的底層接收緩存中的初始數(shù)據(jù)接收完畢之后,對所述讀取操作進行解鎖。一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收裝置,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存;所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存;所述裝置包括數(shù)據(jù)接收單元,用于采用分散讀機制依次對所述多連接的底層接收緩存中的數(shù)據(jù)進行接收,所述數(shù)據(jù)接收單元包括讀取模塊,用于從當前連接的底層接收緩存中讀取初始數(shù)據(jù);比較模塊,用于比較所述初始數(shù)據(jù)與所述當前連接的第一緩存的大小存儲模塊, 用于如果所述初始數(shù)據(jù)大于所述第一緩存,將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中;如果所述初始數(shù)據(jù)小于或等于所述當前連接的第一緩存,則將所述初始數(shù)據(jù)全部存儲至所述當前連接的第一緩存中;判斷模塊,用于判斷所述多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢;觸發(fā)模塊,用于在所述判斷模塊的結(jié)果為否的情況下,以未接收的任一個連接為當前連接并觸發(fā)所述數(shù)據(jù)接收系統(tǒng),直至所述多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止??蛇x的,還包括擴充模塊,用于依據(jù)所述初始數(shù)據(jù)在所述第二緩存中占用的存儲空間的大小擴充所述第一緩存??蛇x的,還包括拷貝模塊,用于將所述初始數(shù)據(jù)在第二緩存中存儲的那部分拷貝至所述擴充后的
第一緩存中??蛇x的,所述讀取模塊,具體包括讀取子模塊,用于從所述當前連接的底層接收緩存中讀取當前所有的初始數(shù)據(jù);鎖定子模塊,用于在讀取的同時對所述讀取操作進行鎖定??蛇x的,還包括解鎖模塊,用于當所述當前連接的底層接收緩存中的初始數(shù)據(jù)接收完畢之后,對所述讀取操作進行解鎖。從上述的技術(shù)方案可以看出,與現(xiàn)有技術(shù)相比,本發(fā)明提供一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法及裝置,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存,并且所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存,這樣在讀取多連接的底層接收緩存中的數(shù)據(jù)時,把底層接收緩存中的數(shù)據(jù)可以一次性讀到應(yīng)用程序為每個連接單獨分配的第一緩存上,或者該第一緩存以及第二緩存上,可以避免在邊緣觸發(fā)模式下多連接數(shù)據(jù)進行接收時導致的其他連接服務(wù)不可用的問題,同時,也能夠降低應(yīng)用程序的內(nèi)存使用量,并提高應(yīng)用程序的運行速度。
為了更清楚地說明本申請實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請中記載的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下, 還可以根據(jù)這些附圖獲得其他的附圖。圖1為本發(fā)明方法實施例一的流程圖;圖2為本發(fā)明方法實施例一中步驟101的流程圖;圖3為本發(fā)明方法實施例二的流程圖;圖4為本發(fā)明系統(tǒng)實施例一的結(jié)構(gòu)示意圖;圖5為本發(fā)明系統(tǒng)實施例一中數(shù)據(jù)接收單元40的結(jié)構(gòu)示意圖;圖6為本發(fā)明系統(tǒng)實施例二的結(jié)構(gòu)示意圖。
具體實施例方式為實現(xiàn)本發(fā)明的發(fā)明目的,本發(fā)明提供一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法及裝置,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存,并且所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存,這樣在讀取多連接的底層接收緩存中的數(shù)據(jù)時,把底層接收緩存中的數(shù)據(jù)可以一次性讀到應(yīng)用程序為每個連接單獨分配的第一緩存上,或者該第一緩存以及第二緩存上,可以避免在邊緣觸發(fā)模式下多連接數(shù)據(jù)進行接收時導致的其他連接服務(wù)不可用的問題。以上是本發(fā)明的核心思想,為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。參見圖1,示出了本發(fā)明的一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法實施例1的流程圖,可以包括以下步驟步驟101 采用分散讀機制依次對所述多連接的底層接收緩存中的數(shù)據(jù)進行接收。在本發(fā)明實施例中,應(yīng)用程序采用邊緣觸發(fā)模式進行數(shù)據(jù)接收,其中,操作系統(tǒng)為多個連接各分配了一個大小固定的底層接收緩存,而應(yīng)用程序則為每個連接各自分配了一個大小可變的第一緩存,該第一緩存在數(shù)據(jù)接收過程中可以根據(jù)存儲數(shù)據(jù)的多少動態(tài)進行擴充;另外,所述應(yīng)用程序也為所有連接共同分配了一個大小固定的第二緩存,該第二緩存可以是一個大容量緩存。其中,多連接具有的第一緩存的初始大小可以設(shè)置的很小,后續(xù)在數(shù)據(jù)接收過程中,因為該第一緩存的大小是動態(tài)的,所以第一緩存的大小會漸漸與對應(yīng)的連接所需要接收的數(shù)據(jù)大小成正比,例如用戶A發(fā)送的數(shù)據(jù)量一般,而用戶B發(fā)送的數(shù)據(jù)量較大,用戶C發(fā)送的數(shù)據(jù)量較小,則與用戶A進行數(shù)據(jù)交互的連接的第一緩存可能會漸漸擴充為IOM大小,而與用戶B進行數(shù)據(jù)交互的連接的第一緩存可能會漸漸擴充為20M大小,而與用戶C進行數(shù)據(jù)交互的連接的第一緩存可能為3M。當然,在實際應(yīng)用中,第一緩存的大小是動態(tài)的, 所以上述數(shù)值僅是一個例子,并不能用來限定本發(fā)明實施例中的第一緩存的大小。其中,分散讀為操作系統(tǒng)提供的API (Application Programming hterface,應(yīng)用程序編程接口),分散讀可以在1次讀取底層接收緩存中的數(shù)據(jù)時把其中的所有數(shù)據(jù)按順序拷貝到多塊不連續(xù)的內(nèi)存上。具體的,參見圖2,步驟101在實施時可以包括以下步驟步驟201 從當前連接的底層接收緩存中讀取初始數(shù)據(jù)。其中,當前連接為多連接中的任一個需要讀取底層接收緩存中的數(shù)據(jù)的連接,圖2 所示的接收過程只是針對多連接中的一個連接進行介紹,其他連接的底層接收緩存中的數(shù)據(jù)接收過程類似。步驟202 比較所述初始數(shù)據(jù)與所述當前連接的第一緩存的大小,如果所述初始數(shù)據(jù)大于所述第一緩存,則進入步驟203 ;如果所述初始數(shù)據(jù)小于或等于所述當前連接的第一緩存,則進入步驟204。將當前連接的底層接收緩存中的初始數(shù)據(jù)的大小與該鏈接配置的第一緩存的大小進行比較,當初始數(shù)據(jù)大于第一緩存時,說明該初始數(shù)據(jù)不能完全存儲至第一緩存中,這時就需要用到第二緩存的存儲空間來存儲第一緩存不能存儲的那一部分初始數(shù)據(jù);當初始數(shù)據(jù)小于或者等于第一緩存時,說明初始數(shù)據(jù)可以完全存儲至第一緩存中。步驟203 將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中。當初始數(shù)據(jù)不能完全存儲至第一緩存中時,就需要將初始數(shù)據(jù)按照順序分別存儲至第一緩存和第二緩存中。例如,如果一個連接的底層接收緩存中的初始數(shù)據(jù)為包括 “0123456789”這10個字節(jié)的數(shù)據(jù),而為該連接配置的第一緩存的大小為6,第二緩存的大小為1000,那么存儲完畢后,第一緩存被完全使用,里面存放著“012345”,第二緩存被部分使用,里面存放著“6789”。步驟204 將所述初始數(shù)據(jù)全部存儲至所述當前連接的第一緩存中。當初始數(shù)據(jù)能完全存儲至第一緩存中時,就可以將初始數(shù)據(jù)直接存儲至第一緩存中。例如,連接的底層接收緩存中的初始數(shù)據(jù)為包括“0123456789”這10個字節(jié)的數(shù)據(jù),如果為該連接配置的第一緩存的大小為12,第二緩存的大小為1000,那么存儲完畢后,第一緩存被部分使用,里面存放著“0123456789”,第二緩存未被使用。步驟102 判斷所述多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢,如果否,則進入步驟103。判斷當前多連接對應(yīng)的多個底層接收緩存中的數(shù)據(jù)是否都已經(jīng)接收完畢,如果已經(jīng)都接收完畢了,則結(jié)束數(shù)據(jù)接收過程。步驟103 以未接收的任一個連接為當前連接執(zhí)行所述接收過程,直至所述多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。如果還存在未進行數(shù)據(jù)接收的連接,則以未接收的任一個連接為當前連接執(zhí)行所述接收過程,即是步驟201 步驟204所述的過程,直至多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。
本發(fā)明實施例中,因為每一個連接除了固定大小的底層接收緩存之外,還有一個單獨的動態(tài)可擴充的第一緩存,以及所有連接都能共用一個大容量的第二緩存,所以各個連接的底層接收緩存中的數(shù)據(jù)在采用分散讀機制進行數(shù)據(jù)讀取時,都能夠一次性接收完畢,這樣就可以在接收完當前連接的底層接收緩存中的數(shù)據(jù)之后,接著去接收其他連接的底層接收緩存中的數(shù)據(jù),就不會出現(xiàn)其他連接的服務(wù)不可用的問題。與現(xiàn)有技術(shù)中的方法相比,本發(fā)明實施例在解決服務(wù)不可用的問題時,不僅可以節(jié)省應(yīng)用程序的內(nèi)存使用量,還可以提高應(yīng)用程序的運行速度。因為本發(fā)明實施例利用分散讀的機制把連接底層接收緩存里的數(shù)據(jù)讀取到第一緩存,或者第一緩存和第二緩存里, 而大多數(shù)連接向應(yīng)用程序發(fā)送的數(shù)據(jù)量不會很大,也不會很頻繁,所以在絕大多數(shù)情況下, 只用到了第一緩存(即每個連接獨立的緩存)即可將底層接收緩存的數(shù)據(jù)完全接收。進一步的,如果出現(xiàn)某個連接發(fā)送的數(shù)據(jù)量特別大,那么在使用第二緩存(即所有連接公用的緩存)來接收連接的底層接收緩存的部分數(shù)據(jù)之后,只需要拷貝第二緩存中所存儲的那部分數(shù)據(jù),并且,也不是每一次進行數(shù)據(jù)接收時都需要用到第二緩存,所以拷貝數(shù)據(jù)的數(shù)量和發(fā)生拷貝的頻率都比現(xiàn)有技術(shù)小,這就提高了應(yīng)用程序的運行速度,也不需要為每個連接分配大容量的緩存,從而節(jié)省了應(yīng)用程序的內(nèi)存使用量。參見圖3,示出了本發(fā)明的一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法實施例2的流程圖,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存;所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存; 可以包括以下步驟步驟301 從所述當前連接的底層接收緩存中讀取當前所有的初始數(shù)據(jù),并在讀取的同時對所述讀取操作進行鎖定。需要說明的是,在實際應(yīng)用中,采用分散讀機制進行數(shù)據(jù)接收,當讀取某一個連接的底層接收緩存中的初始數(shù)據(jù)時,為了避免此時出現(xiàn)數(shù)據(jù)讀取上的沖突,在讀取該連接的底層接收緩存中的數(shù)據(jù)時對該讀取操作進行鎖定,就可以保證在本次數(shù)據(jù)接收過程中該連接上不會有新的數(shù)據(jù)存儲到底層接收緩存中。步驟302 比較所述初始數(shù)據(jù)與所述當前連接的第一緩存的大小,如果所述初始數(shù)據(jù)大于所述第一緩存,則進入步驟303 ;如果所述初始數(shù)據(jù)小于或等于所述當前連接的第一緩存,則進入步驟306。步驟303 將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述
第二緩存中。步驟304 依據(jù)所述初始數(shù)據(jù)在所述第二緩存中占用的存儲空間的大小擴充所述
第一緩存。步驟305 將所述初始數(shù)據(jù)在第二緩存中存儲的那部分拷貝至所述擴充后的第一緩存中,進入步驟307。在將初始數(shù)據(jù)分別存儲至第一緩存和第二緩存中時,表示第一緩存的大小不夠存儲該連接的底層接收緩存中的數(shù)據(jù),因此,可以根據(jù)第二緩存的實際使用量來擴大第一緩存的大小,擴充后的第一緩存的大小等于未擴充之前的第一緩存的大小與初始數(shù)據(jù)在第二緩存中占用的存儲空間的大小之和。在實際應(yīng)用時,只需把第二緩存里實際存放的數(shù)據(jù),拷貝到第一緩存的尾部即可,從而擴大第一緩存的大小。經(jīng)過上述處理,后續(xù)再繼續(xù)讀取底層接收緩存中的數(shù)據(jù)時,用到第二緩存的概率就會降低,這也能提升應(yīng)用程序的運行速度。步驟306 將所述初始數(shù)據(jù)全部存儲至所述當前連接的第一緩存中。步驟307 對所述讀取操作進行解鎖。在當前連接的底層接收緩存中的數(shù)據(jù)全部接收完畢之后,對該讀取操作進行解鎖,以保證該連接的底層接收緩存中可以有新數(shù)據(jù)進入,這樣也能保證后續(xù)可以觸發(fā)可讀操作。步驟308 判斷所述多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢,如果否,則進入步驟309。步驟309 以未接收的任一個連接為當前連接執(zhí)行所述接收過程,直至所述多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。本發(fā)明實施例中的第一緩存的初始大小可以分配得比較小,可以讓第二緩存的容量達到操作系統(tǒng)為連接分配的底層接收緩存的大小,從而可以確保在1次讀取連接的底層接收緩存數(shù)據(jù)的操作中把其中的數(shù)據(jù)讀完,從而保證應(yīng)用程序可以接著去接收其他連接上的數(shù)據(jù),并且能保證后續(xù)當該同一個連接上有新數(shù)據(jù)進入連接底層接收緩存時,操作系統(tǒng)會通知應(yīng)用程序,因為符合邊緣觸發(fā)的條件。因此,當應(yīng)用程序在用本發(fā)明實施例提供的方法讀取某連接的數(shù)據(jù)后,就可以去讀取其他連接的數(shù)據(jù),避免了服務(wù)不可用的問題。進一步的,對于大部分連接來說,應(yīng)用程序提供的第一緩存就足夠把連接的底層接收緩存中的數(shù)據(jù)全部讀取,此時沒有額外的內(nèi)存拷貝,從而提高了應(yīng)用程序的運行速度; 另一方面,對于向應(yīng)用程序傳輸數(shù)據(jù)特別繁重的連接,應(yīng)用程序接收數(shù)據(jù)時會用到第二緩存,此時,可以按照第二緩存的實際使用量來擴大第一緩存的大小,然后把第二緩存里的數(shù)據(jù)添加到第一緩存的尾部。第一緩存擴大后,可以保持它擴大后的大小,從而在后續(xù)的讀取數(shù)據(jù)的操作中,降低了用到第二緩存的概率,也降低了需要內(nèi)存拷貝的概率,所以提高了應(yīng)用程序的運行速度。因為第二緩存是所有連接公用的,所以也不會造成內(nèi)存浪費問題。通過以上的方法實施例的描述,所屬領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當然也可以通過硬件,但很多情況下前者是更佳的實施方式。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括只讀存儲器 (ROM)、隨機存取存儲器(RAM)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。相應(yīng)于上面的方法實施例,本發(fā)明實施例還提供一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收裝置,其中,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存;所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存;參見圖4,示出了一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收裝置實施例1的結(jié)構(gòu)示意圖,該裝置可以包括數(shù)據(jù)接收單元40,用于采用分散讀機制依次對所述多連接的底層接收緩存中的數(shù)據(jù)進行接收;其中,參考圖5所示,所述數(shù)據(jù)接收單元40具體可以包括讀取模塊401,用于從當前連接的底層接收緩存中讀取初始數(shù)據(jù);比較模塊402,用于比較所述初始數(shù)據(jù)與所述當前連接的第一緩存的大小存儲模塊403,用于如果所述初始數(shù)據(jù)大于所述第一緩存,將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中;如果所述初始數(shù)據(jù)小于或等于所述當前連接的第一緩存,則將所述初始數(shù)據(jù)全部存儲至所述當前連接的第一緩存中;判斷模塊41,用于判斷所述多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢;觸發(fā)模塊42,用于在所述判斷模塊的結(jié)果為否的情況下,以未接收的任一個連接為當前連接并觸發(fā)所述數(shù)據(jù)接收系統(tǒng),直至所述多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。與現(xiàn)有技術(shù)中的方法相比,本發(fā)明實施例在解決服務(wù)不可用的問題時,不僅可以節(jié)省應(yīng)用程序的內(nèi)存使用量,還可以提高應(yīng)用程序的運行速度。因為本發(fā)明實施例利用分散讀的機制把連接底層接收緩存里的數(shù)據(jù)讀取到第一緩存,或者第一緩存和第二緩存里, 而大多數(shù)連接向應(yīng)用程序發(fā)送的數(shù)據(jù)量不會很大,也不會很頻繁,所以在絕大多數(shù)情況下, 只用到了第一緩存(即每個連接獨立的緩存)即可將底層接收緩存的數(shù)據(jù)完全接收。進一步的,如果出現(xiàn)某個連接發(fā)送的數(shù)據(jù)量特別大,那么在使用第二緩存(即所有連接公用的緩存)來接收連接的底層接收緩存的部分數(shù)據(jù)之后,只需要拷貝第二緩存中所存儲的那部分數(shù)據(jù),并且,也不是每一次進行數(shù)據(jù)接收時都需要用到第二緩存,所以拷貝數(shù)據(jù)的數(shù)量和發(fā)生拷貝的頻率都比現(xiàn)有技術(shù)小,這就提高了應(yīng)用程序的運行速度,也不需要為每個連接分配大容量的緩存,從而節(jié)省了應(yīng)用程序的內(nèi)存使用量。參見圖6,示出了一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收裝置實施例2的結(jié)構(gòu)示意圖,其中,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存;所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存; 該裝置可以包括讀取模塊401,用于從當前連接的底層接收緩存中讀取初始數(shù)據(jù);所述讀取模塊401在本實施例中具體可以包括讀取子模塊601,用于從所述當前連接的底層接收緩存中讀取當前所有的初始數(shù)據(jù);鎖定子模塊602,用于在讀取的同時對所述讀取操作進行鎖定。比較模塊402,用于比較所述初始數(shù)據(jù)與所述當前連接的第一緩存的大??;存儲模塊403,用于如果所述初始數(shù)據(jù)大于所述第一緩存,將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中;如果所述初始數(shù)據(jù)小于或等于所述當前連接的第一緩存,則將所述初始數(shù)據(jù)全部存儲至所述當前連接的第一緩存中;擴充模塊603,用于依據(jù)所述初始數(shù)據(jù)在所述第二緩存中占用的存儲空間的大小擴充所述第一緩存??截惸K604,用于將所述初始數(shù)據(jù)在第二緩存中存儲的那部分拷貝至所述擴充
后的第一緩存中。解鎖模塊605,用于當所述當前連接的底層接收緩存中的初始數(shù)據(jù)接收完畢之后, 對所述讀取操作進行解鎖。判斷模塊41,用于判斷所述多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢;觸發(fā)模塊42,用于在所述判斷模塊的結(jié)果為否的情況下,以未接收的任一個連接為當前連接并觸發(fā)所述數(shù)據(jù)接收系統(tǒng),直至所述多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。本發(fā)明實施例中的第一緩存的初始大小可以分配得比較小,可以讓第二緩存的容量達到操作系統(tǒng)為連接分配的底層接收緩存的大小,從而可以確保在1次讀取連接的底層接收緩存數(shù)據(jù)的操作中把其中的數(shù)據(jù)讀完,從而保證應(yīng)用程序可以接著去接收其他連接上的數(shù)據(jù),并且能保證后續(xù)當該同一個連接上有新數(shù)據(jù)進入連接底層接收緩存時,操作系統(tǒng)會通知應(yīng)用程序,因為符合邊緣觸發(fā)的條件。因此,當采用本發(fā)明實施例提供的裝置讀取某連接的數(shù)據(jù)后,就可以去讀取其他連接的數(shù)據(jù),避免了服務(wù)不可用的問題。進一步的,對于大部分連接來說,應(yīng)用程序提供的第一緩存就足夠把連接的底層接收緩存中的數(shù)據(jù)全部讀取,此時沒有額外的內(nèi)存拷貝,從而提高了應(yīng)用程序的運行速度; 另一方面,對于向應(yīng)用程序傳輸數(shù)據(jù)特別繁重的連接,應(yīng)用程序接收數(shù)據(jù)時會用到第二緩存,此時,可以按照第二緩存的實際使用量來擴大第一緩存的大小,然后把第二緩存里的數(shù)據(jù)添加到第一緩存的尾部。第一緩存擴大后,可以保持它擴大后的大小,從而在后續(xù)的讀取數(shù)據(jù)的操作中,降低了用到第二緩存的概率,也降低了需要內(nèi)存拷貝的概率,所以提高了應(yīng)用程序的運行速度。因為第二緩存是所有連接公用的,所以也不會造成內(nèi)存浪費問題??梢岳斫獾氖?,本發(fā)明可用于眾多通用或?qū)S玫挠嬎阆到y(tǒng)環(huán)境或配置中。例如個人計算機、服務(wù)器計算機、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費電子設(shè)備、網(wǎng)絡(luò)PC、小型計算機、大型計算機、包括以上任何系統(tǒng)或設(shè)備的分布式計算環(huán)境等等。本發(fā)明可以在由計算機執(zhí)行的計算機可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計算環(huán)境中實踐本發(fā)明,在這些分布式計算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠程處理設(shè)備來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠程計算機存儲介質(zhì)中。需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實體或者操作與另一個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備
所固有的要素。在沒有更多限制的情況下,由語句“包括一個......”限定的要素,并不排
除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。對于裝置實施例而言,由于其基本對應(yīng)于方法實施例,所以相關(guān)之處參見方法實施例的部分說明即可。以上所描述的裝置實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實施。以上所述僅是本發(fā)明的具體實施方式
,應(yīng)當指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。
權(quán)利要求
1.一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法,其特征在于,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存;所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存;所述方法包括采用分散讀機制依次對所述多連接的底層接收緩存中的數(shù)據(jù)進行接收,所述接收過程包括從當前連接的底層接收緩存中讀取初始數(shù)據(jù);比較所述初始數(shù)據(jù)與所述當前連接的第一緩存的大小如果所述初始數(shù)據(jù)大于所述第一緩存,則將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中;如果所述初始數(shù)據(jù)小于或等于所述當前連接的第一緩存,則將所述初始數(shù)據(jù)全部存儲至所述當前連接的第一緩存中;判斷所述多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢,如果否,則以未接收的任一個連接為當前連接執(zhí)行所述接收過程,直至所述多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述初始數(shù)據(jù)大于所述當前連接的第一緩存的情況下,將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中之后,還包括依據(jù)所述初始數(shù)據(jù)在所述第二緩存中占用的存儲空間的大小擴充所述第一緩存。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,還包括將所述初始數(shù)據(jù)在第二緩存中存儲的那部分拷貝至所述擴充后的第一緩存中。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述采用分散讀機制從當前連接的底層接收緩存中讀取初始數(shù)據(jù),具體包括從所述當前連接的底層接收緩存中讀取當前所有的初始數(shù)據(jù),并在讀取的同時對所述讀取操作進行鎖定。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,還包括當所述當前連接的底層接收緩存中的初始數(shù)據(jù)接收完畢之后,對所述讀取操作進行解鎖。
6.一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收裝置,其特征在于,采用所述邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存;所述應(yīng)用程序的所有連接共用一個大小固定的第二緩存;所述裝置包括數(shù)據(jù)接收單元,用于采用分散讀機制依次對所述多連接的底層接收緩存中的數(shù)據(jù)進行接收,所述數(shù)據(jù)接收單元包括讀取模塊,用于從當前連接的底層接收緩存中讀取初始數(shù)據(jù);比較模塊,用于比較所述初始數(shù)據(jù)與所述當前連接的第一緩存的大小存儲模塊,用于如果所述初始數(shù)據(jù)大于所述第一緩存,將所述初始數(shù)據(jù)按照順序分別存儲至所述當前連接的第一緩存和所述第二緩存中;如果所述初始數(shù)據(jù)小于或等于所述當前連接的第一緩存, 則將所述初始數(shù)據(jù)全部存儲至所述當前連接的第一緩存中;判斷模塊,用于判斷所述多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢;觸發(fā)模塊,用于在所述判斷模塊的結(jié)果為否的情況下,以未接收的任一個連接為當前連接并觸發(fā)所述數(shù)據(jù)接收系統(tǒng),直至所述多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。
7.根據(jù)權(quán)要求6所述的裝置,其特征在于,還包括擴充模塊,用于依據(jù)所述初始數(shù)據(jù)在所述第二緩存中占用的存儲空間的大小擴充所述第一緩存。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,還包括拷貝模塊,用于將所述初始數(shù)據(jù)在第二緩存中存儲的那部分拷貝至所述擴充后的第一緩存中。
9.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述讀取模塊,具體包括讀取子模塊,用于從所述當前連接的底層接收緩存中讀取當前所有的初始數(shù)據(jù); 鎖定子模塊,用于在讀取的同時對所述讀取操作進行鎖定。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,還包括解鎖模塊,用于當所述當前連接的底層接收緩存中的初始數(shù)據(jù)接收完畢之后,對所述讀取操作進行解鎖。
全文摘要
本發(fā)明公開了一種邊緣觸發(fā)模式的多連接數(shù)據(jù)接收方法及裝置,采用邊緣觸發(fā)模式的應(yīng)用程序的多個連接各具有一個大小固定的底層接收緩存,以及大小可變的第一緩存;應(yīng)用程序的所有連接共用一個大小固定的第二緩存;該方法包括采用分散讀機制依次對多連接的底層接收緩存中的數(shù)據(jù)進行接收,判斷多連接的底層接收緩存中的數(shù)據(jù)是否都接收完畢,如果否,則以未接收的任一個連接為當前連接執(zhí)行接收過程,直至多連接的底層接收緩存中的數(shù)據(jù)都接收完畢為止。采用本發(fā)明實施例公開的方法或裝置,可以在解決在應(yīng)用程序工作在邊緣觸發(fā)模式下,對于多連接數(shù)據(jù)接收時某些連接的應(yīng)用程序服務(wù)不可用的問題的同時,也能夠節(jié)約內(nèi)存空間,并提升應(yīng)用程序的運行速度。
文檔編號G06F12/08GK102508719SQ201110374689
公開日2012年6月20日 申請日期2011年11月22日 優(yōu)先權(quán)日2011年11月22日
發(fā)明者何仲君, 應(yīng)鴻浩, 柳正龍, 毛銀杰, 章樂焱, 魯建凡 申請人:恒生電子股份有限公司