內存管理的制作方法
【專利摘要】本發(fā)明涉及一種用于在劃分成連續(xù)內存段(20)的內存堆(26)內管理內存池(12)的方法。該方法包括通過:接收特定內存段(20’)的識別密鑰(32),根據基于識別密鑰(32)的轉換表(10)確定特定內存段(20’)的起始地址和尺寸,并且以特定內存段(20’)的尺寸將分配在內存堆(26)內位于特定內存段(20’)的起始地址之后的內存段(20)朝著內存堆(26)的起點移動,來刪除特定內存段(20’),使得所述內存池(12)由連續(xù)分配的第一部分(28)和連續(xù)未分配的第二部分(30)構成。
【專利說明】內存管理
【技術領域】
[0001]本發(fā)明涉及一種用于管理內存池的方法、計算機程序以及計算機可讀介質。
【背景技術】
[0002]在基于計算機的系統(tǒng)(例如,嵌入式系統(tǒng))中,可支持一種手動進行內存管理的方法,用于分配和刪除數據。通過手動管理內存,內存通常由于刪除而產生碎片,其中,用戶明確地請求刪除特定分配的內存段。
[0003]已經開發(fā)了用于減少碎片的多種技術,如果將隨機大小的數據分配給內存,那么這些技術不能完全消除碎片。此外,已經開發(fā)了自動內存管理器的解決方案(例如,垃圾收集)以及為分配具有固定尺寸的數據而消除碎片的解決方案。然而,這些解決方案可具有某些缺點,并且并非始終適合、特別是用于嵌入式系統(tǒng)中。
【發(fā)明內容】
[0004]本發(fā)明的目標在于,提供一種管理內存池的方法,完全消除內存的碎片。
[0005]該目標由獨立權利要求的主題實現。通過從屬權利要求并且通過以下描述,進一步的示例性實施方式顯而易見。
[0006]本發(fā)明的一個方面涉及一種用于管理劃分成連續(xù)內存段的內存堆的內存池的方法。
[0007]術語內存池可理解為在任何基于計算機的系統(tǒng)的內存堆內的內存的某個區(qū)域,所述某個區(qū)域可包括一部分或整個內存堆。為了全面管理內存池,內存池可具有已知的起始地址和已知的尺寸。在其中,根據機器的結構,內存池的尺寸可與各個基于計算機的系統(tǒng)的機器字的尺寸一致,即,該尺寸可為機器專用字長的倍數,例如,8、16、32、61位字長的倍數。例如,內存堆可為或包括RAM、EPROM或FLASH內存的一部分。
[0008]內存池的內存段可具有不同和/或相同的尺寸,其中,每個內存段的尺寸可與機器字長一致。每個內存段在內存池內具有區(qū)段專用的起始和結束地址,并且內存段的連續(xù)設置可表示在兩個后續(xù)區(qū)段之間沒有間隙,即,在兩個后續(xù)區(qū)段之間沒有未分配的內存。
[0009]根據本發(fā)明的一個實施方式,該方法包括通過:接收特定內存段的識別密鑰,根據基于識別密鑰的轉換表確定特定內存段的起始地址和尺寸,并且將分配于內存池內的特定內存段的起始地址之后的內存段以特定內存段的尺寸朝著內存堆的起點移動,來刪除特定內存段,使得內存池由連續(xù)分配的第一部分和連續(xù)未分配的第二部分構成。換言之,在刪除特定數據段后,在內存池中移動具有起始地址的所有分配的內存段,該起始地址比特定內存段的起始地址更大,以便保持在其間的未分配的內存沒有間隙。因此,可完全消除內存池的碎片。
[0010]由于如果在內存池內未分配的內存沒有間隙,那么可更快速地執(zhí)行命令和/或某些軟件元件(在運行期間,必須略過),所以完全消除碎片尤其在嵌入式系統(tǒng)中有用。除此之外,在動態(tài)分配的內存池中沒有碎片,可允許滿負荷地使用內存資源,并且客戶端應用程序可完全保持控制所使用的內存資源。再者,這在嵌入式系統(tǒng)中尤其有用,其中,RAM的成本對最終產品的成本具有重要影響。因此,重要的是,降低和/或控制RAM的成本。
[0011]根據本發(fā)明的一個實施方式,移動內存段包括:通過將特定內存段的尺寸加至特定內存段的起始地址而確定分配的內存塊的起始地址;確定分配的內存塊的長度,所分配的內存塊的長度是分配于特定內存段之后內存段的長度的總和;以及將所分配的內存塊移動至特定內存段的起始地址。
[0012]因此,所分配的內存塊在具有起始地址的內存池內可包括所有分配的內存段,該起始地址比待刪除的特定內存段更大。將分配的塊移動到特定內存段的起始地址,可確保特定內存段的數據由包含在內存塊內的數據重寫,因此,可刪除特定內存段。此外,通過將內存塊移動到特定內存段的起始地址,可確保在內存池內沒有任何間隙。因此,在刪除特定內存段之后,內存池由連續(xù)分配的第一部分和連續(xù)未分配的第二部分構成。
[0013]除了將在所分配的內存塊中的所有內存段的單獨長度求和以外,例如,還可在刪除特定內存段之前,通過從在內存池中的連續(xù)未分配的部分的起始地址中減去特定內存段的起始地址和尺寸,確定所述塊的長度。為此,連續(xù)未分配的部分的起始地址可全局地儲存,例如,作為指針,或者還可儲存在轉換表中。
[0014]根據本發(fā)明的一個實施方式,轉換表包括具有所分配的內存段的識別密鑰、起始地址以及尺寸的條目。換言之,對于在內存池中的每個分配的內存段,區(qū)段專用的識別密鑰、起始地址以及尺寸可儲存在轉換表的條目內。同樣,轉換表可儲存在內存堆內。
[0015]識別可例如為順序整數,表示在轉換表中的某個位置。內存段的起始地址和尺寸可為機器專用的字長的字節(jié)的倍數,即,例如,8、16、32、64位字長的倍數。
[0016]通常,轉換表可用作軟件部件的虛擬機構,其中,可由軟件部件提供識別密鑰,例如,用于刪除特定數據段,而非在內存池中的地址或地址范圍。反之亦然,可在運行期間將識別密鑰提供給軟件部件,以便使用儲存在內存池內的數據。
[0017]根據本發(fā)明的一個實施方式,刪除特定內存段進一步包括重新計算具有位于特定內存段起始地址之后的起始地址的轉換表內每個內存段的起始地址。
[0018]為了在將分配的內存塊移動至特定內存段的起始地址之后,正確地連接在轉換表中的條目和在內存池中的內存段,可重新計算在內存塊中的每個分配的內存段的起始地址。例如,通過從在特定區(qū)段之后分配的每個內存段的起始地址中減去特定內存段的長度,可實現起始地址的實際重新計算。
[0019]根據本發(fā)明的一個實施方式,轉換表包括固定數量的條目,并且無論是否使用該條目,每個條目都包括字段??筛鶕浖考男枰托枨螅_定轉換表的固定尺寸。然而,轉換表還可根據軟件部件的需要和需求動態(tài)地擴展。
[0020]在轉換表中使用的條目可表示有效分配內存段。在刪除內存段時,可將相應的字段設為“未使用”。例如,該字段可為單比特,該比特可根據在轉換表中的各個條目的狀態(tài)被設為零或一。除此以外,所使用的條目可包括對轉換表中下一個使用的條目的引用。例如,這可允許更快速地通過在轉換表中使用的所有條目進行掃描或者在這些條目內進行搜索,并且可允許刪除一系列分配的內存段。
[0021]根據本發(fā)明的一個實施方式,刪除特定內存段進一步包括設定轉換表中使用的條目的引用,該引用對特定內存段的條目的引用進行引用,并指向該特定內存段的條目。換言之,位于特定內存段(即,具有比特定區(qū)段更小的起始地址的內存段)之前的第一個使用的條目的引用可被設為引用在特定內存段之后的第一個使用的內存段。
[0022]根據本發(fā)明的一個實施方式,用于管理內存池的方法進一步包括通過:接收特定內存段的識別密鑰;根據基于識別密鑰的轉換表確定特定內存段的總尺寸;并且將分配于特定內存段之后的內存段朝著內存池的起點以特定內存段的總尺寸移動,來刪除一排特定內存段。
[0023]可例如通過提供要待刪除的第一內存段的起始識別密鑰以及待刪除的末端內存段的末端識別密鑰,限定這排特定內存段,其中,可刪除在起始和末端識別密鑰之間的所有內存段。除此以外,可例如通過軟件部件提供內存段的一系列識別密鑰或待刪除的多個內存段的一個起始密鑰或整數。
[0024]釋放一系列分配的內存的規(guī)定的可能性可允許減少所需要的操作數量,作為優(yōu)化,這可有用,但是這還是避免保持跟蹤與所分配的內存段相關聯的所有識別密鑰的一種好方法。
[0025]此外,在例如軟件部件停止之后,通過手動管理整個內存池,一次可釋放在內存池內的所有資源,從而降低內存泄露的可能性。
[0026]根據本發(fā)明的一個實施方式,用于管理內存池的方法進一步包括通過:接收新內存段的長度;將新內存段的起始地址設為包括已分配內存段的分配的內存塊的端部;生成新內存段的新識別密鑰;在轉換表中搜索未使用的條目;將條目標記為使用的;以及在該條目中儲存新內存段的新識別密鑰和起始地址,來請求新內存段。換言之,如果例如由軟件部件請求新內存段,以便在新內存段內儲存某個數據量,那么新內存段可設置在所有先前分配的內存段之后,并且在轉換表中的未使用的條目內儲存新內存段的特征,即,起始地址、尺寸以及識別密鑰。這可確保整個內存池由連續(xù)分配的第一部分和連續(xù)未分配的第二部分構成,即,內存池沒有碎片。
[0027]根據本發(fā)明的一個實施方式,用于管理內存池的方法進一步包括通過:接收所分配的內存段的識別密鑰;以及根據識別密鑰從轉換表中確定起始地址,來請求所分配的內存段。例如,軟件部件可通過將識別密鑰提供給各個內存段,來請求儲存在分配的內存段內的數據。反過來,識別密鑰可用于搜索在轉換表中的相應條目以及所請求的內存段的相應起始地址。
[0028]本發(fā)明的一個方面涉及一種用于管理內存池的計算機程序,在由處理器執(zhí)行時,該計算機程序適合于執(zhí)行在上文中以及在下文中描述的方法的步驟。例如,處理器可為在嵌入式系統(tǒng)內或者在任何其他基于計算機的系統(tǒng)內的處理器。例如,用于管理內存池的計算機程序可為與一個或幾個其他計算機程序互連的獨立程序,或者例如,該計算機程序可作為在另一個計算機程序中的軟件元件來實現。
[0029]本發(fā)明的另一個方面涉及一種計算機可讀介質,用于管理內存池的這種計算機程序儲存在該計算機可讀介質內。例如,非易失性計算機可讀介質可為軟盤、硬盤、USB(通用串行總線)儲存裝置、RAM(隨機存取存儲器)、R0M(只讀存儲器)、EPROM(可擦可編程只讀存儲器)或FLASH存儲器。計算機可讀介質還可為允許下載程序代碼的數據通信網絡(例如,因特網)。
[0030]通過在后文中描述的實施方式,本發(fā)明的這些和其他方面顯而易見,并且參照這些實施方式,闡述這些和其他方面。
【專利附圖】
【附圖說明】
[0031 ] 下面,參照附圖,更詳細地描述本發(fā)明的實施方式。
[0032]圖1示意性示出根據本發(fā)明的一個實施方式的轉換表及其與內存池的互連;
[0033]圖2示意性示出根據本發(fā)明的一個實施方式在轉換表以及內存池內刪除特定內存段;
[0034]圖3在根據本發(fā)明的一個實施方式刪除特定內存段之后示意性示出了圖2的轉換表和內存池;
[0035]圖4示出根據本發(fā)明的一個實施方式示意性描述用于管理內存池的方法的某些步驟的流程圖;
[0036]圖5不出根據本發(fā)明的一個實施方式不意性描述用于管理內存池的方法的某些步驟的流程圖;
[0037]圖6示出根據本發(fā)明的另一個實施方式示意性描述用于管理內存池的方法的某些步驟的流程圖;
[0038]圖7示出根據本發(fā)明的又一個實施方式示意性描述用于管理內存池的方法的某些步驟的流程圖。
[0039]原則上,在圖中,相同的部件具有相同的參考符號。
【具體實施方式】
[0040]圖1示意性示出了根據本發(fā)明的一個實施方式的轉換表10及其與內存池12的互連。
[0041]轉換表10包括固定數量的條目14,可通過識別密鑰16、16’引用每個條目。由此而論,識別密鑰16、16’可理解為在轉換表10內的位置或行或順序整數。
[0042]例如,某些識別密鑰16分別與在內存池12中的分配的內存段20相關聯,并且其他識別密鑰16’與內存池12不相關聯。因此,不相關聯的識別密鑰16’可被視為空閑。
[0043]對于與分配的內存段20相關聯的每個識別密鑰16,轉換表10包括具有對起始地址引用22的域18a以及具有分配的內存段20的尺寸的域18b。為此,每個分配的內存段的起始地址和尺寸可儲存在轉換表10的域18a、18b內,其字節(jié)是機器專用的字長的倍數。起始地址還可例如作為各個地址的指示器儲存在內存池12內。
[0044]除了分配的內存段20的起始地址和尺寸的條目18a、18b以外,轉換表10包括每個條目14的域18c,表示使用相應的條目14,S卩,識別密鑰與分配的內存段20相關聯。為此,域18c可包括單比特,該比特可被設為零或一。
[0045]另一方面,對于與分配的內存段20不相關聯的每個條目14,域18c被設為“未使用的”,從而表示出相應的條目14空閑。為此,儲存在域18c內的單比特可被設置為與用于表示“使用的”條目14的值相反的二進制值。
[0046]此外,對于每個條目14,轉換表10包括域18d,該域具有至轉換表10的下一個使用的條目14的引用或鏈接24。例如,下一個使用的識別密鑰16或在兩個連續(xù)使用的條目14之間的多個條目可儲存在域18d內。
[0047]通常,轉換表10可被視為包括固定數量的條目或元素的表格,每個條目或元素可與識別密鑰相關聯并且由該識別密鑰識別。在該情況下每個元素可包括域18a、18b、18c、18d。
[0048]根據在轉換表10中使用的識別密鑰16,可包括一部分或整個內存堆26的內存池12被劃分成連續(xù)內存段20,該內存段具有可變尺寸并且在內存堆26內的起始地址增加。
[0049]因此,整個內存池12由第一部分28和第二部分30構成,由連續(xù)分配的內存段20連續(xù)地分配第一部分,并且第二部分為連續(xù)地未分配,即,部分30完全由空閑內存構成。
[0050]為了進行綜合內存管理,連續(xù)未分配的部分30的起始地址可全局地儲存,或者可儲存在轉換表10中,例如通過指針。
[0051]圖2示意性示出了根據本發(fā)明的一個實施方式在轉換表10以及內存池12內刪除與識別密鑰32相關聯的特定內存段20’。
[0052]為了實際刪除特定內存段20’,包括所有內存段20的內存塊34朝著內存堆26的起點以特定內存段20’的尺寸移動,這些內存段20分配于內存池12或內存堆26內的特定內存段20’的起始地址之后,在圖2中由箭頭31表示。
[0053]圖3在根據本發(fā)明的一個實施方式刪除特定內存段20’之后示意性示出了圖2的轉換表10和內存池12。
[0054]在刪除特定內存段20’之后,內存池12再次包括連續(xù)分配的第一部分28和連續(xù)未分配的第二部分30。在刪除內存段20’之后,第二部分30增加了刪除的內存段的尺寸,并且可儲存第二部分的起始地址。
[0055]通過在轉換表10的域18c內設置相應的值,刪除的內存段20’的識別密鑰32標記為“未使用的”。
[0056]除此以外,在位于刪除的內存段20’的識別密鑰32之前的第一個使用的識別密鑰的域18d中的值由在轉換表10中的下一個使用的識別密鑰重新引用,該識別密鑰可為在刪除之前由刪除的內存段20’所引用的識別密鑰。
[0057]圖4示出了示意性顯示用于管理內存池12的方法的步驟的流程圖。在其中,這些步驟涉及在內存堆26的內存池12內刪除特定內存段20’,即,釋放在特定內存段20’內分配的數據。在圖1到圖3中示意性顯示了與內存段20’的刪除對應的轉換表10的狀態(tài)以及內存池12的狀態(tài)。
[0058]在步驟SI中,接收待刪除的特定內存段20’的識別密鑰32。例如,在結束工序時,可由軟件部件提供識別密鑰。
[0059]在接收識別密鑰32之后,在步驟SI’中,可非必要地檢查在與識別密鑰32相關聯的轉換表10的域18c內識別密鑰32是否標記為使用的。
[0060]在步驟S2中,通過與在轉換表10中的識別密鑰32相關聯的域18a、18b的條目,確定特定內存段20’的起始地址和尺寸。
[0061]在步驟S3中,將分配于內存池12或內存堆26內的特定內存段20’的起始地址之后的內存段20朝著內存堆26的起點以特定內存段20’的尺寸移動。
[0062]在該情況下,壓縮整個內存池12,以便內存池12由連續(xù)分配的第一部分28和連續(xù)未分配的第二部分30構成。
[0063]通過在步驟S3中移動分配的區(qū)段20,內存池12可實現實際壓縮。為此,通過將特定內存段20’的尺寸加至特定內存段20’的起始地址,在步驟S3a中可確定分配的內存塊34的起始地址。因此,所分配的內存塊以在內存池12中的下一個使用的內存段20開始。
[0064]在步驟S3b中,可確定分配的內存塊34的長度,分配的內存塊34的長度是在特定內存段20’之后分配的內存段20的長度的總和。此外,具有另一種更容易的方法,用于計算內存塊34的長度,即,通過從第一 id中減去內存段的起始地址,以便從未分配的內存的全局所知的起點中去除。
[0065]在步驟S3c中,分配的內存塊34最后移動到特定內存段20的起始地址。
[0066]因此,步驟S3c可被視為單個內存復制,其中,復制的源點可為分配的內存塊34的起始地址,終點可為特定內存段20’的起始地址,并且分配的內存塊34的長度可為特定內存段20’之上的使用的內存池12的長度。使用在具有機器代碼水平的大部分平臺上支持的系統(tǒng)命令(例如,’ memcpy'),可例如在單個操作內實現規(guī)定的內存復制。
[0067]在步驟S4中,重新計算具有在特定內存段20’的起始地址之后的起始地址的在轉換表10中的每個內存段20的起始地址。換言之,對于與內存段20相關聯的每個使用的識別密鑰16,重新計算儲存在轉換表10的相應域18a內的起始地址,在位于內存池12內的特定內存段20’之后分配內存段20,S卩,內存段20具有的起始地址比特定內存段20’的起始地址更大。
[0068]為此,整個或部分轉換表10可成環(huán),并且對于每個使用的識別密鑰16,可檢查是否在特定區(qū)段20’之后分配各個內存段。如果是這樣的話,那么可從在內存段20’之后分配的內存段20的每個起始地址中減去特定內存段20’的長度,并且重新計算的起始地址可儲存在轉換表10的相應域18a內。
[0069]在步驟S5中,通過在與識別密鑰32相關聯的相應域18c內設置相應標志,刪除的內存段20’的識別密鑰32可標記為在轉換表中未使用。
[0070]在步驟S6中,轉換表10的域18d中使用的條目的引用,其中該使用的條目指向特定內存段20’的識別密鑰32,設為對該條目的引用。換言之,可恢復在刪除內存段20’之后在位于轉換表10內的剩余元素之間的鏈接,以便具有域18d中的條目的元素,其中該條目指向去除的內存段20’的識別密鑰32,現在指向下一個使用的識別密鑰16(或者包含-1,或如果去除的內存段20’是在轉換表10中的最后一個,那么“未使用的”)。
[0071]圖5示出了示意性描述用于管理內存池的方法的某些步驟的流程圖。在其中,這些步驟涉及在內存堆26的內存池12內刪除不止一個特定內存段20’。
[0072]在步驟SlO中,接收特定內存段20’的識別密鑰16,其中,識別密鑰16可為起始識別密鑰和末端識別密鑰。
[0073]在步驟Sll中,根據識別密鑰16,從轉換表10中確定特定內存段20’的總尺寸。
[0074]通過使從起始識別密鑰開始的轉換表成環(huán),可確定當前總尺寸。對于在起始識別密鑰之后的每個識別密鑰16,通過將在轉換表10中的當前元素的尺寸加至具有起始識別密鑰的元素的尺寸,可計算待去除的內存的總尺寸。通過在相應域18c內設置標志,在轉換表10中的當前元素可標記為未使用的,并且當前元素的域18d可在待刪除的這排特定內存段20’內為下一個當前元素提供識別密鑰。
[0075]在步驟S12中,重新計算具有位于特定內存段20’的末端識別密鑰之后的起始地址的在轉換表10內的每個內存段20的起始地址。
[0076]為此,整個或部分轉換表10可成環(huán),并且對于每個使用的識別密鑰16,可檢查是否在這行特定區(qū)段20’之后分配各個內存段。如果是這樣的話,那么可從在內存段20’之后分配的內存段20的每個起始地址中減去在步驟Sll中確定的特定內存段20’的總尺寸,并且重新計算的起始地址可儲存在轉換表10的相應域18a內。
[0077]在步驟S13中,將分配于特定內存段20’之后的內存段20朝著內存堆26的起點以在步驟Sll中確定的特定內存段20’的總尺寸移動。與在圖4中的步驟S3—樣,通過單次復制內存,在步驟S13中壓縮內存池12,其中,可由位于終端密鑰之后的下一個使用的識別密鑰16提供用于進行復制的源點,可由在步驟Sll中確定的總尺寸提供尺寸,并且可由在與起始識別密鑰相關聯的轉換密鑰中的部件的起始地址提供終點。
[0078]在步驟S14中,將指向與起始識別密鑰相關聯的部件的在轉換表10的域18d中使用的條目的引用設為在與末端識別密鑰相關聯的部件的域18d內的引用(或者如果末端密鑰是在轉換表10中的最后一個,則設為-1或“未使用的”)。
[0079]圖6示出了示意性描述用于管理內存池12的方法的某些步驟的流程圖。在其中,這些步驟涉及請求新內存段并且在新內存段內分配數據。
[0080]在第一步驟S20中,接收新內存段的長度。此外,通過將該長度調整為該系統(tǒng)的機器字,可計算新內存段的匹配的尺寸,以便防止內存池12具有任何不匹配的。
[0081]在接收新內存段的長度之后,可檢查是否有足夠的資源可用于進行分配。通過檢查在內存池12內是否具有足夠的自由空間并且檢查在轉換表10內是否具有至少一個未使用的識別密鑰16’,可這樣做。如果未滿足條件,那么可返回-1,表示發(fā)生錯誤并且分配可退出。
[0082]在步驟S21中,在轉換表10內搜索具有未使用的識別密鑰16’的未使用的條目。為了優(yōu)化該程序,轉換表10可從最后使用的識別密鑰16開始成環(huán),并且可定位最近的未使用的識別密鑰16’。如果轉換表10達到末端,那么可在起點重新開始通過轉換表10進行搜索。如果不可使用任何未使用的識別密鑰16’,那么還可動態(tài)地擴展轉換表10,并且可生成新識別密鑰。
[0083]在步驟S22中,新內存段的起始地址被設為包括已經分配的內存段20的分配的內存塊28的末端。換言之,新區(qū)段的起始地址被視為內存池12的連續(xù)未分配的部分30的起點。
[0084]可全局已知連續(xù)未分配的部分30的起始地址,例如,通過儲存指針,或者通過將與最后使用的識別密鑰16相關聯的內存段20的長度加至相應的起始地址,可確定該起始地址。
[0085]在步驟S23中,與在步驟S21中找出的識別密鑰相關的在域18c內的條目標記為使用的,即,可設置使用的標志。
[0086]在步驟S24中,可將數據復制到在內存池12內的新內存段中,并且通過加入在步驟S20中確定的數據的匹配的尺寸,可重新計算連續(xù)未分配的部分30的起始地址的值。
[0087]除此之外,新區(qū)段的起始地址以及匹配的尺寸可儲存在與在步驟S21中找出的識別密鑰相關聯的轉換表10的域18a、18b內。
[0088]此外,可全局已知的使用的識別密鑰16的數量可增加1,并且與新內存段相關聯的在步驟S21中找出的識別密鑰可返回到例如客戶端應用程序,以在操作時進一步參考這塊數據。
[0089]必要時(S卩,如果用于新內存段的識別密鑰并非在轉換表中的第一個或最后一個元素),在轉換表10的相應域18d內,可設置在新內存段的識別密鑰與位于該密鑰之前的并且所使用的識別直接位于該密鑰之后的所使用的識別密鑰之間的鏈接。
[0090]圖7示出了示意性描述用于管理內存池的方法的某些步驟的流程圖。在其中,這些步驟涉及請求所分配的內存段20。
[0091]在步驟S30中,接收用于所分配的內存段20的識別密鑰16(例如,通過軟件部件)。
[0092]重要的是,客戶端軟件未直接訪問該存儲器,并且并非旨在保持全面參考存儲器,以免內存錯誤,這是因為先前分配的區(qū)段的刪除可能移動內存內容。僅僅內存管理器訪問該數據,并且根據要求,將該數據從此處復制到軟件客戶端中,但是不能直接訪問。
[0093]在步驟S31中,根據識別密鑰16,從轉換表10中確定內存段20的起始地址,并且例如,軟件部件可訪問儲存在內存段20內的數據。
[0094]該方法可分別作為編程軟件模塊或程序來實現;然而,本領域的技術人員會理解的是,該方法完全或部分在硬件中實現。
[0095]雖然在示圖以及上述描述中詳細說明和描述了本發(fā)明,但是這種說明和描述被視為具有說明性或示例性,而沒有限制性;本發(fā)明不限于所公開的實施方式。通過研究示圖、公開內容以及所附權利要求,本領域的技術人員通過實踐所要求的發(fā)明,可理解和實現所公開的實施方式的其他變化。在權利要求中,措辭“包括”不排除其他部件或步驟,并且不定冠詞“一”不排除多個。單個處理器或控制器或其他單元可實踐在權利要求中敘述的幾個物品的功能。在彼此不同的從屬權利要求中敘述某些措施這一事實并不表示,不能利用這些措施的組合。在權利要求中的任何參考符號不應理解為限制范圍。
【權利要求】
1.一種用于在劃分成連續(xù)內存段(20)的內存堆(26)內管理內存池(12)的方法,所述方法包括通過: 接收特定內存段(20’ )的識別密鑰(32); 根據基于所述識別密鑰(32)的轉換表(10)確定所述特定內存段(20’)的起始地址和尺寸;并且 將分配于所述內存池(12)內所述特定內存段(20’)的起始地址之后的內存段(20)朝著所述內存池(12)的起點以所述特定內存段(20’ )的尺寸移動,使得所述內存池(12)由連續(xù)分配的第一部分(28)和連續(xù)未分配的第二部分(30)構成, 來刪除所述特定內存段(20’)。
2.根據權利要求1所述的方法, 其中,移動內存段(20’ )包括: 通過將所述特定內存段(20’)的尺寸加至所述特定內存段(20)的起始地址,來確定分配的內存塊(34)的起始地址; 確定分配的內存塊(34)的長度,所述分配的內存塊(34)的長度是分配在所述特定內存段(20’ )之后的內存段(20)的長度的總和;以及 將所述分配的內存塊(34)移動至所述特定內存段(20’ )的起始地址。
3.根據權利要求1或2所述的方法,其中,所述轉換表(10)包括具有分配的內存段(20)的識別密鑰(16、16’)、起始地址以及尺寸的條目(18a、18b)。
4.根據前述權利要求中任一項所述的方法,其中,刪除所述特定內存段(20’)進一步包括: 重新計算所述轉換表(10)內具有位于所述特定內存段(20’ )起始地址之后的起始地址的每個內存段(20)的起始地址。
5.根據前述權利要求中任一項所述的方法,其中,所述轉換表(10)包括固定數量的條目,并且無論是否使用該條目,每個該條目都包括域(18c),其中,使用的條目包括對所述轉換表(10)中的下一個使用的條目的引用(24)。
6.根據前述權利要求中任一項所述的方法,其中,刪除所述特定內存段(20’)進一步包括: 設定所述轉換表(I)中使用的條目的引用,該引用對所述特定內存段(20’ )的條目的引用進行引用,其中該使用的條目指向該特定內存段的條目。
7.根據前述權利要求中任一項所述的方法,進一步包括通過: 接收所述特定內存段(20’ )的識別密鑰; 根據基于所述識別密鑰的所述轉換表(10)確定所述特定內存段(20’ )的總尺寸;并且 將分配于所述特定內存段(20’)之后的內存段(20)朝著所述內存池(12)的起點以所述特定內存段(20’ )的總尺寸移動, 來刪除一排所述特定內存段。
8.根據前述權利要求中任一項所述的方法,進一步包括通過: 接收新內存段的長度; 將所述新內存段的起始地址設置到包括已分配內存段的分配的內存塊的端部; 在所述轉換表(10)中搜索未使用的條目; 生成所述新內存段的新識別密鑰; 將該條目標記為使用的并且在該條目中儲存所述新內存段的所述新識別密鑰和起始地址, 來請求新內存段。
9.根據前述權利要求中任一項所述的方法,進一步包括通過: 接收所述分配的內存段(20)的識別密鑰(16);以及 根據基于所述識別密鑰(16)的所述轉換表(10)確定起始地址, 來請求分配的內存段(20)。
10.一種用于管理內存池的計算機程序,在由處理器執(zhí)行時,所述計算機程序適于執(zhí)行根據權利要求1到9中任一項所述的方法的步驟。
11.一種計算機可讀介質,在該計算機可讀介質內儲存根據權利要求10所述的計算機程序。
【文檔編號】G06F12/02GK104461913SQ201410490049
【公開日】2015年3月25日 申請日期:2014年9月23日 優(yōu)先權日:2013年9月24日
【發(fā)明者】阿德里安-雷穆斯·富爾杜伊 申請人:大陸汽車有限責任公司