一種用戶態與核心態共享記憶體的管理方法和裝置

一種用戶態與核心態共享記憶體的管理方法和裝置

《一種用戶態與核心態共享記憶體的管理方法和裝置》是杭州迪普科技有限公司於2012年12月4日申請的專利,該專利的公布號為CN103034544A,申請號為2012105238515,授權公布日為2013年4月10日,發明人是趙丹。

《一種用戶態與核心態共享記憶體的管理方法和裝置》提供一種用戶態與核心態共享記憶體的管理方法和裝置。所述方法包括:將預定長度的物理記憶體作為共享記憶體分別映射到用戶態地址空間和核心態地址空間;將多個偽鍊表的頭節點保存到共享記憶體的最後區域;根據使用者需要申請記憶體的大小,從所述多個偽鍊表中選取一個偽鍊表,從所選取的偽鍊表中選取一個或多個節點,將選取的一個或多個節點對應的記憶體對象分配給該使用者,並將選取的一個或多個節點從所選取的偽鍊表中摘除。

2018年12月20日,《一種用戶態與核心態共享記憶體的管理方法和裝置》獲得第二十屆中國專利優秀獎。

(概述圖為《一種用戶態與核心態共享記憶體的管理方法和裝置》摘要附圖)

基本介紹

  • 中文名:一種用戶態與核心態共享記憶體的管理方法和裝置
  • 公布號:CN103034544A
  • 授權日:2013年4月10日
  • 申請號:2012105238515
  • 申請日:2012年12月4日
  • 申請人:杭州迪普科技有限公司
  • 地址:浙江省杭州市濱江區通和路68號中財大廈6層
  • 發明人:趙丹
  • Int.Cl.:G06F9/54(2006.01)I
  • 代理機構:北京博思佳智慧財產權代理有限公司
  • 代理人:林祥
  • 類別:發明專利
專利背景,發明內容,專利目的,技術方案,改善效果,附圖說明,技術領域,權利要求,實施方式,榮譽表彰,

專利背景

隨著網際網路(Internet)的迅猛發展,核心態進程和用戶態進程之間的數據互動越來越頻繁,並且互動的數據量越來越大。核心態進程和用戶態進程各自使用自己的地址空間,兩個狀態看到的虛擬地址空間是分離的,核心態進程和用戶態進程之間的數據互動需要專門的機制例如共享記憶體機制來實現。
在共享記憶體機制中,通過將一段物理記憶體同時映射到核心態地址空間和用戶態地址空間,來實現核心態進程和用戶態進程之間的數據通信。記憶體映射完成後,核心態進程和用戶態進程分別會獲得共享記憶體的基地址(虛擬地址)和長度。由於核心態進程和用戶態進程所獲取的基地址是不同的,所以要是使用傳統的鍊表內保存共享記憶體中記憶體對象的起始地址(虛擬地址)的方法來動態管理共享記憶體,就無法解決用戶態進程和核心態進程通用的問題。
具體地,2012年11月之前技術中主要提供如下兩種方案來進行共享記憶體的管理。
  • 方案一
一次性映射一大塊共享記憶體,然後靜態為使用者(核心態進程或用戶態進程)分配共享記憶體空間,即不管使用者最終使用多少記憶體,統一給使用者分配一定數量的記憶體。
該方案的缺點在於:1、如果使用者最終使用的記憶體小於為其分配的記憶體,會浪費記憶體;2、如果使用者最終使用的記憶體大於為其分配的記憶體,將導致記憶體越界,破壞其他記憶體使用者存儲的信息;3、不利於記憶體的回收和重新使用。
  • 方案二
不同使用者(核心態進程或用戶態進程)各自映射所需的共享記憶體,使用後將其釋放,下次使用再重新映射。
該方案的缺點在於:每次核心態進程和用戶態進程互動數據都需要進行共享記憶體的映射,這樣增大了系統的開銷,降低了核心態進程和用戶態進程之間數據互動效率。

發明內容

專利目的

《一種用戶態與核心態共享記憶體的管理方法和裝置》的目的是提供一種用戶態與核心態共享記憶體的管理方法和裝置,能夠提高數據的互動效率,同時節約記憶體。

技術方案

《一種用戶態與核心態共享記憶體的管理方法和裝置》提供技術方案如下:
一種用戶態與核心態共享記憶體的管理方法,包括:
將預定長度的物理記憶體作為共享記憶體分別映射到用戶態地址空間和核心態地址空間,映射完成後,用戶態進程和核心態進程在各自的地址空間分別得到共享記憶體的基地址;
將多個偽鍊表的頭節點保存到共享記憶體的最後區域,其中,偽鍊表的節點的結構包括對象類型和偽鍊表中下一個節點的起始地址相對於基地址的偏移,且每種對象類型對應一種長度的記憶體對象;
根據使用者需要申請記憶體的大小,從所述多個偽鍊表中選取一個偽鍊表,從所選取的偽鍊表中選取一個或多個節點,將選取的一個或多個節點對應的記憶體對象分配給該使用者,並將選取的一個或多個節點從所選取的偽鍊表中摘除,其中,所述使用者為核心態進程或用戶態進程,所述使用者能夠將自己的基地址加上所分配的記憶體對象的起始偏移得到記憶體對象的起始地址,並根據所述起始地址對所述記憶體對象進行操作。
一種用戶態與核心態共享記憶體的管理裝置,包括:
記憶體映射單元,用於將預定長度的物理記憶體作為共享記憶體分別映射到用戶態地址空間和核心態地址空間,映射完成後,用戶態進程和核心態進程在各自的地址空間分別得到共享記憶體的基地址;
偽鍊表建立單元,用於將多個偽鍊表的頭節點保存到共享記憶體的最後區域,其中,偽鍊表的節點的結構包括對象類型和偽鍊表中下一個節點的起始地址相對於基地址的偏移,且每種對象類型對應一種長度的記憶體對象;
記憶體分配單元,用於根據使用者需要申請記憶體的大小,從所述多個偽鍊表中選取一個偽鍊表,從所選取的偽鍊表中選取一個或多個節點,將選取的一個或多個節點對應的記憶體對象分配給該使用者,並將選取的一個或多個節點從所選取的偽鍊表中摘除,其中,所述使用者為核心態進程或用戶態進程,所述使用者能夠將自己的基地址加上所分配的記憶體對象的起始偏移得到記憶體對象的起始地址,並根據所述起始地址對所述記憶體對象進行操作。

改善效果

《一種用戶態與核心態共享記憶體的管理方法和裝置》提供的核心態和用戶態共享記憶體的管理方案,套用於核心態進程和用戶態進程之間存在大量數據互動的場合時,可以提高數據的互動效率,同時節約記憶體。

附圖說明

圖1是《一種用戶態與核心態共享記憶體的管理方法和裝置》實施例的用戶態與核心態共享記憶體的管理方法流程圖;
圖2是《一種用戶態與核心態共享記憶體的管理方法和裝置》實施例中共享記憶體的構成示意圖;
圖3是《一種用戶態與核心態共享記憶體的管理方法和裝置》實施例中普通對象對應的記憶體結構圖;
圖4是《一種用戶態與核心態共享記憶體的管理方法和裝置》實施例中特殊對象對應的記憶體結構圖。

技術領域

《一種用戶態與核心態共享記憶體的管理方法和裝置》涉及數據交換技術,尤其涉及一種用戶態與核心態共享記憶體的管理方法和裝置。

權利要求

1.一種用戶態與核心態共享記憶體的管理方法,其特徵在於,包括:將預定長度的物理記憶體作為共享記憶體分別映射到用戶態地址空間和核心態地址空間,映射完成後,用戶態進程和核心態進程在各自的地址空間分別得到共享記憶體的基地址;將多個偽鍊表的頭節點保存到共享記憶體的最後區域,其中,偽鍊表的節點的結構包括對象類型和偽鍊表中下一個節點的起始地址相對於基地址的偏移,且每種對象類型對應一種長度的記憶體對象;根據使用者需要申請記憶體的大小,從所述多個偽鍊表中選取一個偽鍊表,從所選取的偽鍊表中選取一個或多個節點,將選取的一個或多個節點對應的記憶體對象分配給該使用者,並將選取的一個或多個節點從所選取的偽鍊表中摘除,其中,所述使用者為核心態進程或用戶態進程,所述使用者能夠將自己的基地址加上所分配的記憶體對象的起始偏移得到記憶體對象的起始地址,並根據所述起始地址對所述記憶體對象進行操作。
2.如權利要求1所述的管理方法,其特徵在於,還包括:需要對記憶體對象進行釋放時,獲取待釋放記憶體對象的起始偏移和大小,根據所述起始偏移和大小將記憶體對象添加到相應偽鍊表中的相應節點中。
3.如權利要求2所述的管理方法,其特徵在於:所述多個偽鍊表包括:節點對應的記憶體對象的長度為16位元組、32位元組、64位元組、128位元組、256位元組、512位元組、1024位元組和2k位元組分別對應的16_list偽鍊表、32_list偽鍊表、64_list偽鍊表、128_list偽鍊表、256_list偽鍊表、512_list偽鍊表、1024_list偽鍊表和free_list偽鍊表。
4.如權利要求3所述的管理方法,其特徵在於,所述根據使用者需要申請記憶體的大小,從所述多個偽鍊表中選取一個偽鍊表,從所選取的偽鍊表中選取一個或多個節點,包括:當申請的記憶體的大小大於(1024-4)位元組時,則從free_list偽鍊表選取連續的n個節點,n等於申請的記憶體的大小除以2k後向上取整;當申請的記憶體的大小小於或等於(1024-4)位元組時,則從除free_list偽鍊表之外的其他偽鍊表中選取1個節點,當所述其他偽鍊表為空,則先從free_list偽鍊表中選取1個2k對象進行分割後,將分割得到的多個對象添加到所述其他偽鍊表中。
5.如權利要求3所述的管理方法,其特徵在於,還包括:當根據所述起始偏移和大小將記憶體對象添加到相應偽鍊表中的相應節點中後,若相應偽鍊表中有多個連續的節點對應的記憶體對象大小之和為2k,其該多個連續的節點中的第一個節點的起始偏移能夠被2k整除,則將這多個連續的節點從相應偽鍊表中摘除後,將相應的2k記憶體對象添加到free_list偽鍊表中。
6.一種用戶態與核心態共享記憶體的管理裝置,其特徵在於,包括:記憶體映射單元,用於將預定長度的物理記憶體作為共享記憶體分別映射到用戶態地址空間和核心態地址空間,映射完成後,用戶態進程和核心態進程在各自的地址空間分別得到共享記憶體的基地址;偽鍊表建立單元,用於將多個偽鍊表的頭節點保存到共享記憶體的最後區域,其中,偽鍊表的節點的結構包括對象類型和偽鍊表中下一個節點的起始地址相對於基地址的偏移,且每種對象類型對應一種長度的記憶體對象;記憶體分配單元,用於根據使用者需要申請記憶體的大小,從所述多個偽鍊表中選取一個偽鍊表,從所選取的偽鍊表中選取一個或多個節點,將選取的一個或多個節點對應的記憶體對象分配給該使用者,並將選取的一個或多個節點從所選取的偽鍊表中摘除,其中,所述使用者為核心態進程或用戶態進程,所述使用者能夠將自己的基地址加上所分配的記憶體對象的起始偏移得到記憶體對象的起始地址,並根據所述起始地址對所述記憶體對象進行操作。
7.如權利要求6所述的管理裝置,其特徵在於,還包括:記憶體釋放單元,用於需要對記憶體對象進行釋放時,獲取待釋放記憶體對象的起始偏移和大小,根據所述起始偏移和大小將記憶體對象添加到相應偽鍊表中的相應節點中。
8.如權利要求7所述的管理裝置,其特徵在於:所述多個偽鍊表包括:節點對應的記憶體對象的長度為16位元組、32位元組、64位元組、128位元組、256位元組、512位元組、1024位元組和2k位元組分別對應的16_list偽鍊表、32_list偽鍊表、64_list偽鍊表、128_list偽鍊表、256_list偽鍊表、512_list偽鍊表、1024_list偽鍊表和free_list偽鍊表。
9.如權利要求8所述的管理裝置,其特徵在於,所述記憶體分配單元進一步用於:當申請的記憶體的大小大於(1024-4)位元組時,則從free_list偽鍊表選取連續的n個節點,n等於申請的記憶體的大小除以2k後向上取整;當申請的記憶體的大小小於或等於(1024-4)位元組時,則從除free_list偽鍊表之外的其他偽鍊表中選取1個節點,當所述其他偽鍊表為空,則先從free_list偽鍊表中選取1個2k對象進行分割後,將分割得到的多個對象添加到所述其他偽鍊表中。
10.如權利要求8所述的管理裝置,其特徵在於,所述記憶體釋放單元還用於:當根據所述起始偏移和大小將記憶體對象添加到相應偽鍊表中的相應節點中後,若相應偽鍊表中有多個連續的節點對應的記憶體對象大小之和為2k,其該多個連續的節點中的第一個節點的起始偏移能夠被2k整除,則將這多個連續的節點從相應偽鍊表中摘除後,將相應的2k記憶體對象添加到free_list偽鍊表中。

實施方式

《一種用戶態與核心態共享記憶體的管理方法和裝置》實施例提供的用戶態與核心態共享記憶體的管理方法和裝置中,是在鍊表中保存記憶體對象的起始地址到共享記憶體的基地址的偏移,這樣不管在用戶態還是核心態都可以通過各自的基地址加上偏移來獲取記憶體對象的起始地址,進而實現用戶態進程和核心態進程共享記憶體的管理。
《一種用戶態與核心態共享記憶體的管理方法和裝置》實施例的技術方案能夠解決如下技術問題中的至少一個:
1、核心態進程與用戶態進程之間進行大量數據互動時,反覆進行共享記憶體映射,導致數據傳輸效率低的問題;
2、用戶態進程和核心態進程共享記憶體靜態分配帶來的記憶體浪費,以及其帶來的記憶體越界問題;
3、使用傳統鍊表內保存記憶體對象起始地址的方法來動態管理共享記憶體,就無法解決用戶態進程和核心態進程通用的問題。
以下結合附圖對《一種用戶態與核心態共享記憶體的管理方法和裝置》進行詳細描述。
參照圖1,《一種用戶態與核心態共享記憶體的管理方法和裝置》實施例的用戶態與核心態共享記憶體的管理方法,可以包括如下步驟:
步驟101,將預定長度的物理記憶體作為共享記憶體分別映射到用戶態地址空間和核心態地址空間,映射完成後,用戶態進程和核心態進程在各自的地址空間分別得到共享記憶體的基地址;
步驟102,將多個偽鍊表的頭節點保存到共享記憶體的最後區域,其中,偽鍊表的節點的結構包括對象類型和偽鍊表中下一個節點的起始地址相對於基地址的偏移,且每種對象類型對應一種長度的記憶體對象;
步驟103,根據使用者需要申請記憶體的大小,從所述多個偽鍊表中選取一個偽鍊表,從所選取的偽鍊表中選取一個或多個節點,將選取的一個或多個節點對應的記憶體對象分配給該使用者,並將選取的一個或多個節點從所選取的偽鍊表中摘除,其中,所述使用者為核心態進程或用戶態進程,所述使用者能夠將自己的基地址加上所分配的記憶體對象的起始偏移得到記憶體對象的起始地址,並根據所述起始地址對所述記憶體對象進行操作。
上述方法通過偽鍊表來對共享記憶體進行管理,使用者(用戶態進程和核心態進程)獲取到的是記憶體對象的起始地址到共享記憶體的基地址的偏移,這樣不管在用戶態還是核心態都可以通過各自的基地址加上偏移來獲取記憶體對象的起始地址,進而實現用戶態進程和核心態進程共享記憶體的管理。
進一步,為節約記憶體,上述管理方法還可以包括:
步驟104,需要對記憶體對象進行釋放時,獲取待釋放記憶體對象的起始偏移和大小,根據所述起始偏移和大小將記憶體對象添加到相應偽鍊表中的相應節點中。
需要說明的是,上述步驟104是為了節約記憶體而設定的,該領域技術人員可以根據具體需要進行取捨。
其中,所述多個偽鍊表包括:節點對應的記憶體對象的長度為16位元組、32位元組、64位元組、128位元組、256位元組、512位元組、1024位元組和2k位元組分別對應的16_list偽鍊表、32_list偽鍊表、64_list偽鍊表、128_list偽鍊表、256_list偽鍊表、512_list偽鍊表、1024_list偽鍊表和free_list偽鍊表。
步驟103中,記憶體分配的過程可以為:
當申請的記憶體的大小大於(1024-4)位元組時,則從free_list偽鍊表選取連續的n個節點,n為整數,具體地,n等於申請的記憶體的大小除以2k後向上取整;
當申請的記憶體的大小小於或等於(1024-4)位元組時,則從除free_list偽鍊表之外的其他偽鍊表中選取1個節點,當所述其他偽鍊表為空時,則還需要先從free_list偽鍊表中選取1個2k對象進行分割後,將分割得到的多個對象添加到所述其他偽鍊表中,然後再選取1個節點。其中,選取的偽鍊表為能夠滿足申請的記憶體的大小的最小偽鍊表(指其節點對應的記憶體對象的長度最小),例如,如果申請10位元組的記憶體,則選取16_list偽鍊表,如果申請500位元組的記憶體,則選取512_list偽鍊表。
可選地,在步驟104中,當根據所述起始偏移和大小將記憶體對象添加到相應偽鍊表中的相應節點中後,若相應偽鍊表中有多個連續的節點對應的記憶體對象大小之和為2k,且該多個連續的節點中的第一個節點的起始偏移能夠被2k整除,則還可以將這多個連續的節點從相應偽鍊表中摘除後,將相應的2k記憶體對象添加到free_list偽鍊表中。需要說明的是,這裡的摘除是指將節點從偽鍊表中移除,並對偽鍊表中的節點的地址偏移進行相應的修改,而且,將2k記憶體對象添加到free_list偽鍊表中,包括對free_list偽鍊表中的相應節點的地址偏移進行相應修改。
以下給出《一種用戶態與核心態共享記憶體的管理方法和裝置》的一個套用實例,具體描述如下:
首先,將一大塊連續的物理記憶體(作為共享記憶體)分別映射到用戶態地址空間和核心態地址空間,物理記憶體的長度根據需要設定,映射完成後,會分別在用戶態地址空間和核心態地址空間獲得一個基地址(虛擬地址)。
其次,《一種用戶態與核心態共享記憶體的管理方法和裝置》使用了一種鏈狀數據結構來進行共享記憶體的分配和回收,為了區別於傳統鍊表,這裡我們稱作偽鍊表。兩者存在一個本質的區別:傳統鍊表是使用指針直接指向下一個節點,而偽鍊表則是使用一個偏移算出下一個節點的位置。
偽鍊表節點結構很簡潔,其包括兩個數據成員:(1)對象的類型,(2)下一個偽鍊表節點結構體的起始地址相對於共享記憶體基地址的偏移。偽鍊表節點結構體如下:
一種用戶態與核心態共享記憶體的管理方法和裝置
定義了上述偽鍊表結構後,就可以根據使用者的申請,將相應的節點對應的記憶體對象分配給使用者,所述使用者可以是核心態進程或用戶態進程。在《一種用戶態與核心態共享記憶體的管理方法和裝置》中,使用者可以根據將分配的記憶體對象的起始偏移(所分配的節點的上一個節點中的offset域值)與共享記憶體的基地址相加,得到記憶體對象的起始地址。
第三,在共享記憶體的最後預留出32個位元組來保存free_list、16_list、32_list、64_list、128_list、256_list、512_list、1024_list八個偽鍊表的頭節點,在進行記憶體映射後,用戶態進程和核心態進程分別獲取到了每個偽鍊表的頭節點的虛擬地址,根據該虛擬地址可以定位到該頭節點,共享記憶體的構成具體如圖2所示。
free_list偽鍊表中的節點存放2k位元組的記憶體對象(包含8位元組管理信息),16_list…1024_list偽鍊表中的節點分別存放16位元組…1024位元組的記憶體對象(包含4位元組或8位元組管理信息),並且偽鍊表中的節點是按照地址偏移(即offset域值)從小到大的順序排列的。請注意普通對象中包含4個位元組的管理信息(flags域和offset域),特殊對象(地址偏移2k對齊的對象,即地址偏移能夠被2k整除)中包含8位元組的管理信息(flags域、offset域和size域),如圖3和圖4所示。
對象的類型是通過flags域來標記的,flags域的具體含義如下表,該標記可以用於記憶體對象的釋放,後面會具體簡紹;size域標識分配的記憶體的長度(可以是連續的1個或多個節點對應的記憶體的長度之和)。其中,大於2k的對象包括連續的若干個2k對象,即連續的若干個2k對象構成一個大於2k的對象。
一種用戶態與核心態共享記憶體的管理方法和裝置
第四,分配對象
根據使用者(用戶態進程或核心態進程)需要申請記憶體的大小,選擇從哪個偽鍊表中取記憶體對象。
(1)申請記憶體的大小大於(1024-4)位元組,則直接從free_list中分配連續的n個記憶體對象,並修改第一個對象的size域,size=n*2k以及flags域,flags=15,將分配的對象從free-list中摘除。該領域技術人員知道,摘除後,需要對free-list做相應的處理,即修改n個對象中第一個對象在鍊表中的前面一個對象中的offset,使其指向摘除n個節點後鍊表中的下一個節點。該領域技術人員能夠申請記憶體的大小合理確定n的大小,例如,申請1200位元組,則n=1,申請2000位元組,則n=2。
(2)申請記憶體大小小於或等於(16-4)位元組則使用偽鍊表16_list,如果此時16_list偽鍊表不為空(即除了頭節點之外,還包括其他節點),就選擇頭節點後的第一個節點對象,如果該對象的偏移2k對齊,還需要修改該對象的size域,size=16,然後,不管是否2k對齊,都將該對象從16_list中摘除,摘除後,需要對16_list偽鍊表做相應的處理,即修改頭節點的offset域,使其指向下一個節點對象。
如果此時16_list偽鍊表為空,需要先從free_list偽鍊表中分配一個2k的對象,然後將該2k對象均分為128個16位元組的對象,同時將這128個對象按照地址偏移從小到大的順序添加到16_list偽鍊表中,再按上述步驟將16_list偽鍊表中的第一個記憶體對象分配給使用者。
以此類推,對其他偽鍊表的操作也類似。
第五,釋放對象
(1)計算待釋放對象(記憶體對象)的起始偏移,起始偏移等於待釋放對象的offset減去該對象的大小,即該對象的第一個位元組對應的偏移值;
(2)判斷待釋放對象的起始偏移是否2k對齊;
(3)起始偏移2k對齊的對象的處理:
起始偏移2k對齊,說明該對象是一個特殊對象。如果對象size大於1k,則直接將該特殊對象分成若干個2k的對象添加到free_list偽鍊表中。如果size小於或等於1k,為了方便描述假設size=1024,先將該特殊對象添加到1024_list偽鍊表中,具體地,是將該特殊對象的偏移值與偽鍊表中的其他對象的偏移值進行比較,根據比較結果將該特殊對象添加到偽鍊表中的相應位置,並修改該對象的上一對象以及該對象的偏移值,即將上一個對象的偏移值修改為指向該對象,將該對象的偏移值修改為指向下一個對象,同時遍歷該特殊對象的後續對象直到某一般對象的offset減掉2k等於該特殊對象的起始偏移為止,將遍歷過的一般對象的大小之和加到該特殊對象的size域。如果size=2k,則說明有一個free_list的對象全部被釋放回1024_list偽鍊表了,這時我們可以將整個2k空間歸還給free_list表了,所以將從該特殊對象起的2k空間內的所有對象移出1024_list再作為一個特殊對象添加到free_list表中;不等於則不做處理。
(4)起始偏移2k不對齊的對象的處理:
起始偏移2k不對齊,說明該對象為一般對象,通過flags域的值,可以判斷當前對象的大小,同樣為了方便描述,假設該對象的大小為1024,先將該對象按照偏移大小順序添加到1024_list偽鍊表中,再遍歷1024_list偽鍊表的頭節點到該對象之間的對象來查找該對象所在的free_list對象的特殊對象是否存在。如果特殊對象存在,需要將該特殊對象的size域加上1024,若此時的size=2k,就可以將從該特殊對象起的2k空間的所有對象移出1024_list再作為一個特殊對象加入到free_list表。如果特殊對象不存在,就不需要做任何事情。
其他長度的對象的釋放流程與上述類似,這裡不再說明。
對應於上述方法,《一種用戶態與核心態共享記憶體的管理方法和裝置》實施例還提供一種用戶態與核心態共享記憶體的管理裝置,所述管理裝置可以包括:
記憶體映射單元,用於將預定長度的物理記憶體作為共享記憶體分別映射到用戶態地址空間和核心態地址空間,映射完成後,用戶態進程和核心態進程在各自的地址空間分別得到共享記憶體的基地址;
偽鍊表建立單元,用於將多個偽鍊表的頭節點保存到共享記憶體的最後區域,其中,偽鍊表的節點的結構包括對象類型和偽鍊表中下一個節點的起始地址相對於基地址的偏移,且每種對象類型對應一種長度的記憶體對象;
記憶體分配單元,用於根據使用者需要申請記憶體的大小,從所述多個偽鍊表中選取一個偽鍊表,從所選取的偽鍊表中選取一個或多個節點,將選取的一個或多個節點對應的記憶體對象分配給該使用者,並將選取的一個或多個節點從所選取的偽鍊表中摘除,其中,所述使用者為核心態進程或用戶態進程,所述使用者能夠將自己的基地址加上所分配的記憶體對象的起始偏移得到記憶體對象的起始地址,並根據所述起始地址對所述記憶體對象進行操作。
為節約記憶體,所述管理裝置還可以包括:
記憶體釋放單元,用於需要對記憶體對象進行釋放時,獲取待釋放記憶體對象的起始偏移和大小,根據所述起始偏移和大小將記憶體對象添加到相應偽鍊表中的相應節點中。
其中,所述多個偽鍊表包括:節點對應的記憶體對象的長度為16位元組、32位元組、64位元組、128位元組、256位元組、512位元組、1024位元組和2k位元組分別對應的16_list偽鍊表、32_list偽鍊表、64_list偽鍊表、128_list偽鍊表、256_list偽鍊表、512_list偽鍊表、1024_list偽鍊表和free_list偽鍊表。
具體地,所述記憶體分配單元可以按照如下方式進行記憶體分配:
當申請的記憶體的大小大於(1024-4)位元組時,則從free_list偽鍊表選取連續的n個節點,n為整數;
當申請的記憶體的大小小於或等於(1024-4)位元組時,則從除free_list偽鍊表之外的其他偽鍊表中選取1個節點,當所述其他偽鍊表為空,則先從free_list偽鍊表中選取1個2k對象進行分割後,將分割得到的多個對象添加到所述其他偽鍊表中。
進一步,所述記憶體釋放單元還可以用於:當根據所述起始偏移和大小將記憶體對象添加到相應偽鍊表中的相應節點中後,若相應偽鍊表中有多個連續的節點對應的記憶體對象大小之和為2k,其該多個連續的節點中的第一個節點的起始偏移能夠被2k整除,則將這多個連續的節點從相應偽鍊表中摘除後,將相應的2k記憶體對象添加到free_list偽鍊表中。
綜上所述,《一種用戶態與核心態共享記憶體的管理方法和裝置》解決了核心態進程與用戶態進程共享記憶體使用傳統鍊表無法實現動態分配的問題,並且提高了核心態進程和用戶態進程之間數據的互動效率,同時節約了物理記憶體。

榮譽表彰

2018年12月20日,《一種用戶態與核心態共享記憶體的管理方法和裝置》獲得第二十屆中國專利優秀獎。

熱門詞條

聯絡我們