本發(fā)明涉及網(wǎng)絡(luò)應(yīng)用交付控制領(lǐng)域,特別涉及一種在支持分頁的Linux系統(tǒng)用戶空間分配連續(xù)物理內(nèi)存的通用方法。
背景技術(shù):
Linux系統(tǒng)是一套免費使用和自由傳播的類Unix操作系統(tǒng),是一個基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運行主要的UNIX工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計思想,是一個性能穩(wěn)定的多用戶網(wǎng)絡(luò)操作系統(tǒng)。Linux系統(tǒng)將自身劃分為兩部分,一部分為核心軟件(kernel),也稱作內(nèi)核空間;另一部分為普通應(yīng)用程序,這部分稱為用戶空間(Userspace)。用戶空間中的代碼運行在較低的特權(quán)級別上,只能看到允許它們使用的部分系統(tǒng)資源,并且不能使用某些特定的系統(tǒng)功能,也不能直接訪問內(nèi)核空間和硬件設(shè)備,以及其他一些具體的使用限制。
TCP/IP協(xié)議棧(TCP/IP Protocol Stack)是一個網(wǎng)絡(luò)通訊模型,或稱一整個網(wǎng)絡(luò)傳輸協(xié)議家族,為互聯(lián)網(wǎng)的基礎(chǔ)通訊架構(gòu)。這個協(xié)議家族的兩個核心協(xié)議,包括TCP(傳輸控制協(xié)議)和IP(網(wǎng)際協(xié)議),為這個家族中最早通過的標準。由于在網(wǎng)絡(luò)通訊協(xié)議普遍采用分層的結(jié)構(gòu),當多個層次的協(xié)議共同工作時,類似計算機科學(xué)中的堆棧。把TCP/IP協(xié)議棧放在Linux系統(tǒng)用戶空間(userspace)來運行是一種技術(shù)趨勢,由此帶來的好處有很多,例如:由于不需要修改Linux內(nèi)核源代碼所以能使整個系統(tǒng)更穩(wěn)定,不會造成整個操作系統(tǒng)(Operating System,簡稱OS)的重啟進而造成系統(tǒng)對外提供的服務(wù)中斷。另 外,在Linux系統(tǒng)用戶空間運行TCP/IP協(xié)議棧還能避免GPL(General Public License,GNU通用公共授權(quán)),從而保護公司自有的軟件知識產(chǎn)權(quán)。
如上,若把TCP/IP協(xié)議棧放在Linux系統(tǒng)中的用戶空間運行,一個亟待解決的問題是:如何在用戶空間實現(xiàn)網(wǎng)卡的收包(transmit packet)和發(fā)包(receive packet)。已有技術(shù)的公開方案主要有二種:Netmap和DPDK(Intel Data Plane Development Kit,Intel數(shù)據(jù)平面開發(fā)套件)。其一,Netmap方案的設(shè)計目標是L2/L3/L4層的快速轉(zhuǎn)發(fā),當拿來做L4/L7層的負載均衡時很難避免內(nèi)存拷貝,從而無法實現(xiàn)大流量下的高性能,不在本發(fā)明所考慮的應(yīng)用環(huán)境;其二,DPDK的測試結(jié)果證明要想獲得網(wǎng)絡(luò)運行的高性能,就需要在Linux系統(tǒng)的用戶空間對網(wǎng)卡進行DMA(直接內(nèi)存訪問,Direct Memory Access)操作。。DPDK采用Huge page可以實現(xiàn)在用戶空間分配連續(xù)物理內(nèi)存,但是,DPDK的方案必須依賴于巨頁(huge page)的支持,處理器必須提供2M或者1G的huge page,目前只能在部分CPU上實現(xiàn),很多低端CPU是不支持huge page的。
進一步地,通過huge page方法在用戶空間分配連續(xù)物理內(nèi)存通常采用伙伴算法。Linux的伙伴算法是把用戶空間所有的空閑頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面,例如,第0組中塊的大小都為20(1個頁面),第1組中塊的大小為都為21(2個頁面),第9組中塊的大小都為29(512個頁面)。也就是說,每一組中塊的大小是相同的,且這同樣大小的塊形成一個鏈表。伙伴系統(tǒng)的宗旨就是用最小的內(nèi)存塊來滿足內(nèi)核的對于內(nèi)存的請求。
技術(shù)實現(xiàn)要素:
為克服已有技術(shù)中存在的問題,本發(fā)明提出并設(shè)計了一種不依賴于huge page的在Linux系統(tǒng)用戶空間上分配連續(xù)物理內(nèi)存的通用方法,使得任何運行在支持分頁的CPU上的Linux系統(tǒng)都能實現(xiàn)在用戶空間分配連續(xù)物理內(nèi)存。
為實現(xiàn)上述目的,本發(fā)明特提出以下步驟:一種在Linux系統(tǒng)用戶空間分配 連續(xù)物理內(nèi)存的方法,包括初始化步驟和分配連續(xù)物理內(nèi)存步驟,所述的初始化步驟中至少包括2次用戶空間與物理內(nèi)存的映射分配步驟。
其中所述初始化步驟包括:
步驟1、在用戶空間以頁為單位申請內(nèi)存,將用戶空間與物理內(nèi)存進行映射分配;
步驟2、對上述映射分配的頁面空間進行標注,并將所述已標注映射分配頁的物理內(nèi)存地址加入到伙伴算法中;
步驟3、重復(fù)步驟1和2,直到分配的總物理內(nèi)存地址滿足需求;
步驟4、從上述的伙伴算法中找出物理內(nèi)存連續(xù)的內(nèi)存塊地址,用戶空間與所找出物理內(nèi)存連續(xù)的內(nèi)存塊地址再次映射分配,生成新的映射分配并替換原映射分配后放入伙伴系統(tǒng),然后計算出物理內(nèi)存和新的映射分配的偏移值保存在伙伴系統(tǒng)中。
所述的分配連續(xù)物理內(nèi)存步驟包括:
步驟1、從上述初始化步驟完成的伙伴系統(tǒng)中得到需要的連續(xù)物理內(nèi)存的首地址;
步驟2、將上述物理內(nèi)存的首地址加上所述偏移值得到虛擬地址的首地址,即完成了在用戶空間分配連續(xù)物理內(nèi)存。
本發(fā)明在Linux系統(tǒng)用戶空間實現(xiàn)了物理內(nèi)存分配的伙伴算法,不改動Linux內(nèi)核而盡可能的實現(xiàn)連續(xù)物理內(nèi)存分配和管理,在支持分頁平臺上運行的Linux系統(tǒng)都能實現(xiàn),通用性強,且不需要依賴于特定的硬件。
附圖說明
圖1是本發(fā)明LINUX系統(tǒng)中用戶空間結(jié)構(gòu)示意圖;
圖2是本發(fā)明方法流程圖;
圖3是本發(fā)明初始化步驟的一種較佳實施例流程圖。
具體實施方式
在以下的敘述中,為了使讀者更好地理解本申請而提出了許多技術(shù)細節(jié)。但是,本領(lǐng)域的普通技術(shù)人員可以理解,即使沒有這些技術(shù)細節(jié)和基于以下各實施方式的種種變化和修改,也是本申請各權(quán)利要求所要求保護的技術(shù)方案。
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明的實施方式作進一步地詳細描述。
如圖1所示,本發(fā)明系統(tǒng)包括支持分頁的硬件設(shè)備、LINUX操作系統(tǒng)內(nèi)核、LINUX系統(tǒng)調(diào)用接口及用戶空間,其中在用戶空間至少包括網(wǎng)絡(luò)協(xié)議棧(例如:TCP/IP、HTTP等)、系統(tǒng)函數(shù)庫、連續(xù)的物理內(nèi)存分配頁模塊以及用戶層伙伴算法模塊等。
根據(jù)圖1所示系統(tǒng),再如圖2,本發(fā)明方法具體步驟如下:
初始化的步驟:
步驟1、在用戶空間以頁為單位申請內(nèi)存,將用戶空間與物理內(nèi)存進行映射分配,例如,在用戶空間以頁為單位建立虛擬地址與物理地址的映射分配頁;
步驟2、對上述映射分配的頁面空間進行標注,并將所述已標注映射分配頁的物理內(nèi)存地址加入到伙伴算法中;
步驟3、重復(fù)步驟1和2,直到分配的總物理內(nèi)存地址滿足需求;
步驟4、從上述的伙伴算法中找出物理內(nèi)存連續(xù)的內(nèi)存塊地址,用戶空間與所找出物理內(nèi)存連續(xù)的內(nèi)存塊地址再次映射分配,生成新的映射分配并替換原映射分配后放入伙伴系統(tǒng),然后計算出物理內(nèi)存和新的映射分配的偏移值保存在伙伴系統(tǒng)中。
所述的分配連續(xù)物理內(nèi)存步驟包括:
步驟1、從上述初始化步驟完成的伙伴系統(tǒng)中得到需要的連續(xù)物理內(nèi)存的首地址;
步驟2、將上述物理內(nèi)存的首地址加上所述偏移值得到虛擬地址的首地址,即完成了在用戶空間分配連續(xù)物理內(nèi)存。
圖3為本發(fā)明初始化步驟的一較佳實施例,在本發(fā)明Linux系統(tǒng)中的用戶空間分配連續(xù)物理內(nèi)存的初始化步驟如下:
步驟1、調(diào)用mmap從/dev/mem分配出一個4k的映射分配頁;對所述映射分配頁進行寫入操作,例如對該頁的第一個字節(jié)寫入1,從而確保該頁已經(jīng)被分配;
步驟2、根據(jù)/proc/self/memmap映射分配得到所述映射分配頁的物理內(nèi)存,并把所述物理內(nèi)存加入到伙伴算法中;為了防止swapout,需要調(diào)用mlock(加密鎖)對該頁進行加鎖保護;
步驟3、判斷映射分配頁是否已滿足總物理內(nèi)存的需求,如不滿足則重復(fù)步驟1-2,直到映射分配的總物理內(nèi)存滿足需求;
步驟4、如映射分配的總物理內(nèi)存已滿足需求,則從步驟3所述的伙伴算法 中找出物理內(nèi)存連續(xù)的內(nèi)存塊,進而對所述物理內(nèi)存連續(xù)的內(nèi)存塊通過mmap再次映射分配到新的虛擬地址,所述新的虛擬地址替換上述映射分配頁后再次傳遞給伙伴系統(tǒng),然后計算出物理內(nèi)存和新虛擬地址的偏移值保存在伙伴系統(tǒng)中。
需要說明的是,本發(fā)明各設(shè)備實施方式中提到的各單元都是邏輯單元,在物理上,一個邏輯單元可以是一個物理單元,也可以是一個物理單元的一部分,還可以以多個物理單元的組合實現(xiàn),這些邏輯單元本身的物理實現(xiàn)方式并不是最重要的,這些邏輯單元所實現(xiàn)的功能的組合才是解決本發(fā)明所提出的技術(shù)問題的關(guān)鍵。此外,為了突出本發(fā)明的創(chuàng)新部分,本發(fā)明沒有引入上述各設(shè)備實施方式以及與解決本發(fā)明所提出的技術(shù)問題關(guān)系不太密切的單元,但這并不表明不存在上述設(shè)備實施方式以及其它有關(guān)實施單元。
雖然通過參照本發(fā)明的某些優(yōu)選實施方式,已經(jīng)對本發(fā)明進行了圖示和描述,但本領(lǐng)域的普通技術(shù)人員應(yīng)該明白,可以在形式上和細節(jié)上對其作各種改變,而不偏離本發(fā)明的精神和范圍。