午夜毛片免费看,老师老少妇黄色网站,久久本道综合久久伊人,伊人黄片子

一種基于Linux大頁內存的易擴展頁面架構的制作方法

文檔序號:11691011閱讀:294來源:國知局
一種基于Linux大頁內存的易擴展頁面架構的制造方法與工藝

本發(fā)明屬于通信技術領域,具體涉及一種基于linux大頁內存的易擴展頁面架構。



背景技術:

內存管理是linux內核中最重要的一部分。內存采用“分頁機制”,用于支持對大地址空間的快速、高效的管理。雖然原則上內存頁面大小是可配置的,但linux內核中采用默認的4kb(4096字節(jié))頁面,即小頁。當linux操作系統(tǒng)上運行內存需求量較大的應用程序時,由于其采用的默認頁面大小為4kb,因而會產生較多tlbmiss和缺頁中斷,從而大大影響應用程序的性能,因此,linux內核中也引入大頁面支持。當操作系統(tǒng)以2mb甚至更大作為分頁的單位時,這大大減少tlbmiss和缺頁中斷的數量,顯著提高應用程序的性能。

為了能以最小的代價實現(xiàn)大頁面支持,linux操作系統(tǒng)采用了基于hugetlbfs特殊文件系統(tǒng)2m字節(jié)大頁面支持。這種采用特殊文件系統(tǒng)形式支持大頁面的方式,使得應用程序可以根據需要靈活地選擇虛存頁面大小。但是,從本質上講hugetlbfs的實現(xiàn)方式僅僅是一個通過“打補丁”的手段來支持靈活的內存頁面大小,受限于linux內核。大頁文件系統(tǒng)與小頁仍共用伙伴系統(tǒng),這使得在大頁上的開發(fā)設計時,難免會影響到小頁,不利于進一步的開發(fā)和擴展。



技術實現(xiàn)要素:

鑒于上述,本發(fā)明提供了一種基于linux大頁內存的易擴展頁面架構,該架構不再與小頁文件系統(tǒng)共用伙伴系統(tǒng),被單獨管理,且能夠與linux內核進行解耦,提升內存存儲調用的獨立性。

一種基于linux大頁內存的易擴展頁面架構,包括:大頁內存及調用大頁內存的接口函數,所述的大頁內存分為多個節(jié)點,每個節(jié)點分為多個分區(qū),每個分區(qū)由以雙向鏈表的形式連接在一起的多個2m大頁組成,所述的接口函數包括用于獲取單個大頁的申請函數、用于釋放大頁的釋放函數、用于將大頁占為己有且禁止其他進程訪問的鎖函數以及用于恢復大頁自由的解鎖函數。

所述的每個大頁包含以下幾個條目:

flags:用于標記頁面的屬性,且其中包含如下標志位:

pg_locked,當頁被一個進程訪問時,該位置1,其他進程等待;

pg_dirty,當頁中的內容被修改后,該位置1,表示數據要寫回;

pg_private,該位為1表示頁不能被共享,為0可以被共享;

pg_referenced,pg_active,兩個標志位共同來記錄一個頁的訪問活躍程度,用在冷熱頁調度中,兩個位都為1時進入熱頁池,都為0時進入冷頁池,其他情況不移動;

mapping:用來指引正在映射的索引節(jié)點inode;

index:表示在映射表中的偏移;

lru:用于每個分區(qū)的大頁雙向鏈表構建,大頁鏈表順序按照最近最少使用算法,故叫做lru,這里lru指向前大頁的lrui-1和后大頁的lrui+1;

mapcount:用于記錄頁共享者的個數。

所述的申請函數實現(xiàn)從大頁內存中獲取單個大頁,具體過程為:

(a-1)查詢linux系統(tǒng)中的node_possible_map,獲取節(jié)點分布,判斷節(jié)點的個數以及節(jié)點是否含有內存空間,并從第一個含有內存空間的節(jié)點進行查詢;

(a-2)獲取當前節(jié)點的分區(qū)分布,判斷當前節(jié)點是否含有分區(qū),若是,執(zhí)行步驟(a-3),若否,結束該節(jié)點的查詢,并執(zhí)行步驟(a-7);

(a-3)查找當前節(jié)點的第一分區(qū),并判斷當前分區(qū)中是否空閑大頁,若是,執(zhí)行步驟(a-6),若否,執(zhí)行步驟(a-4);

(a-4)判斷當前節(jié)點的下一個分區(qū)中是否含有空閑大頁,若是,執(zhí)行步驟(a-6),若否,執(zhí)行步驟(a-5);

(a-5)重復循環(huán)步驟(a-4),直到遍歷當前節(jié)點的所有分區(qū)為止,若當前節(jié)點的最后一個分區(qū)不含有空閑大頁,執(zhí)行步驟(a-7)。

(a-6)將空閑大頁的共享計數mapcount設為1,并將該大頁從當前分區(qū)的活動鏈表上去除,調整該分區(qū)中前后大頁的lru1、lru2,使lru1指向后大頁,lru2指向前大頁,返回獲取的大頁,結束函數;

(a-7)將下一個節(jié)點作為當前節(jié)點,執(zhí)行步驟(a-2),直到遍歷所有含有內存空間的節(jié)點,若遍歷到最后一個含有內存空間的節(jié)點中的最后一個分區(qū)的所有大頁,未找到空閑大頁,則獲取大頁失敗。

所述的釋放函數實現(xiàn)將不使用的大頁釋放到大頁內存中,具體過程為:

(b-1)判斷當前大頁的共享計數mapcount是否為1,若是,執(zhí)行步驟(b-2),若否,將共享計數mapcount減1,結束大頁釋放;

(b-2)判斷是否能夠獲取當前大頁所在的節(jié)點及分區(qū)信息,若是,執(zhí)行步驟(b-3),若否,執(zhí)行報錯;

(b-3)根據獲取的當前大頁所在的節(jié)點及分區(qū)信息,將該大頁添加至其所在分區(qū)的大頁鏈表上,調整該大頁的lru1,使lru指向正確的前后大頁,調整前后大頁的lru2、lru3,使lru2、lru3指向該大頁,并將該大頁所屬的分區(qū)的空間大頁數目加1,將該大頁所屬的節(jié)點的空閑大頁數目加1,將該大頁的共享計數mapcount設為0,大頁釋放完成。

所述的鎖函數實現(xiàn)將大頁占為己有,禁止其他進程訪問,具體過程為:

(c-1)查看當前大頁的標志flags,判斷當前大頁的屬性是否為禁止鎖,若是,退出查看,若否,執(zhí)行步驟(c-2);

(c-2)繼續(xù)查看當前大頁的標志flags,判斷當前大頁是否已經被鎖,若是,執(zhí)行步驟(c-3),若否,執(zhí)行步驟(c-4);

(c-3)將當前進程添加到該大頁所屬節(jié)點的一個等待隊列中;

(c-4)將大頁標志里flags中的pg_locked設為1,完成該大頁的上鎖。

所述的解鎖函數實現(xiàn)恢復大頁自由,可以被其他進程訪問,具體過程為:

修改大頁的標志flags,將標志flags中的pg_locked設為0,表示該大頁可以被其他進程訪問。由于大頁被鎖,之前的所有請求該大頁是進程都被添加到該大頁所屬的節(jié)點中的等待隊列中,此時大頁被解鎖,將重新喚醒節(jié)點中等待隊列的進程,讓其繼續(xù)運行。

本發(fā)明在linux的內存管理中,實現(xiàn)了一套易拓展的大頁構架。該大頁構架拋棄了原有的伙伴系統(tǒng)機制,與小頁之間進行切割,單獨成塊。同時,大頁構建也實現(xiàn)了構架本身的結構定義、接口函數的定義。本發(fā)明的大頁構架不會牽涉到原有小頁的功能和實現(xiàn),可以方便進行大頁的壓縮、遷移等開發(fā)。

附圖說明

圖1為本發(fā)明實施例大頁內存的組織方式的示意圖;

圖2為本發(fā)明實施例大頁架構與上層接口示意圖。

具體實施方式

為了更為具體地描述本發(fā)明,下面結合附圖及具體實施方式對本發(fā)明的技術方案進行詳細說明。

本發(fā)明以linux系統(tǒng)的內存管理為基礎,并根據內核中的“分頁機制”下的大頁模式。通過簡化,實現(xiàn)了一種基于linux內存管理的非伙伴系統(tǒng)大頁架構。在內核中的組織方式,與原有大頁架構完全不同。

如圖1所示的是本實施例大頁內存采用的組織方式。在numa體系的計算機中,大頁內存分為3個節(jié)點node,每個節(jié)點的內存分為3個分區(qū)section,考慮性能方面的原因,分區(qū)的大小設為1g;每個分區(qū)由以雙向鏈表的形式連接在一起的3個2m大頁hugepage。

實際應用時,大頁內存可劃分為任意個節(jié)點,且每個節(jié)點可劃分為任意個分區(qū)。每個分區(qū)中都會建立一個雙向鏈表,每個大頁中的lru項,用來記錄該大頁的后一個大頁和前一大頁。

大頁是大頁內存中的基本單元,其中含有一些元數據,來記錄本大頁的信息。這些信息會在調用時使用,幫助大頁的組織和管理。具體分為下面幾個條目:

flags:用于標記頁面的屬性,flags中包含如下標志位:

pg_locked,當頁被一個進程訪問時,該位置1,其他進程等待;

pg_dirty,當頁中的內容被修改后,該位置1,表示數據要寫回;

pg_private,該位為1表示頁不能被共享,為0可以被共享;

pg_referenced,pg_active,兩個標志位共同來記錄一個頁的訪問活躍程度,用在冷熱頁調度中,兩個位都為1時進入熱頁池,都為0時進入冷頁池,其他情況不移動。

mapping:用來指引正在映射的索引節(jié)點inode;

index:表示在映射表中的偏移;

lru:用于每個分區(qū)的大頁雙向鏈表構建(大頁鏈表順序按照最近最少使用算法,故叫做lru),這里lru指向前后大頁的lrui-1、lrui+1;

mapcount:用于記錄頁共享者的個數。

如圖2所示,本實施例還提供了四個用于本大頁內存的四個接口函數,具體包括:申請函數alloc_page、釋放函數free_page、鎖函數lock_page以及解鎖函數unlock_page。

申請函數alloc_page用于從大頁內存中獲取單個大頁,具體實現(xiàn)過程為:

(a-1)查詢linux系統(tǒng)中的node_possible_map,獲取節(jié)點分布,判斷節(jié)點的個數以及節(jié)點是否含有內存空間,并從第一個含有內存空間的節(jié)點進行查詢;

(a-2)獲取當前節(jié)點的分區(qū)分布,判斷當前節(jié)點是否含有分區(qū),若是,執(zhí)行步驟(a-3),若否,結束該節(jié)點的查詢,并執(zhí)行步驟(a-7);

(a-3)查找當前節(jié)點的第一分區(qū),并判斷當前分區(qū)中是否空閑大頁,若是,表示可以獲取該空閑大頁,執(zhí)行步驟(a-6),若否,執(zhí)行步驟(a-4);

(a-4)判斷當前節(jié)點的下一個分區(qū)中是否含有空閑大頁,若是,執(zhí)行步驟(a-6),若否,執(zhí)行步驟(a-5);

(a-5)重復循環(huán)步驟(a-4),直到遍歷當前節(jié)點的所有分區(qū)為止,若當前節(jié)點的最后一個分區(qū)不含有空閑大頁,執(zhí)行步驟(a-7)。

(a-6)將空閑大頁的共享計數mapcount設為1,表示當前有一個進程在訪問該空閑大頁,并將該大頁從當前分區(qū)的活動鏈表上去除,同時,由于該頁已被獲取,不再空閑,調整該分區(qū)中前后大頁的lrui-1、lrui+1,使lrui-1指向后大頁,lrui+1指向前大頁,保持正確指向,返回獲取的大頁,結束函數;

(a-7)將下一個節(jié)點作為當前節(jié)點,執(zhí)行步驟(a-2),直到遍歷所有含有內存空間的節(jié)點,若遍歷到最后一個含有內存空間的節(jié)點中的最后一個分區(qū)的所有大頁,未找到空閑大頁,則獲取大頁失敗。

釋放函數free_page用于將不在使用大頁釋放到大頁內存中,具體實現(xiàn)過程為:

(b-1)判斷當前大頁的共享計數mapcount是否為1,若是,執(zhí)行步驟(b-2),若否,說明還有其他進程在使用,僅將共享計數mapcount減1,結束大頁釋放;

(b-2)判斷是否能夠獲取當前大頁所在的節(jié)點及分區(qū)信息,若是,執(zhí)行步驟(b-3),若否,執(zhí)行報錯;

(b-3)根據獲取的當前大頁所在的節(jié)點及分區(qū)信息,將該大頁添加至其所在分區(qū)的大頁鏈表上,調整該大頁的lrui,使lru指向正確的前后大頁,調整前后大頁的lrui-1、lrui+1,使lrui-1、lrui+1指向該大頁,并將該大頁所屬的分區(qū)的空間大頁數目加1,將該大頁所屬的節(jié)點的空閑大頁數目加1,將該大頁的共享計數mapcount設為0,大頁釋放完成。

鎖函數lock_page實現(xiàn)將大頁占為己有,禁止其他進程訪問,具體實現(xiàn)過程為:

(c-1)查看當前大頁的標志flags,判斷當前大頁的屬性是否為禁止鎖,若是,退出查看,若否,執(zhí)行步驟(c-2);

(c-2)繼續(xù)查看當前大頁的標志flags,判斷當前大頁是否已經被鎖,若是,執(zhí)行步驟(c-3),若否,執(zhí)行步驟(c-4);

(c-3)將當前進程添加到該大頁所屬節(jié)點的一個等待隊列中;

(c-4)將大頁標志里flags中的pg_locked設為1,表示該大頁不能再被其他進程訪問,完成該大頁的上鎖。

解鎖函數unlock_page實現(xiàn)恢復大頁自由,可以被其他進程訪問,具體過程為:

修改大頁的標志flags,將標志flags中的pg_locked設為0,表示該大頁可以被其他進程訪問。由于大頁被鎖,之前的所有請求該大頁是進程都被添加到該大頁所屬的節(jié)點中的等待隊列中,此時大頁被解鎖,將重新喚醒節(jié)點中等待隊列的進程,讓其繼續(xù)運行。

以上的大頁內存適用于現(xiàn)有的linux系統(tǒng)中,該內存構架不會牽涉到小頁系統(tǒng),提升了可擴展性。

以上所述的具體實施方式對本發(fā)明的技術方案和有益效果進行了詳細說明,應理解的是以上所述僅為本發(fā)明的最優(yōu)選實施例,并不用于限制本發(fā)明,凡在本發(fā)明的原則范圍內所做的任何修改、補充和等同替換等,均應包含在本發(fā)明的保護范圍之內。

當前第1頁1 2 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1