注:本文多數內容來自對What Every Programmer Should Know About Memory一文的理解和翻譯。但這不是一篇嚴格的譯文,只摘取我讀了有心得的部分,並盡量加上自己的理解和自己收集的資料。
開篇
早期計算機系統的架構要比現在的簡單多了,CPU、內存、外存、網卡等幾個重要部件一組合就成了鼎鼎大名的計算機。每個部件自身結構相對簡單,各部件的工作能力也旗鼓相當,它們按照馮諾依曼體系結構協調工作在一起,十分協調融洽。說是早期,其實計算機技術的發展日新月異,也就是幾十年前吧。
計算機系統的幾大部件都凝聚了工程師的心血,並有很多優秀的工程師一直工作在優化這些部件上。很快,各個部件的工作能力就出現了差距,其中尤以內存和外存為甚,受限於價格的因素,內存外存的工作能力被CPU遠遠的落在了后面。這樣一來,計算及系統就存在短板效應,CPU空有飛速的計算速度,卻不能帶動整個計算機系統的工作能力。
外存瓶頸的解決,多是通過軟件技術來做緩存。
- 操作系統實現了針對外存的緩存,保存經常讀寫的數據在內存中;
- 存儲系統也被內置到外存設備中,比如磁盤控制器中,這樣即便沒有操作系統緩存存在的情況下,也能提升整體性能。
遺憾的是,內存存取瓶頸的解決,要比外存瓶頸的解決難得多,並且幾乎所有的解決方案,都需要改動硬件。這些為改善內存瓶頸而對硬件的改動,主要包含以下幾種:
- 內存的硬件結構設計(體現在速度和並發上);
- 內存控制器的設計;
- CPU緩存;
- 設備直接內存訪問(DMA)。
后續內容預告
- 每個程序員都應該了解的內存知識(RAM篇)介紹隨機訪問內存(RAM)的技術細節;
- 每個程序員都應該了解的內存知識(CPU Cache篇)介紹CPU緩存的相關技術;
- 每個程序員都應該了解的內存知識(Virtual Memory篇)介紹虛擬內存技術;
- 每個程序員都應該了解的內存知識(NUMA篇)介紹非統一內存訪問架構;
- 每個程序員都應該了解的內存知識(編程篇)介紹如何利用內存知識來優化自己的程序;
- 每個程序員都應該了解的內存知識(工具篇)介紹幾個可以用來輔助分析程序內存使用的工具;