亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

保持C/C++程序代碼的可伸縮性

2019-11-17 05:02:27
字體:
來源:轉載
供稿:網友

  在今天,已有許多的32位應用程序感到,在32位平臺上可用的虛擬內存受到了一定的限制,對程序開發者來說,即使是開始關注64位平臺時,也不得不維護軟件的32位版本,這就需要一種方法,以使代碼的兩個版本都保持相當的可伸縮性。

  目前的內存剖析工具能幫助確定,當程序達到峰值內存使用量時,都發生了什么,但是這些工具都過于關注已分配的內存塊,而不是已提交的虛擬內存地址空間,而這兩種衡量標準沒有直接的相關性,如內存泄漏、內存碎片、內存塊內的空間浪費、或過度延遲的內存單元重新分配這些因素,都會導致不必要的虛擬內存提交。運行時分析工具如IBM Rational Purify或Parasoft Inuse均可以提供內存泄漏及已用內存的描述,這些信息是非常有用的,但是,一個非凡的內存塊也許可能、也許不可能影響到虛擬內存覆蓋區,另外,甚至一個有碎片的內存堆中的一個小塊,也能直接影響到虛擬內存覆蓋區。從另一方面來說,在此范圍內的任意內存塊--甚至泄漏的塊,對虛擬內存覆蓋區來說,也不會與之有什么關系,除非每一個此范圍內有用的內存塊能重新分配到一個更緊湊的范圍內,這就有點像java或托管程序的垃圾回收機制,但對大多數C/C++本地應用程序來說,就絕對不可能了,因為在虛擬內存空間中,它們內存塊的位置是不確定的。

  至于本地代碼,不必要的虛擬內存使用,這個實際的問題,比未清理的內存塊這個理論上的問題,更加有實質性。未清理的內存塊可能導致虛擬內存的浪費,造成過多的系統開銷,但或者不會;這完全依靠于堆治理器是否提交了更多的虛擬內存,以支撐這種浪費。某些很小的未使用的內存塊,不會引起不必要的堆"擴展"。與其讓你來猜哪一個或多少已浪費的內存塊導致了堆擴展,倒不如學會怎樣判定出有意義的浪費是什么。當堆中包含不再使用的內存塊時,此時通過加入對未縮減堆的檢查,就能確定出與你的程序虛擬內存要求有很大關系的、必須進行的內存塊清理。

  為找出哪一個堆中的內存塊需多留意,必須在程序中加入一些額外的代碼,以跟蹤內存堆范圍及已分配的內存塊。對額外的代碼進行條件編譯,生成一個特定的版本,也許是一個不錯的辦法。

  為達到此目的,需編寫自定義的內存分配例程,并跟蹤每一個內存塊,另有一個自定義的釋放例程,且跟蹤虛擬內存中堆的位置,請參見例1與例2的偽代碼算法。可能還需編寫自定義的訪問函數以標記出訪問過的內存塊,以便于在適當的時候釋放虛擬內存,所有這些并不需要過多的內存開銷。另一方面,假如你的程序以堆的形式使用了大量的內存,那么將會極大地降低性能,此處的方法也不是長久之計。

  例1:

/* 輸入參數*/
ADDRESS triggerAddr
SIZE triggerSize
LIST a list of tracked heap ranges

IF (the virtual memory at triggerAddr is tracked on the list as part of a heap range)
DO
IF (triggerAddr + triggerSize >
(the tracked upper boundary of that heap range))
DO
/* 一個現有的堆范圍被擴展 */

make system call(s) to determine the base and extent of the newly committed range that contains the addresses from triggerAddr to (triggerAddr + triggerSize)

update the size of the tracked heap range to indicate its new upper limit
END
END
ELSE DO
/* 在triggerAddr中有一個新的堆范圍 */

make system call(s) to determine the base and extent of the newly committed range that contains the addresses from triggerAddr to (triggerAddr + triggerSize)

track the new committed range in the list of heap ranges
END
  例2:

/* 輸入參數 */
ADDRESS triggerAddr
SIZE triggerSize
LIST a list of tracked heap ranges

/* 局部變量 */
ADDRESS origRangeBase
SIZE origRangeSize
BOOL bFoundChange

bFoundChange = FALSE

IF (the virtual memory at triggerAddr is not tracked on the heap range list as part of a heap range)
DO
/*似乎我們已經清楚此次釋放了。*/
END
ELSE IF (an access exception occurs when memory at triggerAddr is read)
DO
bFoundChange = TRUE
END

IF (bFoundChange) DO
/*因為之前內存塊占用的空間被釋放了,所以堆占用的虛擬內存范圍就改變了。*/

make system calls to determine the bases and extents of the tracked committed heap ranges in the immediate vicinity of the decommitted range that includes the addresses from triggerAddr to (triggerAddr + triggerSize)

/*更新堆范圍跟蹤,以反映剩余提交的范圍 */

IF (any portion of the tracked heap range that contained the block at TriggerAddr is still committed)
DO
update the heap range list to track just the portion(s) of that range that remain committed
END
ELSE
DO
delete the list element that tracks the range
END
END QQread.com 推出Windows2003教程 win2003安裝介紹 win2003網絡優化 win2003使用技巧 win2003系統故障 服務器配置 專家答疑
更多的請看:http://www.qqread.com/windows/2003/index.Html跟蹤堆內存塊

  可使用自定義的內存分配函數來進行內存塊的跟蹤,而這種函數最初被稱為普通內存分配函數,舉例來說,C語言程序中一般使用malloc(),爾后,自定義的內存分配會進行以下一系列的操作:

  ·在目前已分配的內存塊列表中,跟蹤新分配的內存塊。

  ·決定是否向系統提交虛擬內存。

  ·假如虛擬內存已被提交,跟蹤包含此內存塊的堆范圍,并更新上述堆內存塊列表,以標識出從未被訪問過的內存塊。

  還需要自定義的釋放與重分配內存函數,以便通過程序中使用的內存塊的地址與大小,來更新內存塊列表。所跟蹤的堆內存塊列表應包含如下結構:

  ·內存塊的基地址。

  ·自身大小

  ·用于指示自從上次虛擬內存被提交之后,內存塊是否被訪問過的布爾值。

  當一個內存塊被釋放后,自定義的釋放代碼將會進行以下操作:

  ·假如自從上次堆擴展之后,內存塊還未被訪問過,將向程序報告。

  ·從列表中刪除跟蹤的內存塊。

  ·判定系統是否已釋放了包含此內存塊的虛擬內存。

  ·假如虛擬內存被釋放,要相應地更新,以反映剩余的堆范圍。

  當一個內存塊被重新分配時,你的自定義重新分配內存代碼必須進行以下兩種操作:首先,在釋放之后重新跟蹤內存塊,因為重新分配的內存塊可能不在原位置;其次,在分配之后也要重新跟蹤新的基地址及分配內存塊的大小。另有一個可選的方法,你可檢查是否重新分配的內存塊被移動了,假如沒有被移動,只需僅僅更新內存塊跟蹤列表,標出此內存塊的大?。患偃鐑却鎵K還在同一基地址,但是增長了,此時就要檢查堆擴展,并按照前述分配內存的方法重來一遍。

  跟蹤堆自身

  堆跟蹤取決于當內存塊被分配或釋放時,虛擬內存是否分別被提交或釋放,依此可以建立一張堆內存范圍跟蹤表,以確定在程序運行期間,虛擬內存空間中堆的確切位置,跟蹤列表中應包括如下數據:

  ·跟蹤范圍的基地址

  ·自身大小

  在Windows操作系統中,這些值可通過HeapWalk()調用獲得,此處要注重的是,HeapWalk()函數調用開銷巨大,因此,只在程序需要時調用,而不是當有內存分配或釋放時都調用。另一種Windows上的方法是使用IsBadReadPointer()函數,當一個內存塊被釋放后,你可以調用這個函數快速地判定包含此內存塊的虛擬內存是否已被釋放。另一個可以跨平臺的備選方法是,可試著訪問包含此內存塊的虛擬內存,并捕捉可能發生的訪問異常。此外,只有在一種情況下會考慮使用如HeapWalk()這樣開銷巨大的函數,就是需判定鄰近剩余的已提交堆范圍。

  通過一種探測堆內存提交的算法,堆內存跟蹤列表會不斷地增長,如例1中所示。要注重的是,當你的程序分配一個內存塊時,自定義的內存分配代碼也能跟蹤到這些內存塊,并使用例1中的算法來更新包含內存塊的堆列表。假如一個內存塊的分配導致了額外的虛擬內存被提交,那么被內存塊占用的虛擬內存會在之前就釋放,或許之前就被用作別的用途。在任一情況中,必須有條件地更新堆范圍跟蹤列表: l 假如正在跟蹤已提交范圍的基地址,此時必須更新范圍的大小,以指示出新的范圍上限。

  ·否則,必須建立一張新的堆內存范圍跟蹤表。

  假如一個新的內存塊出現在一個之前未被跟蹤的堆范圍中,就滿足了以上條件,此時明智地使用前述的系統調用可高效地跟蹤堆內存范圍。

  當你的程序釋放一個內存塊時,自定義的內存釋放代碼會使用到如例2中的算法,此算法會先判定釋放的內存是否與被跟蹤的堆內存范圍有關;接下來,必須檢查已釋放內存塊占用的空間是否仍處于提交狀態,假如是,表明了即使內存塊被釋放,虛擬內存的覆蓋區也沒有發生改變,否則,你的代碼必須進行如例2結尾處的系統調用--如Windows中的HeapWalk()--以確保跟蹤的堆是最新的,且包含堆內存塊的虛擬內存已被釋放。

  假如虛擬內存已經被提交,那么你應該檢查那些通常包含了最近被釋放的堆內存塊的內存范圍,以確認是否有此范圍內的內存被提交,而此范圍內任何被提交的內存部分都應該是在一個堆內存范圍內,非凡是假如它包含了跟蹤列表上的內存塊,進行此檢查可保證進一步的準確性。接下來還有以下兩件事,如例2中所示:

  ·假如被跟蹤的堆內存范圍內任一部分被提交,必須更新你的跟蹤列表。

  ·否則,刪除列表中的元素并跟蹤新的范圍。

  假如提交的部分在中間,那么就有可能把堆內存范圍截成好幾斷,總而言之,在你放棄跟蹤老的范圍之前,應先在全范圍內檢查一下哪一部分仍處于提交狀態。

  程序中可能會用到好幾個不同的堆,在Windows上,假如你調用HeapCreate()并把返回的句柄傳給接下來的HeapAlloc()、Hea
  一些專業的運行時分析工具也能對分配的內存塊及堆范圍進行跟蹤,就像前面所說的自定義內存分配函數與釋放函數一樣,甚至還能通過基本的虛擬內存HASH值(ox187d690)進一步跟蹤,以便為精確的運行時錯誤檢測提供更加可靠的手段。但此處描述的方法并不足以幫助你理解何時才能找到通過程序可控制的堆內存塊,減少虛擬內存消耗的時機。

  找到適當的清理時機

  為使用跟蹤信息以精確定位那些導致虛擬內存不必要增長的堆內存塊,你還必須要記錄下內存訪問動作,并在程序讀寫堆內存時,標記出相應的內存塊跟蹤結構。
假如你的堆內存塊都是通過存取函數訪問的,那么很輕易就可找到所有代碼讀寫的內存部分,并以條件編譯生成一個特定的版本。這些存取函數可查找你列表上被訪問過的內存塊,并設置布爾值作出標記。

  當虛擬內存被提交生成一個堆,你的自定義內存分配函數應取消堆中所有內存塊的標記,而在接下來,它們可能會重新被標記上,一個接一個,就像你的程序正在訪問它們。當一個取消標記的內存塊被釋放時,相應的虛擬內存也會被釋放,此時你自定義的釋放函數就會先一步釋放內存塊,以減小虛擬內存的覆蓋范圍。

  也可安排對堆內存塊作一些臨時的掃描,這也許可在每一次虛擬內存提交時進行。假如一個內存塊在經過多遍掃描后仍保持未標記狀態(也許會花很長時間),則包含此內存塊的虛擬內存范圍就必須對所跟蹤的內存塊數進行檢查。假如那個內存塊,或者一組被忽視的類似內存塊,只是單獨地與提交的虛擬內存有關系,那么通過釋放與重新定位這些內存塊,你可能已經找到一個減少程序虛擬內存要求的好方法。

  假如你實現了此處描述的所有內存塊和堆范圍跟蹤代碼,而當這些所有的跟蹤都起作用時,那么程序的速度將會變得很慢,主要是因為在每一次堆內存訪問時,都會進行一遍列表查找,當然,也可以通過一些快速列表查找方法如二分法查找、跳躍查找之類的來縮短查找的時間,還可使用對應每個堆的單獨列表來加速查找。假如程序使用了許多的堆內存塊,并且也找到了減少額外虛擬內存消耗的方法,以往所花費的所有精力與耐心,與此時得到的回報相比,就算不上什么了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品www| 欧美国产日韩中文字幕在线| 国产精品久久久久久搜索| 人九九综合九九宗合| 日韩精品一二三四区| 欧美激情视频一区| 国产在线一区二区三区| 中文字幕欧美精品在线| 91精品国产综合久久香蕉922| 久久久国产精品视频| 国产色婷婷国产综合在线理论片a| 欧美日韩日本国产| 91tv亚洲精品香蕉国产一区7ujn| 精品久久久久久久中文字幕| 色综合视频网站| 亚洲福利视频免费观看| 日韩精品福利网站| 亚洲视频在线观看视频| 国产精品日韩在线播放| 91在线高清免费观看| 国产精品成久久久久三级| 欧美亚洲视频在线看网址| 亚洲精品美女久久| 97国产精品免费视频| 久久国产精品影视| 亚洲国产成人爱av在线播放| 欧美肥臀大乳一区二区免费视频| 中文字幕在线亚洲| 国产精品欧美日韩| 国产女同一区二区| 欧美午夜久久久| 久久国产精品首页| 国产精品一区二区av影院萌芽| 国产视频精品va久久久久久| 久久综合久久美利坚合众国| 亚洲国产成人久久综合| 精品久久久久久电影| 国产欧亚日韩视频| 亚洲精品日韩欧美| 亚洲第一黄色网| 成人黄色影片在线| 亚州成人av在线| 亚洲视频在线观看网站| 欧美日韩国产中文精品字幕自在自线| 欧美高跟鞋交xxxxxhd| 久久久久久国产免费| 91视频免费网站| 欧美午夜激情小视频| 亚洲美女在线看| 久久中国妇女中文字幕| 亚洲精品一区二区久| 欧美激情国产日韩精品一区18| 日韩精品极品在线观看| 91中文字幕在线观看| 热门国产精品亚洲第一区在线| 中文字幕亚洲精品| 欧美黄色免费网站| 国产精品久久久久高潮| 亚洲福利影片在线| 亚洲精品欧美一区二区三区| 久久人人爽国产| 亚洲在线免费观看| 国产精品激情自拍| 中文字幕一精品亚洲无线一区| 久久精品国产成人精品| 狠狠色狠色综合曰曰| 欧美夫妻性生活xx| 成人黄色在线免费| 最近的2019中文字幕免费一页| 午夜精品蜜臀一区二区三区免费| 亚洲天堂av高清| 精品在线小视频| 草民午夜欧美限制a级福利片| 欧美激情精品久久久| 欧美精品在线视频观看| 成人欧美在线视频| 国产精品成人一区二区| xvideos亚洲| 亚州欧美日韩中文视频| 日韩午夜在线视频| 日韩av在线高清| 久久婷婷国产麻豆91天堂| 亚洲国产又黄又爽女人高潮的| 欧美激情videoshd| 欧美猛男性生活免费| 一区国产精品视频| 国内精品模特av私拍在线观看| 亚洲人午夜精品| 亚洲人成电影网站色xx| 97在线观看免费| 91网站在线看| 91av成人在线| 国产精自产拍久久久久久| 亚洲综合色av| 欧美激情精品久久久| 亚洲免费人成在线视频观看| 久久久成人av| 黑人欧美xxxx| 国产亚洲一区精品| 亚洲欧美成人精品| 久久久999国产| 欧美激情高清视频| 日韩精品在线视频美女| 欧美猛少妇色xxxxx| 成人女保姆的销魂服务| 亚洲精品网站在线播放gif| 亚洲伊人第一页| 欧美巨乳在线观看| 一本色道久久综合狠狠躁篇怎么玩| 伊人成人开心激情综合网| 亚洲人成免费电影| 日韩精品免费在线观看| 国语自产在线不卡| 国产精品久久久久久久久久久不卡| 亚洲毛片在线观看.| 51午夜精品视频| 狠狠躁18三区二区一区| 国产视频自拍一区| 国产欧美日韩免费看aⅴ视频| 久久夜精品va视频免费观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲男人天堂手机在线| 久久99久久99精品中文字幕| 中文字幕亚洲字幕| 91高潮在线观看| 国产中文日韩欧美| 欧洲亚洲免费视频| 亚洲精品久久久久久久久久久久| 日韩精品中文字幕在线观看| 亚洲国产成人在线视频| 欧美成人午夜激情在线| 久久精品久久精品亚洲人| 久久久久北条麻妃免费看| 久久久久亚洲精品| 亚洲一区二区福利| 日韩在线观看免费网站| 亚洲www视频| 欧美黑人xxxx| 在线精品国产成人综合| 亚洲高清一区二| 久久精品99国产精品酒店日本| 欧美精品在线视频观看| 亚洲成人三级在线| 亚洲欧美一区二区三区情侣bbw| 亚洲精品成人久久久| 国产一区二区日韩精品欧美精品| 国产精品午夜国产小视频| 日本欧美黄网站| 亚洲精品小视频| 久久这里有精品视频| 欧美最顶级的aⅴ艳星| 久久国产精品亚洲| 欧洲精品久久久| 亚洲va久久久噜噜噜久久天堂| 亚洲精品视频在线播放| 日韩av色在线| 97在线日本国产| 久久成人国产精品| 久久精品视频亚洲| 69av视频在线播放| 操日韩av在线电影| 久热精品在线视频| 亚洲色图狂野欧美| 美女啪啪无遮挡免费久久网站|