国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種內存監(jiān)控方法

      文檔序號:6643835閱讀:150來源:國知局
      專利名稱:一種內存監(jiān)控方法
      技術領域
      本發(fā)明涉及計算機系統(tǒng)或者嵌入式操作系統(tǒng)領域,具體來說,涉及一種內存監(jiān)控的方法。
      背景技術
      由于計算機系統(tǒng)和嵌入式操作系統(tǒng)的迅速發(fā)展,嵌入式操作系統(tǒng)早已經融入我們的生活,除了日常生活中可以看到的家電產品、工業(yè)及軍事應用的獨立產品之外,許多新電腦系統(tǒng),事實上也是有許許多多小的嵌入式系統(tǒng)組成。
      使用嵌入式操作系統(tǒng)的產品越來越多,如何開發(fā)一個高穩(wěn)定性,高效率的操作系統(tǒng)和應用程序是一個非常關鍵的問題。則在開發(fā)中如何優(yōu)化內存管理,提高內存的使用效率,盡可能地提高運行速度,是大家所關心的問題。
      系統(tǒng)的內存不管其容量有多大,但均是有限的,所以在使用內存時,就要時刻監(jiān)視內存的使用情況。這樣可以了解應用程序占用資源的情況、對系統(tǒng)的開銷大小及是否影響系統(tǒng)或者應用程序的穩(wěn)定性等狀況。如果等到發(fā)現(xiàn)系統(tǒng)的內存不能再分配了才開始釋放內存,這時整個系統(tǒng)可能無法運行了。上述的方法中,對分配內存和釋放內存都未進行登記,不能夠使應用程序開發(fā)者能夠清楚地知道自己使用了多大的內存或者還有多少內存可供使用?,F(xiàn)在也出現(xiàn)了一種采用內存池來對內存進行管理的方法,該方法先分配一個內存池,然后對內存池統(tǒng)一管理,其一般是將底層操作系統(tǒng)的全部內存一次性地劃分為大小不同的內存池,再將每一內存池中的內存劃分為固定的大小一致的內存塊。但是現(xiàn)有的這種方法,沒有對整個系統(tǒng)和應用程序所用的內存進行分類管理,也沒有對某個任務或者某個類別的占用內存資源進行統(tǒng)計,另外也未對內存的釋放正確與否進行驗證,而且對內存池中的使用情況的掃描需花費較多時間,效率低。

      發(fā)明內容
      本發(fā)明要解決的技術問題在于,為克服現(xiàn)有的內存管理方法中不能監(jiān)控系統(tǒng)或者應用程序占用的內存資源的不足,而提供一種內存監(jiān)控的方法,可以監(jiān)控到內存使用的細節(jié),如每個線程、每個進程、每個文件在哪一行分配的內存,是否有內存寫訪問越界等。
      本發(fā)明為解決其技術問題所采用的技術方案為提供一種內存監(jiān)控方法,包括如下步驟(a)建立一個內存監(jiān)控鏈表的步驟,該內存監(jiān)控鏈表至少包括一個內存監(jiān)控鏈表節(jié)點,所述內存監(jiān)控鏈表節(jié)點中包含有對應的內存塊的管理信息;(b)初始化內存監(jiān)控鏈表的步驟;(c)分配內存塊的步驟當分配該內存塊時,生成一個對應于該內存塊的內存監(jiān)控鏈表節(jié)點,并將該內存監(jiān)控鏈表節(jié)點插入所述內存監(jiān)控鏈表中;(d)釋放內存塊步驟當釋放該內存塊時,刪除與該內存對應塊的內存監(jiān)控鏈表節(jié)點。
      其中,所述步驟(a)中的內存監(jiān)控鏈表節(jié)點的數(shù)據(jù)結構記錄有內存監(jiān)控鏈表項的前一個指針、內存監(jiān)控鏈表項的后一個指針、分配內存塊的文件名、分配內存塊的語句所在的文件行數(shù)、內存塊的首地址、內存塊的長度、內存塊的類型、分配內存塊的線程ID及分配內存塊的進程ID。
      其中,所述步驟(b)中的初始化內存監(jiān)控鏈表的步驟包括初始化內存監(jiān)控全局變量成員的步驟將已經分配的內存數(shù)項數(shù)、已經分配的內存總數(shù)、釋放的內存總數(shù)、系統(tǒng)使用的內存總數(shù)、用戶使用的內存總數(shù)均賦值為零;將內存監(jiān)控鏈表的首地址賦值為“NULL”;將內存監(jiān)控程序使用的信號量設為創(chuàng)建信號量的返回值。
      其中,所述步驟(c)包括(c1)按用戶或者系統(tǒng)提供的SIZE分配一塊大小為較SIZE大于預定字節(jié)的內存,并在內存塊的高地址尾部存放該預定字節(jié)的特殊標志;(c2)根據(jù)內存監(jiān)控鏈表每個內存監(jiān)控鏈表節(jié)點結構建立一個與包含有該內存塊信息的內存監(jiān)控鏈表節(jié)點;(c3)把該建立的內存監(jiān)控鏈表節(jié)點插入內存監(jiān)控鏈表中;(c4)更新內存監(jiān)控全局變量中成員的信息。
      其中,所述步驟(c4)進一步包括將已經分配的內存總數(shù)加一,將已經分配的內存數(shù)項數(shù)加一,根據(jù)該內存塊的使用類型,將系統(tǒng)使用的內存總數(shù)加一或將用戶所使用的內存總數(shù)加一。
      其中,所述步驟(d)包括(d1)根據(jù)用戶或者系統(tǒng)提供的釋放內存塊地址在內存監(jiān)控鏈表中找到相應的內存監(jiān)控鏈表節(jié)點;(d2)判斷特殊標志是否正確;(d3)如果特殊標志正確,則釋放該內存塊;(d4)刪除步驟(d1)中所找到的內存監(jiān)控鏈表節(jié)點;(d5)更新內存監(jiān)控全局變量中成員的信息步。
      其中,當步驟(d2)中特殊標志不正確,則提示內存越界。
      其中,所述步驟(d5)進一步包括將已分配的內存數(shù)項數(shù)減一;將釋放的內存總數(shù)加一;根據(jù)步驟(d3)中所釋放的內存塊的類型,將系統(tǒng)使用的內存總數(shù)減去步驟(d1)中找到的相應內存監(jiān)控鏈表節(jié)點中的內存的大小,或將用戶使用的內存總數(shù)減去步驟(d1)中找到的相應內存監(jiān)控鏈表節(jié)點中內存的大小。
      實施本發(fā)明的內存監(jiān)控的方法,具有以下有益效果在本發(fā)明中,通過采用一個雙向的內存監(jiān)控鏈表,結合其中的內存監(jiān)控鏈表節(jié)點與全局變量,這些保存在鏈表中的信息比較全面,因此用戶可以監(jiān)控到每個線程,每個進程,每個文件在哪一行分配的內存,而且可以監(jiān)控是否有內存寫訪問越界,達到真正意義上的內存監(jiān)控。另外,在分配內存及釋放內存時,只需增加或刪除與該內存對應的內存監(jiān)控鏈表節(jié)點。使用方便、效率高。無需對整個內存進行掃描監(jiān)控。


      下面將結合附圖及實施例對本發(fā)明作進一步說明,附圖中圖1是本發(fā)明一種內存監(jiān)控方法的系統(tǒng)框圖;圖2是本發(fā)明一種內存監(jiān)控方法的初始化內存監(jiān)控鏈表步驟的流程圖;圖3是本發(fā)明一種內存監(jiān)控方法的分配內存步驟的流程圖;圖4是本發(fā)明一種內存監(jiān)控方法的釋放內存步驟的流程圖。
      具體實施例方式
      本發(fā)明提供一種內存監(jiān)控的方法,用來監(jiān)控計算機系統(tǒng)或嵌入式系統(tǒng)的系統(tǒng)內存和用戶分配內存的情況。在本發(fā)明中,對內存監(jiān)控是采用一種雙向鏈表的方式來實現(xiàn)的。
      如圖1示出了本發(fā)明中對內存進行監(jiān)控的雙向鏈表(下稱為內存監(jiān)控鏈表)的示意圖。在該內存監(jiān)控鏈表中,包括有多個用于存放物理內存管理的信息的內存監(jiān)控鏈表節(jié)點(可稱為內存監(jiān)控鏈表節(jié)點)。其是在當系統(tǒng)或用戶每分配一塊內存時,就在該鏈表中創(chuàng)建一個用于登記該內存的內存監(jiān)控鏈表節(jié)點。這些內存監(jiān)控鏈表節(jié)點在圖1中記作內存監(jiān)控鏈表節(jié)點1(對應內存塊1)、內存監(jiān)控鏈表節(jié)點2(對應內存塊2)、…及內存監(jiān)控鏈表節(jié)點N(對應內存塊N)等。其中虛線框表示可以在該內存監(jiān)控鏈表中添加或刪除內存監(jiān)控鏈表節(jié)點。
      各內存監(jiān)控鏈表節(jié)點的數(shù)據(jù)結構如圖1中右側的方框所示,包括有pPrev、pNext、Name、LineNum、Addr、Len、Type、ThreadID及ProcessID。其中,pPrev記錄內存監(jiān)控鏈表項的前一個指針;pNext記錄內存監(jiān)控鏈表項的后一個指針;Name記錄分配內存塊的文件名;LineNum記錄分配內存塊的語句所在的文件行數(shù);Addr記錄內存塊的首地址;Len記錄內存塊的長度;Type記錄內存塊的類型(例如,是系統(tǒng)使用還是由用戶使用);ThreadID記錄分配內存塊的線程ID;ProcessID記錄分配內存塊的進程ID。
      通過每一個內存監(jiān)控鏈表節(jié)點中pPrev和pNext內所存放的指針,將多個內存監(jiān)控鏈表節(jié)點組成一個雙向鏈表(內存監(jiān)控鏈表)。
      在本發(fā)明中,首先需要定義一些全局變量,在這些全局變量中,包括諸如,記錄已經分配的內存總數(shù)、釋放的內存總數(shù)、系統(tǒng)使用的內存總數(shù)、用戶使用的內存總數(shù)等信息。結合每個內存監(jiān)控鏈表節(jié)點中所記錄的分配內存塊的文件名、分配內存塊的語句所在的文件行數(shù)、內存塊的首地址、內存塊的長度、內存塊的類型、分配內存塊的線程ID及分配內存塊的進程ID等信息。故使保存在鏈表中的信息已經比較全面,通過這些信息可以讓用戶監(jiān)控到每個線程,每個進程,每個文件在哪一行分配的內存,而且可以監(jiān)控是否有內存寫訪問越界,達到真正意義上的內存監(jiān)控。具體來說,內存監(jiān)控全局變量包括有MemItemCount、MallocCount、FreeCount、SysUsedCount、UserUsedCount、Hmem_Sema及MemItemHead。
      其中,MemItemCount用于記錄已分配還未釋放的內存數(shù)項數(shù);MallocCount用于記錄已經分配的內存總數(shù),這個數(shù)是累加的;FreeCount用于記錄釋放的內存總數(shù),這個數(shù)也是累加的;SysUsedCount用于記錄系統(tǒng)使用的內存總數(shù);UserUsedCount用于記錄用戶使用的內存總數(shù);Hmem_Sema用于記錄內存監(jiān)控程序使用的信號量;MemItemHead用于記錄內存監(jiān)控鏈表的首地址。
      在本發(fā)明中,至少包括有初始化內存監(jiān)控鏈表步驟、分配內存步驟以及釋放內存步驟。
      如圖2所示,所述的初始化內存監(jiān)控鏈表步驟主要包括初始化全局變量的所有成員,將MemItemHead賦值為“NULL”,將MemItemCount、MallocCount、FreeCount、SysUsedCount及UserUsedCount均賦值為零。而將Hmem_Sema設為創(chuàng)建信號量的返回值(步驟S20)。
      在對內存監(jiān)控鏈表進行初始化之后,就可以進行內存分配的步驟。如圖3所示,所述的分配內存的流程圖包含按用戶或者系統(tǒng)提供的大小(SIZE)分配一塊較之大于一定字節(jié)的內存,在本發(fā)明的一個實施例中,所分配的內存大小為SIZE+4,并在該內存塊的高地址尾部存放該超出的4個字節(jié)的特殊標志(例如0x3d0x3d0x3d0x3d),在其他的實施例中,不限于4個字節(jié),存放的特殊標志也不限于0x3d0x3d0x3d0x3d(步驟S31);根據(jù)內存監(jiān)控鏈表每個內存監(jiān)控鏈表節(jié)點結構建立一個與包含有該內存塊信息(如Name、LineNum、Addr、Len、Type等)的內存監(jiān)控鏈表節(jié)點(步驟S32);把步驟S32中所建立的內存監(jiān)控鏈表節(jié)點插入內存監(jiān)控鏈表中,在本發(fā)明的一個最佳實施例中,是插入內存監(jiān)控鏈表的頭部。在其他的實施例中,也可插入內存監(jiān)控鏈表的尾部,或者其它地方,但是插入頭部是最快,最有效率的,因為頭節(jié)點不用查找,可以直接引用全局變量;更新內存監(jiān)控全局變量中成員的信息,即將MallocCount加一,將MemItemCount加一,視該內存塊的使用類型(用戶或系統(tǒng)使用)將SysUsedCount加一或將UserUsedCount加一。
      當需要對物理內存進行釋放時,在本發(fā)明中要刪除與該內存對應的內存監(jiān)控鏈表節(jié)點及更新全局變量成員。
      如圖4所示,所述的釋放內存的流程圖包括根據(jù)用戶或者系統(tǒng)提供的釋放內存塊地址,在內存監(jiān)控鏈表中找到相應的內存監(jiān)控鏈表節(jié)點(步驟S41);判斷該內存塊中的特殊標志是否正確(步驟S42);如果該特殊標志出現(xiàn)改變,則轉入步驟S44,提示內存越界,起到報警作用;如果該特殊標志正確,則執(zhí)行步驟S43,根據(jù)用戶或者系統(tǒng)提供的釋放內存地址釋放物理內存;則在步驟S45中,將與該內存對的內存監(jiān)控鏈表節(jié)點從內存監(jiān)控鏈表中刪除。因為在內存監(jiān)控鏈表中刪除了一個內存監(jiān)控鏈表節(jié)點,則要相應更新內存監(jiān)控全局變量中的成員信息,將MemItemCount減一;將FreeCount加一;如果該釋放的內存的使用類型為系統(tǒng)使用,則將SysUsedCount減去步驟S41中找到的相應內存監(jiān)控鏈表節(jié)點中內存的大小,如果該釋放的內存的使用類型為用戶使用,則將UserUsedCount減去步驟S41中找到的相應內存監(jiān)控鏈表節(jié)點中內存的大小(步驟S46)。然后流程結束。
      在本發(fā)明中,通過采用一個雙向的內存監(jiān)控鏈表,結合其中的內存監(jiān)控鏈表節(jié)點與全局變量,這些保存在鏈表中的信息比較全面,因此用戶可以監(jiān)控到每個線程,每個進程,每個文件在哪一行分配的內存,而且可以監(jiān)控是否有內存寫訪問越界,達到真正意義上的內存監(jiān)控。另外,在分配內存及釋放內存時,只需增加或刪除與該內存對應的內存監(jiān)控鏈表節(jié)點。使用方便、效率高。無需對整個內存進行掃描監(jiān)控。
      權利要求
      1.一種內存監(jiān)控方法,其特征在于,包括如下步驟(a)建立一個內存監(jiān)控鏈表的步驟,該內存監(jiān)控鏈表至少包括一個內存監(jiān)控鏈表節(jié)點,所述內存監(jiān)控鏈表節(jié)點中包含有對應的內存塊的管理信息;(b)初始化內存監(jiān)控鏈表的步驟;(c)分配內存塊的步驟當分配該內存塊時,生成一個對應于該內存塊的內存監(jiān)控鏈表節(jié)點,并將該內存監(jiān)控鏈表節(jié)點插入所述內存監(jiān)控鏈表中;(d)釋放內存塊步驟當釋放該內存塊時,刪除與該內存對應塊的內存監(jiān)控鏈表節(jié)點。
      2.根據(jù)權利要求1所述的內存監(jiān)控方法,其特征在于,所述步驟(a)中的內存監(jiān)控鏈表節(jié)點的數(shù)據(jù)結構記錄有內存監(jiān)控鏈表項的前一個指針、內存監(jiān)控鏈表項的后一個指針、分配內存塊的文件名、分配內存塊的語句所在的文件行數(shù)、內存塊的首地址、內存塊的長度、內存塊的類型、分配內存塊的線程ID及分配內存塊的進程ID。
      3.根據(jù)權利要求2所述的內存監(jiān)控方法,其特征在于,所述步驟(b)中的初始化內存監(jiān)控鏈表的步驟包括初始化內存監(jiān)控全局變量成員的步驟將已經分配的內存數(shù)項數(shù)、已經分配的內存總數(shù)、釋放的內存總數(shù)、系統(tǒng)使用的內存總數(shù)、用戶使用的內存總數(shù)均賦值為零;將內存監(jiān)控鏈表的首地址賦值為“NULL”;將內存監(jiān)控程序使用的信號量設為創(chuàng)建信號量的返回值。
      4.根據(jù)權利要求3所述的內存監(jiān)控方法,其特征在于,所述步驟(c)包括(c1)按用戶或者系統(tǒng)提供的SIZE分配一塊大小為較SIZE大于預定字節(jié)的內存,并在內存塊的高地址尾部存放該預定字節(jié)的特殊標志;(c2)根據(jù)內存監(jiān)控鏈表每個內存監(jiān)控鏈表節(jié)點結構建立一個與包含有該內存塊信息的內存監(jiān)控鏈表節(jié)點;(c3)把該建立的內存監(jiān)控鏈表節(jié)點插入內存監(jiān)控鏈表中;(c4)更新內存監(jiān)控全局變量中成員的信息。
      5.根據(jù)權利要求4所述的內存監(jiān)控方法,其特征在于,所述步驟(c4)進一步包括將已經分配的內存總數(shù)加一,將已經分配的內存數(shù)項數(shù)加一,根據(jù)該內存塊的使用類型,將系統(tǒng)使用的內存總數(shù)加一或將用戶所使用的內存總數(shù)加一。
      6.根據(jù)權利要求4或5任一項所述的內存監(jiān)控方法,其特征在于,所述步驟(d)包括(d1)根據(jù)用戶或者系統(tǒng)提供的釋放內存塊地址在內存監(jiān)控鏈表中找到相應的內存監(jiān)控鏈表節(jié)點;(d2)判斷特殊標志是否正確;(d3)如果特殊標志正確,則釋放該內存塊;(d4)刪除步驟(d1)中所找到的內存監(jiān)控鏈表節(jié)點;(d5)更新內存監(jiān)控全局變量中成員的信息步。
      7.根據(jù)權利要求6所述的內存監(jiān)控方法,其特征在于,當步驟(d2)中特殊標志不正確,則提示內存越界。
      8.根據(jù)權利要求6所述的內存監(jiān)控方法,其特征在于,所述步驟(d5)進一步包括將已分配的內存數(shù)項數(shù)減一;將釋放的內存總數(shù)加一;根據(jù)步驟(d3)中所釋放的內存塊的類型,將系統(tǒng)使用的內存總數(shù)減去步驟(d1)中找到的相應內存監(jiān)控鏈表節(jié)點中的內存的大小,或將用戶使用的內存總數(shù)減去步驟(d1)中找到的相應內存監(jiān)控鏈表節(jié)點中內存的大小。
      全文摘要
      本發(fā)明涉及一種內存監(jiān)控方法,包括(a)建立一個內存監(jiān)控鏈表的步驟,該內存監(jiān)控鏈表至少包括一個內存監(jiān)控鏈表節(jié)點,所述內存監(jiān)控鏈表節(jié)點中包含有對應的內存塊的管理信息;(b)初始化內存監(jiān)控鏈表的步驟;(c)分配內存塊的步驟當分配該內存塊時,生成一個對應于該內存塊的內存監(jiān)控鏈表節(jié)點,并將該內存監(jiān)控鏈表節(jié)點插入所述內存監(jiān)控鏈表中;(d)釋放內存塊步驟當釋放該內存塊時,刪除與該內存對應塊的內存監(jiān)控鏈表節(jié)點。采用本發(fā)明,在分配內存及釋放內存時,只需增加或刪除與該內存對應的內存監(jiān)控鏈表節(jié)點。通過內存監(jiān)控鏈表可以監(jiān)控到內存使用的細節(jié),另外,使用方便、效率高。
      文檔編號G06F12/02GK1936859SQ20051010018
      公開日2007年3月28日 申請日期2005年9月30日 優(yōu)先權日2005年9月30日
      發(fā)明者胡本平 申請人:康佳集團股份有限公司
      網友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1