- 1、本文档共27页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
池内春秋
池內春秋— Memory Pool 的設計哲學和無痛運用 1 侯捷觀點
池內春秋
Memory Pool 的
設計哲學和無痛運用
北京《程序員》2002.09
台北《Run!PC》2002.09
作者簡介:侯捷,電腦技術作家,著譯評兼擅。常著文章自娛,頗示己志。
電子郵箱:jjhou@
侯捷網站:
簡體鏡站:
z 讀者基礎:有一定程度的 C++ 編程經驗
z 本文適用工具:GNU C++ 編譯器
z 本文關於 SGI STL 之剖析,部分已載於《STL 源碼剖析》第二章;嶄新內容
包括 SGI STL 區塊卸除(歸還)動作分析、缺點與補強之道、無痛應用、三
種編譯器之區塊配置效能比較。
z 術語:memory pool(記憶池),free list(自由串列),free block(自由區
塊),allocator(配置器),heap(堆積),client(客端)。
為什麼需要記憶池
記憶體曾經是兵家必爭之地,曾經被喻為「CPU 之外最寶貴的電腦硬體資源」。
在那「640K 天塹1」的遠古年代裡,程式員對記憶體緇銖必較的程度可能令生活
於「虛擬記憶體」環境下的當今世代瞠目結舌,千禧年(Y2K)蟲蟲危機即肇因
1 MS-DOS 5.0 以前,PC 環境上只能開發 640K 以下的程式。640K 內必須含括作業系
統本身、應用程式碼本身、以及應用程式的資料量。MS DOS 5.0 強化了 640KB 至 1024KB
之間(UMB)定址空間的運用,以及 1024K 以上少量定址空間(HMA)的運用。
侯捷觀點2 池內春秋— Memory Pool 的設計哲學和無痛運用 於當初過份樽節記憶體2。當時的人們(我也屬其中之一)即便在 config.sys 中揮
汗調校只省下區區數十個 bytes,都會覺得歡欣鼓舞;如果有人能夠運用 int67h 進
入 EMS 記憶體或運用 int21h 進入 XMS 記憶體3,更可說是走路有風,呵水成凍。
1991 年微軟發佈的 MS-DOS 5.0,涵蓋數個定址相關技術(UMB:Upper Memory
Block,HMA:High Memory Area),大幅度提昇 MS-DOS 的定址能力,當時被
譽為「突破性的進展」。
曾幾何時,當虛擬記憶體作業系統(如 Windows、OS/2、Linux)走進群眾,苦樂
俱往矣。非人道的痛苦折磨被迅速遺忘,緇銖必較的軼趣成了白頭宮女話天寶當
年的回憶。我們不再被程式碼大小所限,也不再被資料量所限。所有記憶體不足
的問題只要「加一條 256M 記憶體」就獲得解決。從這個角度看,程式員的生活
幸福美滿。
當溫飽獲得解決,人們要求精緻。軟體開始往兩個方向發展:一是更快,一是更
小。系統級軟體或特殊應用或資料量極大的軟體,要求運行極快;掌上系統或嵌
入式系統則因先天硬體環境的限制而必須體積極小。於是記憶體問題又再度浮上
檯面。
不論是速度問題或空間問題,都肇因於編譯器給的那些個彈性極大的記憶體配置
工具帶來了一些額外開銷(overhead)。當額外開銷的比率超過你的容忍限度,你
免不了要衝冠一怒尋求突破。最簡單而效果良好的一種技術就是 memory pool(記
憶池)。在正式介紹 memory pool 技術之前,我要先帶你徹底了解 C++ 編譯器的
記憶體配置策略。
2 當時的程式員為節省記憶體用量,將年份 19xx 僅儲存為 xx,以至於時序進入西元 2000
之後無法正常進位。
3 EMS:Expanded Memory Spec.,XMS:eXtended Memory Spec.,兩者都是記憶體擴
展(延伸)規格。詳見拙作《虛擬記憶體:觀念、設計與實作,using EMS and XMS》,
1991,旗標出版。
侯捷觀點池內春秋— Memory Pool 的設計哲學和無痛運用 3 C++ 平台供應的記憶體配置工具
在 C++ 平台上,你可以透過圖一所列的四種方式動態索求及釋放記憶體。其中第
二組呼叫第三組,第三組功能及行為等同於第一組。第四組的「功能」相當於第
一或第三組,其最終配置動作亦需仰賴第一或第三組完成,但我們可在第四組內
部設計出複雜精巧的 memory pool 機制。
配置 釋放 歸屬 可重載否 標記
malloc() free() C 標準函式 不可 (1)
new delete C++ 運算式 不可 (2)
::operator new() ::operator delete() C++ 運算子 可 (3)
alloc::allocate() alloc::deallocate() C++ 標準程式庫 (4)
可自由設計並裝載於
之記憶體配置器 任何容器身上提供服務 圖一\ C++ 語言及程式庫供應的
文档评论(0)