高性能健壯系統(tǒng)中的內(nèi)存管理_第1頁
高性能健壯系統(tǒng)中的內(nèi)存管理_第2頁
高性能健壯系統(tǒng)中的內(nèi)存管理_第3頁
高性能健壯系統(tǒng)中的內(nèi)存管理_第4頁
高性能健壯系統(tǒng)中的內(nèi)存管理_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、高性能健壯系統(tǒng)中的內(nèi)存管理 合理的內(nèi)存管理策略帶來 系統(tǒng)性能的提高 更高的運行速度 更小的內(nèi)存占用 穩(wěn)定的內(nèi)存使用量 讓系統(tǒng)更健壯 減少因系統(tǒng)設(shè)計規(guī)模的擴大而帶來的負(fù)作用 易于調(diào)試 減少編碼失誤率 控制 bug 的壞影響的范圍 讓系統(tǒng)可以長期不間斷的工作內(nèi)存是最難管理的資源 內(nèi)存作為一種資源,在應(yīng)用級和系統(tǒng)底層工作是兩種不同的模式。 應(yīng)用級:我們看到的是連續(xù)的虛擬地址空間 系統(tǒng)級:是分塊的內(nèi)存頁 內(nèi)存缺乏原子性、不能用簡單的引用記數(shù)方式管理。 在傳統(tǒng)軟件中、內(nèi)存碎片幾乎一定會產(chǎn)生。 從性能角度看,內(nèi)存并非像程序員們想象的那樣有一致性。 性能敏感的軟件或?qū)崟r系統(tǒng),內(nèi)存管理有更苛刻的要求。性能 無

2、論語言多高級,在你使用的語言層面總有事情可以做。 編譯器并非萬能 人有機會比優(yōu)化器做的更好深入RAM硬件底層 抽象與細(xì)節(jié)的矛盾 抽象是為了設(shè)計更大的系統(tǒng) 細(xì)節(jié)是為了更高性能的工作 CRTOS虛擬內(nèi)存地址物理內(nèi)存地址BIOS Cache儲存控制芯片DRAM DRAM 是晶體管和電容構(gòu)成的二維電路 Cache 使用 SRAM ,可以工作在更高頻率下 控制芯片以串行模式工作 RAM 性能的提高并非無差別的結(jié)論?沒有永遠(yuǎn)不變的原則 大原則變化的慢 沒有一勞永逸的解決方案內(nèi)存訪問很廉價但有代價 減少內(nèi)存訪問的次數(shù)是很有意義的隨機訪問內(nèi)存慢于順序訪問內(nèi)存 請讓數(shù)據(jù)物理上連續(xù)集中內(nèi)存訪問優(yōu)于分散訪問 盡可能

3、的將數(shù)據(jù)緊密的存放在一起無關(guān)性內(nèi)存訪問優(yōu)于相關(guān)性內(nèi)存訪問 請考慮并行的可能性、即使你的程序本身沒有使用并行機制控制周期性密集訪問的數(shù)據(jù)大小 必要時采用時間換空間的方法讀內(nèi)存快于寫內(nèi)存代碼也會占用內(nèi)存,所以、保持代碼的簡潔關(guān)于優(yōu)化的參考 X86 平臺,Agner Fog 是絕對的權(quán)威。 如何優(yōu)化 Pentium 微處理器 代碼優(yōu)化:有效使用內(nèi)存 深入理解計算機系統(tǒng)深入理解計算機系統(tǒng) 制定合理的內(nèi)存管理策略 了解你的系統(tǒng)如何使用內(nèi)存 系統(tǒng)中各種對象有怎樣的生命期? 峰值時系統(tǒng)需要多少內(nèi)存?這個值因何而變? 系統(tǒng)穩(wěn)定工作的時候,需要多少內(nèi)存?那些對象需要?哪些內(nèi)存需求是穩(wěn)定不變的,哪些是動態(tài)增減的?

4、 手工管理內(nèi)存和自動管理內(nèi)存(gc)都不是萬能的。 適當(dāng)?shù)臅r候引入 gc 或近似的機制不變的內(nèi)存需求 各施其責(zé)、讓操作系統(tǒng)幫助你更好的解決問題 只申請不(主動)釋放并非壞習(xí)慣 內(nèi)存塊不是原子對象,即使你還給了系統(tǒng),系統(tǒng)也未必可以利用它們 Bug 經(jīng)常出在程序退出時,可用戶在意它們嗎?你真的需要在意嗎? C+ 帶來的錯覺:令人困擾的單件生命期問題。 模塊化設(shè)計的問題 動態(tài)鏈接庫和獨立進程服務(wù)生命期可預(yù)期的內(nèi)存需求 內(nèi)存塊的生命期決定于一個特定對象或一個特定事件 Web server 中、大部分對象跟連接相關(guān) Game server 中、大部分對象跟獨立玩家相關(guān) 3d engine 中、大部分對象

5、跟 3d 實體相關(guān) 偶爾、復(fù)制好過引用 成批的分層次回收內(nèi)存有利于減少內(nèi)存碎片 把相關(guān)的數(shù)據(jù)結(jié)構(gòu)盡可能的物理上保持連續(xù) 不同層次的對象引用的內(nèi)存在設(shè)計上分離可再生的內(nèi)存數(shù)據(jù) 3d engine 中的資源管理 一切內(nèi)部資源加載后不再刪除其資源 handle 任何資源皆可再生(往往指從外存重新加載) 資源占用的內(nèi)存的回收和再利用和邏輯層無關(guān) 資源的預(yù)讀及并行化處理流程于主邏輯正交設(shè)計 顯存對象是不同類型的內(nèi)存數(shù)據(jù)、應(yīng)獨立管理臨時內(nèi)存 程序運行棧 用堆模擬一個棧 關(guān)于 C+ 的 auto_ptr 關(guān)于 C+ 的容器:vector list map 異常的處理: C+ 異常 longjmpString

6、 的管理 String 類有多重要? std:string ? CString ? boost:rope ? Copy on Write 是天使還是惡魔? 為什么不用 const char * ? 通常,我們只需要 raw pointer const char * 往往只是一個 handle ,一個可以比較和排序的 handle 忘了寬字節(jié)吧,UTF-8 可以解決大部分問題 沒有完美的 string 類,如果你認(rèn)為你設(shè)計出了一個,那么你一定忘掉了要用它做什么。垃圾收集(GC) C/C+ 需要 GC 嗎? 自動化內(nèi)存管理無處不在。 手工寫出了每一個 new/delete malloc/free 并不意味著你在手工管理 引用計數(shù)同樣是一種自動化管理 GUI 、3d 場景管理不可能離開自動化內(nèi)存管理 Mark-sweep GC 的優(yōu)勢 使用 gc 并不意味著偷懶,通常是因為良好的設(shè)計的需要 gc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論