1. 1、本文档共27页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档