專(zhuān)利名稱(chēng):基于tcp連接實(shí)現(xiàn)并發(fā)服務(wù)的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)通信技術(shù),尤其涉及一種基于傳輸控制協(xié)議(TCP,Transmission Control Protocol)連接實(shí)現(xiàn)并發(fā)服務(wù)的方法及裝置。
背景技術(shù):
高性能計(jì)算技術(shù)是計(jì)算機(jī)技術(shù)的一個(gè)重要分支,具有高計(jì)算能力的計(jì)算機(jī)系統(tǒng),可以實(shí)現(xiàn)更大的計(jì)算量、單位時(shí)間內(nèi)能夠處理更多的數(shù)據(jù),從而為用戶提供更好的服務(wù)?,F(xiàn)有的各TCP/IP服務(wù)器中,對(duì)于多用戶的并發(fā)接入,一般采用多進(jìn)程的方式,SP對(duì)于每一個(gè)接入的用戶請(qǐng)求,配置一個(gè)進(jìn)程用于單獨(dú)處理該請(qǐng)求。圖I為現(xiàn)有基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法流程示意圖。參見(jiàn)圖1,該流程包 括步驟101,服務(wù)器監(jiān)聽(tīng)服務(wù)端口 ;本步驟中,服務(wù)器配置用于接收客戶端發(fā)起TCP連接的服務(wù)端口,通過(guò)監(jiān)聽(tīng)該配置的服務(wù)端口,可以監(jiān)聽(tīng)客戶端發(fā)起的TCP連接。步驟102,客戶端向服務(wù)器監(jiān)聽(tīng)的服務(wù)端口發(fā)起TCP連接;本步驟中,服務(wù)器在配置服務(wù)端口后,將配置的服務(wù)端口信息通知各客戶端,客戶端在需要與服務(wù)器建立TCP連接時(shí),通過(guò)該服務(wù)端口,向服務(wù)器發(fā)送TCP連接請(qǐng)求。步驟103,服務(wù)器分配進(jìn)程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并且生成該TCP 連接的 socket fd ;本步驟中,在Unix/Linux系統(tǒng)下,一個(gè)套接字(socket)句柄,相當(dāng)于一個(gè)文件,在socket上收發(fā)數(shù)據(jù),相當(dāng)于對(duì)一個(gè)文件進(jìn)行讀寫(xiě),因而,一個(gè)socket句柄,通常也用表示文件句柄的文件描述(fd, file descriptor)來(lái)表示。每一客戶端對(duì)應(yīng)一個(gè)進(jìn)程。步驟104,服務(wù)器fork進(jìn)程,讀取并處理生成的socket fd中的數(shù)據(jù);本步驟中,服務(wù)器通過(guò)進(jìn)程對(duì)socket fd中的數(shù)據(jù)進(jìn)行處理。步驟105,服務(wù)器的進(jìn)程檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該socket fd,銷(xiāo)毀進(jìn)程。由上述可見(jiàn),現(xiàn)有基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法,服務(wù)器采用單進(jìn)程方式接收客戶端的TCP連接請(qǐng)求,生成TCP連接的socket fd,然后通過(guò)fork進(jìn)程的方式來(lái)讀取并且處理socket fd中的數(shù)據(jù)。這樣,每一進(jìn)程處理服務(wù)器依據(jù)每一客戶端生成的socketfd中的數(shù)據(jù),不利于數(shù)據(jù)的共享,同時(shí),也增加了服務(wù)器的進(jìn)程調(diào)度,且需要服務(wù)器為每一請(qǐng)求TCP連接的客戶端創(chuàng)建和銷(xiāo)毀進(jìn)程,可接入的客戶端數(shù)較少,導(dǎo)致服務(wù)器資源的壓力較大,使得處理客戶端的TCP連接請(qǐng)求延遲,極大地降低了對(duì)客戶端請(qǐng)求響應(yīng)的實(shí)時(shí)性。具體來(lái)說(shuō),存在如下技術(shù)問(wèn)題第一,服務(wù)器通過(guò)單進(jìn)程接收客戶端的TCP連接請(qǐng)求并且獲得TCP連接的socketfd, 一個(gè)進(jìn)程進(jìn)行讀取并且處理建立連接后為一個(gè)客戶端生成的socket fd數(shù)據(jù),客戶端和服務(wù)器進(jìn)程是一一對(duì)應(yīng)的關(guān)系,導(dǎo)致大量并發(fā)的客戶端需要大量的進(jìn)程進(jìn)行分別處理,造成了服務(wù)器進(jìn)程資源的壓力;第二,由于采用的是單進(jìn)程接收客戶端的TCP連接并且獲得TCP連接的socketfd,因此,為各客戶端的socket fd數(shù)據(jù)進(jìn)行共享帶來(lái)了不方便;第三,由于一個(gè)進(jìn)程只能處理一個(gè)客戶端的socket fd數(shù)據(jù),等處理完socket fd數(shù)據(jù)又需要銷(xiāo)毀進(jìn)程,將導(dǎo)致頻繁地創(chuàng)建和銷(xiāo)毀進(jìn)程,從而對(duì)服務(wù)器造成了較大的開(kāi)銷(xiāo);第四,在并發(fā)客戶端較多時(shí),由于產(chǎn)生大量的進(jìn)程,將使得系統(tǒng)的進(jìn)程調(diào)度變得十分頻繁,造成處理客戶端請(qǐng)求連接的延遲,極大地降低了服務(wù)器對(duì)客戶端連接請(qǐng)求響應(yīng)的實(shí)時(shí)性。
發(fā)明內(nèi)容
本發(fā)明的實(shí)施例提供一種基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法,提升可接入服務(wù)器的客戶端數(shù)、減少資源開(kāi)銷(xiāo)。 本發(fā)明的實(shí)施例還提供一種基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的裝置,提升可接入服務(wù)器的客戶端數(shù)、減少資源開(kāi)銷(xiāo)。為達(dá)到上述目的,本發(fā)明實(shí)施例提供的一種基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法,包括預(yù)先在服務(wù)器中為進(jìn)程組中的每一進(jìn)程配置接收連接線程、檢測(cè)線程以及處理線程組;監(jiān)聽(tīng)到客戶端通過(guò)服務(wù)端口發(fā)起TCP連接請(qǐng)求,選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程;觸發(fā)選取的進(jìn)程中的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的套接字文件描述;觸發(fā)所述選取的進(jìn)程中的檢測(cè)線程讀取生成的套接字文件描述中的數(shù)據(jù);選取處理線程組中的處理線程,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理;所述選取的進(jìn)程中的檢測(cè)線程檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該套接字文件描述,結(jié)束與該客戶端的TCP連接。其中,所述方法進(jìn)一步包括基于進(jìn)程負(fù)載均衡的策略,通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程,作為進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程。其中,所述通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程包括獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);獲取進(jìn)程組針對(duì)進(jìn)程維持TCP連接的客戶端數(shù)平均值;獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的進(jìn)程,從中選取一個(gè)進(jìn)程。其中,在獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的進(jìn)程后,所述方法進(jìn)一步包括對(duì)獲取的每一進(jìn)程維持TCP連接的客戶端數(shù)所需的資源量進(jìn)行排序。其中,所述通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程包括獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);
選取進(jìn)程組中維持TCP連接的客戶端數(shù)最少的進(jìn)程。其中,在生成該TCP連接的套接字文件描述后,所述方法進(jìn)一步包括
接收連接線程將套接字文件描述設(shè)置為非阻塞方式,并將該套接字文件描述添加到改進(jìn)的輪詢中進(jìn)行套接字文件描述可讀檢測(cè)。其中,所述方法進(jìn)一步包括為每一個(gè)處理線程創(chuàng)建任務(wù)隊(duì)列。其中,所述任務(wù)隊(duì)列的長(zhǎng)度根據(jù)進(jìn)程組、處理線程組以及處理線程組中包含的處理線程數(shù)確定。其中,在選取處理線程組中的處理線程后,所述方法進(jìn)一步包括處理線程將檢測(cè)線程讀取的套接字文件描述放入該處理線程的任務(wù)隊(duì)列的隊(duì)列尾。其中,所述對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理包括處理線程從任務(wù)隊(duì)列的隊(duì)列頭取出套接字文件描述,讀取并且處理該套接字文件描述;處理線程處理完套接字文件描述中的數(shù)據(jù),繼續(xù)從任務(wù)隊(duì)列中取出套接字文件描述進(jìn)行處理,直到任務(wù)隊(duì)列為空。其中,所述選取處理線程組中的處理線程包括獲取處理線程組中每一處理線程維持TCP連接的客戶端數(shù);獲取處理線程組針對(duì)處理線程維持TCP連接的客戶端數(shù)平均值;獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的處理線程,從中選取一個(gè)處理線程。其中,所述選取處理線程組中的處理線程包括獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);選取進(jìn)程組中維持TCP連接的客戶端數(shù)最少的進(jìn)程。一種基于傳輸控制協(xié)議TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的裝置,該裝置包括進(jìn)程配置模塊、監(jiān)聽(tīng)模塊、進(jìn)程選取模塊、TCP連接模塊、數(shù)據(jù)讀取模塊、數(shù)據(jù)處理模塊以及檢測(cè)模塊,其中,進(jìn)程配置模塊,用于預(yù)先在服務(wù)器中為進(jìn)程組中的每一進(jìn)程配置接收連接線程、檢測(cè)線程以及處理線程組;監(jiān)聽(tīng)模塊,用于在監(jiān)聽(tīng)到客戶端通過(guò)服務(wù)端口發(fā)起的TCP連接請(qǐng)求后,向進(jìn)程選取模塊輸出觸發(fā)信息;進(jìn)程選取模塊,用于根據(jù)觸發(fā)信息,從進(jìn)程配置模塊中,選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程;TCP連接模塊,用于根據(jù)進(jìn)程選取模塊選取的進(jìn)程,觸發(fā)進(jìn)程中的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的套接字文件描述,向數(shù)據(jù)讀取模塊輸出觸發(fā)信息;數(shù)據(jù)讀取模塊,用于根據(jù)接收的觸發(fā)信息,觸發(fā)進(jìn)程中的檢測(cè)線程讀取生成的套接字文件描述中的數(shù)據(jù);數(shù)據(jù)處理模塊,用于選取處理線程組中的處理線程,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理;檢測(cè)模塊,用于采用進(jìn)程中的檢測(cè)線程檢測(cè)TCP連接模塊,當(dāng)檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該套接字文件描述,結(jié)束與該客戶端的TCP連接。較佳地,所述進(jìn)程配置模塊進(jìn)一步用于為每一個(gè)處理線程創(chuàng)建任務(wù)隊(duì)列。較佳地,所述TCP連接模塊在生成該TCP連接的套接字文件描述后,進(jìn)一步用于通過(guò)接收連接線程將套接字文件描述設(shè)置為非阻塞方式,并將該套接字文件描述添加到改進(jìn)的輪詢中中進(jìn)行套接字文件描述可讀檢測(cè)。較佳地,所述數(shù)據(jù)讀取模塊在選取處理線程組中的處理線程后,進(jìn)一步用于通過(guò)處理線程將檢測(cè)線程讀取的套接字文件描述放入該處理線程的任務(wù)隊(duì)列的隊(duì)列尾。較佳地,所述進(jìn)程選取模塊包括策略存儲(chǔ)單元、第一獲取單元、第二獲取單元以 及選取單元,其中,策略存儲(chǔ)單元,用于存儲(chǔ)基于進(jìn)程負(fù)載均衡的策略;第一獲取單元,用于根據(jù)觸發(fā)信息以及策略存儲(chǔ)單元存儲(chǔ)的策略,從進(jìn)程配置模塊中,獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);第二獲取單元,用于用于根據(jù)觸發(fā)信息以及策略存儲(chǔ)單元存儲(chǔ)的策略,從進(jìn)程配置模塊中,獲取進(jìn)程組針對(duì)進(jìn)程維持TCP連接的客戶端數(shù)平均值;選取單元,用于從第一獲取單元中,獲取維持TCP連接的客戶端數(shù)小于第二獲取單元中維持TCP連接的客戶端數(shù)平均值的進(jìn)程,從中選取一個(gè)進(jìn)程。由上述技術(shù)方案可見(jiàn),本發(fā)明實(shí)施例提供的一種基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法及裝置,預(yù)先在服務(wù)器中為進(jìn)程組中的每一進(jìn)程配置接收連接線程、檢測(cè)線程以及處理線程組;監(jiān)聽(tīng)到客戶端通過(guò)服務(wù)端口發(fā)起TCP連接請(qǐng)求,選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程;觸發(fā)選取的進(jìn)程中的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的套接字文件描述;觸發(fā)所述選取的進(jìn)程中的檢測(cè)線程讀取生成的套接字文件描述中的數(shù)據(jù);選取處理線程組中的處理線程,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理;所述選取的進(jìn)程中的檢測(cè)線程檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該套接字文件描述,結(jié)束與該客戶端的TCP連接。這樣,采用進(jìn)程中的線程對(duì)客戶端的TCP連接進(jìn)行處理,由于一個(gè)進(jìn)程包含有多個(gè)線程,而多個(gè)線程之間可以并發(fā)執(zhí)行任務(wù),可以提升可接入服務(wù)器的客戶端數(shù);服務(wù)器只需維護(hù)一個(gè)進(jìn)程就可以實(shí)現(xiàn)多個(gè)客戶端的TCP連接,無(wú)需頻繁地創(chuàng)建和銷(xiāo)毀進(jìn)程,從而有效減少資源開(kāi)銷(xiāo)。
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,以下將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹。顯而易見(jiàn)地,以下描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員而言,還可以根據(jù)這些附圖所示實(shí)施例得到其它的實(shí)施例及其附圖。圖I為現(xiàn)有基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法流程示意圖。圖2為本發(fā)明實(shí)施例基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法流程示意圖。圖3為本發(fā)明實(shí)施例基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法具體流程示意圖。圖4為本發(fā)明實(shí)施例基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的裝置結(jié)構(gòu)示意圖。
具體實(shí)施例方式以下將結(jié)合附圖對(duì)本發(fā)明各實(shí)施例的技術(shù)方案進(jìn)行清楚、完整的描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明的一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)的前提下所得到的所有其它實(shí)施例,都屬于本發(fā)明所保護(hù)的范圍。現(xiàn)有基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法,服務(wù)器采用單進(jìn)程方式接收客戶端的TCP連接請(qǐng)求,并處理生成的socket fd中的數(shù)據(jù)。使得每一進(jìn)程只能處理一個(gè)客戶端的數(shù)據(jù),使得可接入的客戶端數(shù)較少;而每一服務(wù)器的進(jìn)程數(shù)與CPU相關(guān),數(shù)量有限,因而,使得服務(wù)器的資源壓力大,為了降低服務(wù)器的資源壓力,需要配置多個(gè)服務(wù)器群,使得實(shí)現(xiàn)并發(fā)服務(wù)的成本高;同時(shí),也增加了服務(wù)器的進(jìn)程調(diào)度,且創(chuàng)建和銷(xiāo)毀進(jìn)程頻繁,資源開(kāi)銷(xiāo)大。進(jìn)程(process)是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,也就是說(shuō),是包含一定資源的內(nèi)存區(qū)域功能單元,操作系統(tǒng)利用進(jìn)程,可以將工作劃分為一些用進(jìn)程表示的功能單元,一個(gè)功能單元中,包含有一個(gè)或多個(gè)執(zhí)行單元,其中,執(zhí)行單元稱(chēng)為線程(thread)。實(shí)際應(yīng)用中,操作系統(tǒng)中的一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少包含一個(gè)線程。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。線程依存在應(yīng)用程序中,由應(yīng)用程序執(zhí)行控制,進(jìn)程中的多個(gè)線程可以同時(shí)執(zhí)行,通過(guò)與同屬一個(gè)進(jìn)程的其他線程,共享進(jìn)程所擁有的全部資源。本發(fā)明實(shí)施例中,考慮采用進(jìn)程中的線程,對(duì)客戶端的TCP連接進(jìn)行處理,由于一個(gè)進(jìn)程包含有多個(gè)線程,而多個(gè)線程之間可以并發(fā)執(zhí)行任務(wù),因而,可以有效提升可接入服務(wù)器的客戶端數(shù);進(jìn)一步地,考慮到實(shí)際應(yīng)用中,各客戶端在向服務(wù)器監(jiān)聽(tīng)的服務(wù)端口發(fā)起TCP連接時(shí),一般是具有先后順序的,很少有同時(shí)發(fā)起TCP連接的需求,因而,在線程處理任務(wù)時(shí),設(shè)置任務(wù)隊(duì)列,用于存儲(chǔ)接收的客戶端的數(shù)據(jù),并依序進(jìn)行處理任務(wù)隊(duì)列中客戶端的socket fd數(shù)據(jù)。這樣,只需維護(hù)一個(gè)進(jìn)程,可以實(shí)現(xiàn)多個(gè)客戶端的TCP連接,服務(wù)器無(wú)需頻繁地創(chuàng)建和銷(xiāo)毀進(jìn)程,從而有效降低了服務(wù)器的開(kāi)銷(xiāo)。圖2為本發(fā)明實(shí)施例基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法流程示意圖。參見(jiàn)圖2,該流程包括步驟201,預(yù)先在服務(wù)器中為進(jìn)程組中的每一進(jìn)程配置接收連接線程、檢測(cè)線程以及處理線程組;本步驟中,考慮到一個(gè)進(jìn)程包含有多個(gè)線程,而多個(gè)線程之間可以并發(fā)執(zhí)行任務(wù),因而,采用線程處理客戶端的TCP連接。這樣,可以有效提升可接入服務(wù)器的客戶端數(shù)。其中,較佳地,為每一進(jìn)程配置的接收連接線程為一個(gè),檢測(cè)線程為一個(gè),處理線程組為一個(gè),處理線程組中包含的處理線程為一個(gè)。本發(fā)明實(shí)施例中,為每一服務(wù)器配置一個(gè)進(jìn)程組,進(jìn)程組中包含的進(jìn)程個(gè)數(shù)可根據(jù)實(shí)際需要進(jìn)行設(shè)置。較佳地,該方法還進(jìn)一步包括為每一個(gè)處理線程創(chuàng)建任務(wù)隊(duì)列。本步驟中,任務(wù)隊(duì)列的長(zhǎng)度根據(jù)進(jìn)程組、處理線程組以及處理線程組中包含的處理線程數(shù)確定,較佳地,任務(wù)隊(duì)列長(zhǎng)度計(jì)算公式為
式中,L為任務(wù)隊(duì)列長(zhǎng)度;W為進(jìn)程組可接入的客戶端數(shù);P為進(jìn)程組中包含的進(jìn)程數(shù);N為創(chuàng)建任務(wù)隊(duì)列的進(jìn)程中的處理線程組中包含的處理線程數(shù)。步驟202,監(jiān)聽(tīng)到客戶端通過(guò)服務(wù)端口發(fā)起TCP連接請(qǐng)求,選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程;本步驟中,服務(wù)器監(jiān)聽(tīng)服務(wù)端口,通過(guò)服務(wù)端口,監(jiān)聽(tīng)客戶端向服務(wù)器監(jiān)聽(tīng)的服務(wù)端口發(fā)起的TCP連接請(qǐng)求,為該TCP連接請(qǐng)求選取進(jìn)程組中的一個(gè)進(jìn)程進(jìn)行處理。選取的方式,可以是隨機(jī)選取。本發(fā)明實(shí)施例中,較佳地,在選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程時(shí),還可以考慮進(jìn)程組中各進(jìn)程的負(fù)載,則該方法進(jìn)一步包括基于進(jìn)程負(fù)載均衡的策略,通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程,作為進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程。本步驟中,通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程包括獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);獲取進(jìn)程組針對(duì)進(jìn)程維持TCP連接的客戶端數(shù)平均值;獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的進(jìn)程,從中選取一個(gè)進(jìn)程。較佳地,在獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的進(jìn)程后,還可以進(jìn)一步包括對(duì)獲取的每一進(jìn)程維持TCP連接的客戶端數(shù)所需的資源量進(jìn)行排序。當(dāng)然,實(shí)際應(yīng)用中,通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程也可以包括獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);選取進(jìn)程組中維持TCP連接的客戶端數(shù)最少的進(jìn)程。這樣,考慮多進(jìn)程間負(fù)載均衡的運(yùn)用,實(shí)現(xiàn)了每一個(gè)進(jìn)程能夠服務(wù)客戶端數(shù)的均衡,不會(huì)造成某些進(jìn)程負(fù)載過(guò)重。步驟203,觸發(fā)選取的進(jìn)程中的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的socket fd ;本步驟中,通過(guò)進(jìn)程中的接收連接線程建立TCP連接,并生成該TCP連接的socketfd,與通過(guò)現(xiàn)有技術(shù)中的進(jìn)程建立TCP連接,并生成該TCP連接的socket fd相類(lèi)似,在此不再贅述。在生成該TCP連接的socket fd后,該方法進(jìn)一步包括進(jìn)程中的接收連接線程將socket fd設(shè)置為非阻塞方式,并將該socket fd添加到epoll中進(jìn)行socket fd可讀檢測(cè)。本步驟中,基于改進(jìn)的輪詢(印OlI)的高效可讀檢測(cè)機(jī)制,可以實(shí)現(xiàn)高效的異步通知機(jī)制,當(dāng)有數(shù)據(jù)時(shí),能夠高效地進(jìn)行異步的通知,從而能夠更加及時(shí)和高效地響應(yīng)客戶端的數(shù)據(jù),對(duì)于服務(wù)器的并發(fā)量的提高和QoS的提高都有很大的幫助。Socket fd包含兩種方式,一種是阻塞模式,一種是非阻塞模式,本發(fā)明實(shí)施例中,采用非阻塞的方式能夠避免cpu的阻塞等待。步驟204,觸發(fā)選取的進(jìn)程中的檢測(cè)線程讀取生成的socket fd中的數(shù)據(jù);本步驟中,對(duì)于將該socket fd添加到epoll中進(jìn)行socket fd可讀檢測(cè)的情形,讀取生成的socket fd中的數(shù)據(jù)即是進(jìn)程中的檢測(cè)線程周期性取出epoll中的可讀的socket fd。步驟205,選取處理線程組中的處理線程,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理;本發(fā)明實(shí)施例中,在選取進(jìn)程中的處理線程組中的處理線程后,該方法還可以進(jìn)一步包括進(jìn)程中的處理線程將檢測(cè)線程讀取的socket fd放入該處理線程的任務(wù)隊(duì)列的隊(duì)列尾。這樣,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理包括進(jìn)程中的處理線程從任務(wù)隊(duì)列的隊(duì)列頭取出socket fd,讀取并且處理該socketfd ;進(jìn)程中的處理線程處理完socket fd中的數(shù)據(jù),繼續(xù)從任務(wù)隊(duì)列中取出socket fd進(jìn)行處理,直到任務(wù)隊(duì)列為空。本步驟中,選取處理線程組中的處理線程包括獲取進(jìn)程中的處理線程組中每一處理線程維持TCP連接的客戶端數(shù);獲取進(jìn)程中的處理線程組針對(duì)處理線程維持TCP連接的客戶端數(shù)平均值;獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的處理線程,從中選取一個(gè)處理線程。較佳地,在獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的處理線程后,還可以進(jìn)一步包括對(duì)獲取的每一處理線程維持TCP連接的客戶端數(shù)所需的資源量進(jìn)行排序。當(dāng)然,實(shí)際應(yīng)用中,選取處理線程組中的處理線程也可以包括獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);選取進(jìn)程組中維持TCP連接的客戶端數(shù)最少的進(jìn)程。這樣,結(jié)合多線程的任務(wù)隊(duì)列,對(duì)每一線程對(duì)應(yīng)的任務(wù)隊(duì)列,運(yùn)用負(fù)載均衡,實(shí)現(xiàn)了每一個(gè)線程的任務(wù)數(shù)的均衡,不會(huì)造成某些線程負(fù)載過(guò)重;進(jìn)一步地,先進(jìn)先出任務(wù)隊(duì)列的運(yùn)用,對(duì)于客戶端高并發(fā)時(shí),使之能夠放入任務(wù)隊(duì)列,能夠避免數(shù)據(jù)的丟失;而且,一個(gè)線程能夠處理多個(gè)客戶端的socket fd數(shù)據(jù),極大地提高了線程的效率,相對(duì)于進(jìn)程處理,也減少了處理客戶端TCP連接請(qǐng)求的延遲,增加了對(duì)客戶端請(qǐng)求響應(yīng)的實(shí)時(shí)性。步驟206,選取的進(jìn)程中的檢測(cè)線程檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該socketfd,結(jié)束與該客戶端的TCP連接。本步驟中,進(jìn)程中的檢測(cè)線程檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該socket fd,結(jié)束與該客戶端的TCP連接后,進(jìn)程仍處于連接狀態(tài),直至與該進(jìn)程進(jìn)行TCP連接的所有客戶端都斷開(kāi)了 TCP連接,才銷(xiāo)毀該進(jìn)程。這樣,可以有效減少創(chuàng)建和銷(xiāo)毀進(jìn)程的次數(shù),從而節(jié)約了頻繁創(chuàng)建和銷(xiāo)毀進(jìn)程所需的資源開(kāi)銷(xiāo);而采用進(jìn)程組加上線程組的方式,多個(gè)客戶端的數(shù)據(jù)能夠很方便的進(jìn)行共享。圖3為本發(fā)明實(shí)施例基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法具體流程示意圖。參見(jiàn)圖
3,該流程包括 步驟301,在服務(wù)器中預(yù)先配置進(jìn)程組;本步驟中,較佳地,一個(gè)服務(wù)器中配置一個(gè)進(jìn)程組,通過(guò)進(jìn)程組中的進(jìn)程接收并且處理客戶端的TCP連接。進(jìn)程組中包含的進(jìn)程個(gè)數(shù)一般為服務(wù)器中包含的cpu個(gè)數(shù),本發(fā)明實(shí)施例中,設(shè)置為8個(gè)。當(dāng)然,實(shí)際應(yīng)用中,也可以根據(jù)客戶端數(shù)量進(jìn)行設(shè)置,例如,根據(jù)TCP連接的客戶端需求量,為6. 5萬(wàn)客戶端設(shè)置一個(gè)進(jìn)程組。步驟302,為進(jìn)程組的每一個(gè)進(jìn)程配置一個(gè)接收連接線程、一個(gè)檢測(cè)線程以及一個(gè)處理線程組,并為每一個(gè)處理線程創(chuàng)建任務(wù)隊(duì)列;本步驟中,較佳地,任務(wù)隊(duì)列的長(zhǎng)度等于進(jìn)程組對(duì)應(yīng)的客戶端數(shù)量(例如,6. 5萬(wàn))除以進(jìn)程數(shù)以及創(chuàng)建任務(wù)隊(duì)列的進(jìn)程中的處理線程組中的處理線程數(shù),本發(fā)明實(shí)施例中,進(jìn)程組數(shù)為1,進(jìn)程組包含的進(jìn)程數(shù)為1,進(jìn)程中的處理線程組數(shù)為1,每個(gè)處理線程組中的處理線程數(shù)設(shè)置為I個(gè),因而,任務(wù)隊(duì)列的長(zhǎng)度可以設(shè)置為6. 5萬(wàn)。步驟303,服務(wù)器監(jiān)聽(tīng)服務(wù)端口 ;本步驟中,服務(wù)器配置用于接收客戶端發(fā)起TCP連接的服務(wù)端口,通過(guò)監(jiān)聽(tīng)該配置的服務(wù)端口,可以監(jiān)聽(tīng)客戶端發(fā)起的TCP連接。步驟304,客戶端向服務(wù)器監(jiān)聽(tīng)的服務(wù)端口發(fā)起TCP連接請(qǐng)求;步驟305,服務(wù)器根據(jù)預(yù)先設(shè)置的連接分配策略,選取進(jìn)程組中的一個(gè)進(jìn)程;本步驟中,連接分配策略是基于負(fù)載均衡的策略,通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程,具體如下獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);獲取進(jìn)程組針對(duì)進(jìn)程維持TCP連接的客戶端數(shù)平均值;獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的進(jìn)程,從中選取一個(gè)進(jìn)程。本發(fā)明實(shí)施例中,統(tǒng)計(jì)每一個(gè)進(jìn)程維持TCP連接的客戶端數(shù),同時(shí)計(jì)算該進(jìn)程組的每一個(gè)進(jìn)程維持TCP連接的客戶端數(shù)的平均值,兩者進(jìn)行比較,獲取維持TCP連接的客戶端數(shù)小于平均值的進(jìn)程,從中選取一個(gè)進(jìn)程用于響應(yīng)發(fā)起的TCP連接請(qǐng)求。實(shí)際應(yīng)用中,可以是從獲取的進(jìn)程中,隨機(jī)選取一個(gè)進(jìn)程;也可以對(duì)獲取的進(jìn)程,再按照預(yù)先設(shè)置的其它連接分配策略,例如,考慮獲取的每一進(jìn)程維持TCP連接的客戶端數(shù)所需的資源量,進(jìn)行排序后獲取所需的一個(gè)進(jìn)程。較佳地,通過(guò)預(yù)先設(shè)置的負(fù)載均衡算法選擇進(jìn)程也可以是獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);選取進(jìn)程組中維持TCP連接的客戶端數(shù)最少的進(jìn)程。步驟306,觸發(fā)選取的進(jìn)程的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的socket fd ;步驟307,接收連接線程將socket fd設(shè)置為非阻塞方式,并將該socketfd添加到epoll中進(jìn)行socket fd可讀檢測(cè);本步驟中,進(jìn)程中的接收連接線程也用于處理socket fd。
Socket fd包含兩種方式,一種是阻塞模式,一種是非阻塞模式,阻塞模式會(huì)一直阻塞直到有數(shù)據(jù),非阻塞模式則不會(huì)阻塞等待數(shù)據(jù),關(guān)于阻塞模式以及非阻塞模式的詳細(xì)描述,具體可參見(jiàn)相關(guān)技術(shù)文獻(xiàn),在此不再贅述。改進(jìn)的輪詢(epoll)是Linux內(nèi)核為處理大批量句柄提供的高效socketfd可讀檢測(cè)方法,可讀檢測(cè)方法包括select、poll以及epoll,其中,epoll最為高效,關(guān)于epoll的詳細(xì)描述,具體可參見(jiàn)相關(guān)技術(shù)文獻(xiàn),在此不再贅述。將該socket fd添加到epoll中進(jìn)行socket fd可讀檢測(cè),具體可參見(jiàn)相關(guān)技術(shù)文獻(xiàn),在此不再贅述。步驟308,服務(wù)器的檢測(cè)線程周期性取出印oil中的可讀的socket fd ;本步驟中,根據(jù)epoll提供的功能,如果添加到epoll中的socket fd可讀,貝Ij進(jìn)程中的檢測(cè)線程可以通過(guò)epoll取出可讀的socket fd。步驟309,服務(wù)器按照預(yù)先設(shè)置的線程處理策略,選取處理線程組中的處理線程,將檢測(cè)線程取出的socket fd放入該處理線程的任務(wù)隊(duì)列的隊(duì)列尾;本步驟中,服務(wù)器選擇進(jìn)程的處理線程組中的某一處理線程的任務(wù)隊(duì)列是基于預(yù)先設(shè)置的線程處理策略,本發(fā)明實(shí)施例中,線程處理策略基于任務(wù)隊(duì)列負(fù)載均衡,任務(wù)隊(duì)列負(fù)載均衡算法可以是進(jìn)程中的處理線程組的每一個(gè)處理線程的任務(wù)隊(duì)列都計(jì)算自己任務(wù)隊(duì)列中的任務(wù)(socket fd)數(shù),同時(shí)計(jì)算該進(jìn)程中的處理線程組的每一個(gè)處理線程的任務(wù)隊(duì)列中的任務(wù)數(shù)的平均值,當(dāng)進(jìn)程中的處理線程檢查自己的任務(wù)隊(duì)列中的任務(wù)數(shù)小于該進(jìn)程中的處理線程組的平均值時(shí),分配任務(wù)到該處理線程的任務(wù)隊(duì)列中,放入隊(duì)列尾。步驟310,服務(wù)器觸發(fā)進(jìn)程的處理線程組中的該處理線程;本步驟中,如果任務(wù)隊(duì)列為空,表示進(jìn)程中的處理線程已處理完所有任務(wù),重新觸發(fā)該進(jìn)程中的處理線程進(jìn)行任務(wù)處理。如果不為空,則進(jìn)程中的處理線程正在處理任務(wù),則忽略該步驟。 步驟311,處理線程組中的處理線程從任務(wù)隊(duì)列的隊(duì)列頭取出socketfd,讀取并且處理該socket fd ;本步驟中,取出socket fd之后,讀取并且處理socket fd中的數(shù)據(jù)。步驟312,處理線程組中的處理線程處理完socket fd中的數(shù)據(jù),繼續(xù)從任務(wù)隊(duì)列中取出socket fd進(jìn)行處理,直到任務(wù)隊(duì)列為空;本步驟中,服務(wù)器進(jìn)程中的處理線程會(huì)一直從任務(wù)隊(duì)列中取出任務(wù)運(yùn)行,當(dāng)隊(duì)列為空時(shí)就等待,當(dāng)發(fā)現(xiàn)有任務(wù)時(shí)就繼續(xù)運(yùn)行。步驟313,進(jìn)程的檢測(cè)線程檢測(cè)到客戶端斷開(kāi)TCP連接,將socket fd從epoll中刪除并且關(guān)閉該socket fd,結(jié)束TCP連接。至此,基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的流程結(jié)束。本發(fā)明實(shí)施例中,經(jīng)過(guò)客戶端的實(shí)際模擬壓力測(cè)試,測(cè)試環(huán)境是8臺(tái)服務(wù)器,每一臺(tái)服務(wù)器可接入的客戶端數(shù)6萬(wàn),8臺(tái)服務(wù)器總共可接入48萬(wàn)客戶端。每一服務(wù)器配置8個(gè)cpu,對(duì)應(yīng)一個(gè)進(jìn)程組,每一進(jìn)程組中包含的進(jìn)程數(shù)設(shè)置為8,每一進(jìn)程中設(shè)置的線程組中,處理線程數(shù)設(shè)置為1,任務(wù)隊(duì)列的長(zhǎng)度設(shè)置為6萬(wàn)。啟動(dòng)8個(gè)進(jìn)程組,即每一服務(wù)器對(duì)應(yīng)的進(jìn)程組能夠處理6萬(wàn)個(gè)客戶端的數(shù)據(jù),8臺(tái)服務(wù)器總共能夠處理48萬(wàn)客戶端的數(shù)據(jù),每一服務(wù)器的8個(gè)進(jìn)程,總的處理能力是每秒鐘處理6萬(wàn)個(gè)客戶端的TCP連接請(qǐng)求,這樣,由8臺(tái)服務(wù)器組成的服務(wù)器群,能夠接入的并發(fā)客戶端數(shù)是48萬(wàn)。由上述可見(jiàn),本發(fā)明實(shí)施例基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法,服務(wù)器采用進(jìn)程中的接收連接線程、檢測(cè)線程以及處理線程組來(lái)實(shí)現(xiàn)接收客戶端的TCP連接請(qǐng)求,并獲得TCP連接的socket fd,通過(guò)非阻塞的socket fd方法,結(jié)合epoll的高效socket fd可讀檢測(cè),以及處理線程組以及任務(wù)隊(duì)列的方式,高效的讀取并且處理socket fd中的數(shù)據(jù),客戶端和進(jìn)程是多對(duì)一的關(guān)系,提升了可接入服務(wù)器的客戶端數(shù),有利于數(shù)據(jù)的共享,減少了服務(wù)器的進(jìn)程調(diào)度,也減少了進(jìn)行頻繁創(chuàng)建和銷(xiāo)毀進(jìn)程導(dǎo)致的資源開(kāi)銷(xiāo),提高了處理socketfd數(shù)據(jù)的效率,減少了服務(wù)器資源的壓力,極大的減少了處理客戶端的連接請(qǐng)求的延遲,增加了對(duì)于客戶端請(qǐng)求響應(yīng)的實(shí)時(shí)性,對(duì)于服務(wù)器的并發(fā)量的提高和QoS的提高都有很大的幫助。具體來(lái)說(shuō),具有如下有益技術(shù)效果第一,基于印oil的高效可讀檢測(cè)機(jī)制,epoll實(shí)現(xiàn)了一個(gè)高效的異步通知機(jī)制,當(dāng)有數(shù)據(jù)時(shí),能夠高效地進(jìn)行異步的通知,能夠更加及時(shí)和高效地響應(yīng)客戶端的數(shù)據(jù),對(duì)于服務(wù)器的并發(fā)量的提聞和QoS的提聞都有很大的幫助。第二,非阻塞的運(yùn)用,采用非阻塞的方式能夠避免cpu的阻塞等待。第三,多線程的運(yùn)用,實(shí)現(xiàn)了單個(gè)進(jìn)程組能夠服務(wù)6. 5萬(wàn)用戶,提升了服務(wù)器可接入的客戶端數(shù),降低了服務(wù)器的進(jìn)程資源壓力。第四,多進(jìn)程間負(fù)載均衡的運(yùn)用,實(shí)現(xiàn)了每一個(gè)進(jìn)程能夠服務(wù)客戶端數(shù)的均衡,不會(huì)造成某些進(jìn)程負(fù)載過(guò)重。第五,多線程的隊(duì)列的負(fù)載均衡的運(yùn)用,實(shí)現(xiàn)了每一個(gè)線程的任務(wù)數(shù)的均衡,不會(huì)造成某些線程負(fù)載過(guò)重。第六,先進(jìn)先出任務(wù)隊(duì)列的運(yùn)用,對(duì)于客戶端高并發(fā)時(shí),能夠避免數(shù)據(jù)的丟失,使之能夠放入任務(wù)隊(duì)列,后續(xù)再進(jìn)行處理,同時(shí)先到達(dá)的請(qǐng)求先處理。第七,由于采用的是進(jìn)程組加上線程組的方式,所以多個(gè)客戶端的數(shù)據(jù)能夠很方便的共享。第八,由于采用了進(jìn)程組和線程組的方法,因而能夠極大地減少服務(wù)器資源的開(kāi)銷(xiāo),不會(huì)頻繁地創(chuàng)建和刪除進(jìn)程,提高了服務(wù)器的效率。第九,由于采用了任務(wù)隊(duì)列的方法,一個(gè)線程能夠處理多個(gè)客戶端的socket fd數(shù)據(jù),極大地提高了線程的效率,一個(gè)進(jìn)程可以并發(fā)處理多個(gè)客戶端的TCP連接請(qǐng)求,極大的減少了處理客戶端TCP連接請(qǐng)求的延遲,增加了對(duì)客戶端請(qǐng)求響應(yīng)的實(shí)時(shí)性。圖4為本發(fā)明實(shí)施例基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的裝置結(jié)構(gòu)示意圖。參見(jiàn)圖4,該裝置為服務(wù)器,包括進(jìn)程配置模塊、監(jiān)聽(tīng)模塊、進(jìn)程選取模塊、TCP連接模塊、數(shù)據(jù)讀取模塊、數(shù)據(jù)處理模塊以及檢測(cè)模塊,其中,進(jìn)程配置模塊,用于預(yù)先在服務(wù)器中為進(jìn)程組中的每一進(jìn)程配置接收連接線程、檢測(cè)線程以及處理線程組;本發(fā)明實(shí)施例中,進(jìn)程配置模塊進(jìn)一步用于為每一個(gè)處理線程創(chuàng)建任務(wù)隊(duì)列。任務(wù)隊(duì)列的長(zhǎng)度根據(jù)進(jìn)程組、處理線程組以及處理線程組中包含的處理線程數(shù)確定。監(jiān)聽(tīng)模塊,用于在監(jiān)聽(tīng)到客戶端通過(guò)服務(wù)端口發(fā)起的TCP連接請(qǐng)求后,向進(jìn)程選取模塊輸出觸發(fā)信息;進(jìn)程選取模塊,用于根據(jù)觸發(fā)信息,從進(jìn)程配置模塊中,選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程;本發(fā)明實(shí)施例中,進(jìn)程選取模塊包括策略存儲(chǔ)單元、第一獲取單元、第二獲取單元以及選取單元(圖中未示出),其中,策略存儲(chǔ)單元,用于存儲(chǔ)基于進(jìn)程負(fù)載均衡的策略;第一獲取單元,用于根據(jù)觸發(fā)信息以及策略存儲(chǔ)單元存儲(chǔ)的策略,從進(jìn)程配置模塊中,獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù);第二獲取單元,用于用于根據(jù)觸發(fā)信息以及策略存儲(chǔ)單元存儲(chǔ)的策略,從進(jìn)程配置模塊中,獲取進(jìn)程組針對(duì)進(jìn)程維持TCP連接的客戶端數(shù)平均值;選取單元,用于從第一獲取單元中,獲取維持TCP連接的客戶端數(shù)小于第二獲取單元中維持TCP連接的客戶端數(shù)平均值的進(jìn)程,從中選取一個(gè)進(jìn)程。 TCP連接模塊,用于根據(jù)進(jìn)程選取模塊選取的進(jìn)程,觸發(fā)進(jìn)程中的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的socket fd,向數(shù)據(jù)讀取模塊輸出觸發(fā)信息;本發(fā)明實(shí)施例中,TCP連接模塊在生成該TCP連接的socket fd后,進(jìn)一步用于通過(guò)接收連接線程將socket fd設(shè)置為非阻塞方式,并將該socket fd添加到epoll中進(jìn)行socket fd可讀檢測(cè)。數(shù)據(jù)讀取模塊,用于根據(jù)接收的觸發(fā)信息,觸發(fā)進(jìn)程中的檢測(cè)線程讀取生成的socket fd中的數(shù)據(jù);本發(fā)明實(shí)施例中,數(shù)據(jù)讀取模塊在選取處理線程組中的處理線程后,還可以進(jìn)一步用于通過(guò)處理線程將檢測(cè)線程讀取的socket fd放入該處理線程的任務(wù)隊(duì)列的隊(duì)列尾。數(shù)據(jù)處理模塊,用于選取處理線程組中的處理線程,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理;檢測(cè)模塊,用于采用進(jìn)程中的檢測(cè)線程檢測(cè)TCP連接模塊,當(dāng)檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該socket fd,結(jié)束與該客戶端的TCP連接。顯然,本領(lǐng)域技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若對(duì)本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也包含這些改動(dòng)和變型在內(nèi)。
權(quán)利要求
1.一種基于傳輸控制協(xié)議TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法,包括 預(yù)先在服務(wù)器中為進(jìn)程組中的每一進(jìn)程配置接收連接線程、檢測(cè)線程以及處理線程組; 監(jiān)聽(tīng)到客戶端通過(guò)服務(wù)端口發(fā)起TCP連接請(qǐng)求,選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程; 觸發(fā)選取的進(jìn)程中的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的套接字文件描述; 觸發(fā)所述選取的進(jìn)程中的檢測(cè)線程讀取生成的套接字文件描述中的數(shù)據(jù); 選取處理線程組中的處理線程,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理; 所述選取的進(jìn)程中的檢測(cè)線程檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該套接字文件描述,結(jié)束與該客戶端的TCP連接。
2.根據(jù)權(quán)利要求I所述的方法,其中,所述方法進(jìn)一步包括 基于進(jìn)程負(fù)載均衡的策略,通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程,作為進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程。
3.根據(jù)權(quán)利要求2所述的方法,其中,所述通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程包括 獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù); 獲取進(jìn)程組針對(duì)進(jìn)程維持TCP連接的客戶端數(shù)平均值; 獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的進(jìn)程,從中選取一個(gè)進(jìn)程。
4.根據(jù)權(quán)利要求3所述的方法,其中,在獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的進(jìn)程后,所述方法進(jìn)一步包括 對(duì)獲取的每一進(jìn)程維持TCP連接的客戶端數(shù)所需的資源量進(jìn)行排序。
5.根據(jù)權(quán)利要求2所述的方法,其中,所述通過(guò)預(yù)先設(shè)置的負(fù)載分配均衡算法選擇進(jìn)程包括 獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù); 選取進(jìn)程組中維持TCP連接的客戶端數(shù)最少的進(jìn)程。
6.根據(jù)權(quán)利要求I所述的方法,其中,在生成該TCP連接的套接字文件描述后,所述方法進(jìn)一步包括 接收連接線程將套接字文件描述設(shè)置為非阻塞方式,并將該套接字文件描述添加到改進(jìn)的輪詢中進(jìn)行套接字文件描述可讀檢測(cè)。
7.根據(jù)權(quán)利要求I至6任一項(xiàng)所述的方法,其中,所述方法進(jìn)一步包括 為每一個(gè)處理線程創(chuàng)建任務(wù)隊(duì)列。
8.根據(jù)權(quán)利要求7所述的方法,其中,所述選取處理線程組中的處理線程包括 獲取處理線程組中每一處理線程維持TCP連接的客戶端數(shù); 獲取處理線程組針對(duì)處理線程維持TCP連接的客戶端數(shù)平均值; 獲取維持TCP連接的客戶端數(shù)小于維持TCP連接的客戶端數(shù)平均值的處理線程,從中選取一個(gè)處理線程。
9.一種基于傳輸控制協(xié)議TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的裝置,其特征在于,該裝置包括進(jìn)程配置模塊、監(jiān)聽(tīng)模塊、進(jìn)程選取模塊、TCP連接模塊、數(shù)據(jù)讀取模塊、數(shù)據(jù)處理模塊以及檢測(cè)模塊,其中, 進(jìn)程配置模塊,用于預(yù)先在服務(wù)器中為進(jìn)程組中的每一進(jìn)程配置接收連接線程、檢測(cè)線程以及處理線程組; 監(jiān)聽(tīng)模塊,用于在監(jiān)聽(tīng)到客戶端通過(guò)服務(wù)端口發(fā)起的TCP連接請(qǐng)求后,向進(jìn)程選取模塊輸出觸發(fā)信息; 進(jìn)程選取模塊,用于根據(jù)觸發(fā)信息,從進(jìn)程配置模塊中,選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程; TCP連接模塊,用于根據(jù)進(jìn)程選取模塊選取的進(jìn)程,觸發(fā)進(jìn)程中的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的套接字文件描述,向數(shù)據(jù)讀取模塊輸出觸發(fā)信息; 數(shù)據(jù)讀取模塊,用于根據(jù)接收的觸發(fā)信息,觸發(fā)進(jìn)程中的檢測(cè)線程讀取生成的套接字文件描述中的數(shù)據(jù); 數(shù)據(jù)處理模塊,用于選取處理線程組中的處理線程,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理; 檢測(cè)模塊,用于采用進(jìn)程中的檢測(cè)線程檢測(cè)TCP連接模塊,當(dāng)檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該套接字文件描述,結(jié)束與該客戶端的TCP連接。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述進(jìn)程選取模塊包括策略存儲(chǔ)單元、第一獲取單元、第二獲取單元以及選取單元,其中, 策略存儲(chǔ)單元,用于存儲(chǔ)基于進(jìn)程負(fù)載均衡的策略; 第一獲取單元,用于根據(jù)觸發(fā)信息以及策略存儲(chǔ)單元存儲(chǔ)的策略,從進(jìn)程配置模塊中,獲取進(jìn)程組中每一進(jìn)程維持TCP連接的客戶端數(shù); 第二獲取單元,用于用于根據(jù)觸發(fā)信息以及策略存儲(chǔ)單元存儲(chǔ)的策略,從進(jìn)程配置模塊中,獲取進(jìn)程組針對(duì)進(jìn)程維持TCP連接的客戶端數(shù)平均值; 選取單元,用于從第一獲取單元中,獲取維持TCP連接的客戶端數(shù)小于第二獲取單元中維持TCP連接的客戶端數(shù)平均值的進(jìn)程,從中選取一個(gè)進(jìn)程。
全文摘要
本發(fā)明公開(kāi)了一種基于TCP連接實(shí)現(xiàn)并發(fā)服務(wù)的方法及裝置,預(yù)先在服務(wù)器中為進(jìn)程組中的每一進(jìn)程配置接收連接線程、檢測(cè)線程以及處理線程組;監(jiān)聽(tīng)到客戶端通過(guò)服務(wù)端口發(fā)起TCP連接請(qǐng)求,選取進(jìn)程組中用于處理TCP連接請(qǐng)求的進(jìn)程;觸發(fā)選取的進(jìn)程中的接收連接線程接收客戶端的TCP連接請(qǐng)求,建立TCP連接,并生成該TCP連接的套接字文件描述;觸發(fā)所述選取的進(jìn)程中的檢測(cè)線程讀取生成的套接字文件描述中的數(shù)據(jù);選取處理線程組中的處理線程,對(duì)檢測(cè)線程讀取的數(shù)據(jù)進(jìn)行處理;所述選取的進(jìn)程中的檢測(cè)線程檢測(cè)到客戶端斷開(kāi)TCP連接,關(guān)閉該套接字文件描述,結(jié)束與該客戶端的TCP連接。應(yīng)用本發(fā)明,可以提升可接入服務(wù)器的客戶端數(shù)、減少資源開(kāi)銷(xiāo)。
文檔編號(hào)H04L29/06GK102916953SQ201210387819
公開(kāi)日2013年2月6日 申請(qǐng)日期2012年10月12日 優(yōu)先權(quán)日2012年10月12日
發(fā)明者馬宇堅(jiān), 湯立輝 申請(qǐng)人:青島海信傳媒網(wǎng)絡(luò)技術(shù)有限公司