第一章:內(nèi)存管理機(jī)制
第一節(jié):機(jī)制與策略
內(nèi)存的訪問和操作涉及了大量分門別類的內(nèi)容。必須施以措施保證訪問有效內(nèi)存,并對應(yīng)正確的實(shí)際物理存儲器。如果在內(nèi)存保護(hù)模式下,處理器還應(yīng)當(dāng)負(fù)責(zé)確保執(zhí)行中的任務(wù)不去訪問禁止訪問的內(nèi)存。多任務(wù)操作系統(tǒng)就是基于內(nèi)存保護(hù)服務(wù)構(gòu)建的系統(tǒng)。如果使用了虛擬內(nèi)存,系統(tǒng)會維護(hù)一個重要的內(nèi)存信息記錄,用以追蹤記錄任務(wù)所屬的硬盤扇區(qū)(譯注:即是虛擬內(nèi)存)它比你想象的要復(fù)雜得多,并且每個環(huán)節(jié)都要求萬無一失。
注解:在 Intel平臺上,如果內(nèi)存子系統(tǒng)設(shè)置了錯誤的數(shù)據(jù)結(jié)構(gòu),處理器將其作為所謂的(triple fault)三次錯誤來處理。所謂Intel平臺上的(double fault)二次錯誤是指當(dāng)處理器去處理已發(fā)生的異常錯誤時再次發(fā)生了異常錯誤。當(dāng)(double fault)二級錯誤處理失敗,三級錯誤產(chǎn)生,系統(tǒng)置入停機(jī)過程狀態(tài)。一般說來,Intel系統(tǒng)如果發(fā)生這種類型的錯誤,會重啟系統(tǒng)。
為了保證執(zhí)行速度,處理器廠商在芯片內(nèi)部賦予了高級內(nèi)存管理的能力。這使操作系統(tǒng)商得以將大量,單調(diào)乏味,冗余的內(nèi)存管理工作交由處理器去完成,處理器內(nèi)部可以以更快的速度處理各種錯誤校驗(yàn)。但是這同樣也產(chǎn)生了操作系統(tǒng)商在一定程度上限定于特定的硬件平臺的副作用。
為提升了性能,盡管失去了移植性,但是仍然是很值得的。如果操作系統(tǒng)完全去擔(dān)當(dāng)實(shí)現(xiàn)了比如分頁,分段處理功能的責(zé)任,很明顯那會比得益于從處理器內(nèi)建(內(nèi)存管理)功能的那種方案要慢得多。想象如果真要在那種有操作系統(tǒng)實(shí)現(xiàn)的內(nèi)存保護(hù)模式的操作系統(tǒng)上,玩類似Quake3那樣密集圖形的實(shí)時游戲,游戲根本沒法玩。
注解:你或許會問,我是否能提供一個測定的數(shù)值說明操作系統(tǒng)到底會變得多慢。我承認(rèn)我給出了一些揮舞胳膊(arm-waving)的結(jié)論。根據(jù)1993年Wahbe.Lucoo.et al(請參見“引用”章節(jié))的一篇論文指出。他們使用了一種稱為“沙盒”(sandboxing)的技術(shù),將應(yīng)用程序中的代碼模塊分離隔離起來。使用該技術(shù)以后,帶來了4%的執(zhí)行速度的提升。你能夠想象要添加虛擬內(nèi)存技術(shù)以及權(quán)限訪問方案的這樣一個龐大的結(jié)構(gòu),將會給你帶來什么。
題外話
揮舞胳膊(arm-waving)的結(jié)論,是一種沒有經(jīng)過嚴(yán)謹(jǐn)數(shù)學(xué)表達(dá)方式求證過的一般建議。數(shù)學(xué)表達(dá)方式的好處是可以對完全含糊不清的事物做出定論:結(jié)論只有是或者否。對于揮舞胳膊(arm-waving)的結(jié)論來說趨向于避開十分嚴(yán)格的邏輯推理更偏向于借助直覺作為判別依據(jù)。這樣推理是最值得懷疑的,不僅因?yàn)橹庇X常常是錯誤的,同樣也因?yàn)橐罁?jù)直覺的判別是模棱兩可的。例如,爭論世界是否是平的人趨向于依賴揮舞胳膊(arm-waving)方式的結(jié)論。
注解:當(dāng)初Dave Cutle在創(chuàng)造Windows NT時,大部分的注意力都集中在操作系統(tǒng)的硬件抽象層(HAL)上。該想法指操作系統(tǒng)盡可能的和硬件分離,該獨(dú)立的代碼層位于底層硬件。通過這樣的設(shè)計有助于解決我在幾分鐘前提到的硬件依賴的問題。NT平臺真的可以運(yùn)行在兩類面向UNIX的硬件平臺之上了,Dave也因此功成名就。這其中包括 Digital的 Alpha處理器和MPS RISC的處理器。問題是微軟公司無法在硬件平臺上施展他們的一些高層的技術(shù),如DCOM技術(shù)不能在Intel以外的硬件平臺上運(yùn)行,對于基于二進(jìn)制標(biāo)準(zhǔn)的對象技術(shù)來說這樣的情況更加頻繁出現(xiàn)。
勝利總是屬于偏好運(yùn)行速度的解決方案。一位前任Control Data工程師告訴我,當(dāng)Seymour Cray 在研發(fā)6600時,他碰巧得到一塊比他當(dāng)時使用的更快的一種芯片。可是該芯片總是出現(xiàn)意想不到的運(yùn)算錯誤。Seymour 為該芯片搭建了一系列精巧的運(yùn)行環(huán)境。公司執(zhí)行高管們沒有反對Seymour的做法,不想打擾這位作為大概是數(shù)據(jù)控制中心最有價值的技術(shù)非凡的工程師。不幸的是,他們的倉庫里堆積了滿滿的最初的那種老芯片。不能夠丟棄掉那些老芯片,必須設(shè)法都用上他們,于是誕生了CDC300,一個比6600運(yùn)行速度慢并且廉價的產(chǎn)品。
我的觀點(diǎn):Seymour 眷顧更快的芯片,即使它們不是那么穩(wěn)定。
速度原則:
追求速度的趨勢結(jié)果使得現(xiàn)有的商業(yè)操作系統(tǒng)都具備自己的內(nèi)存管理服務(wù)并深深植根于硬件所規(guī)定的數(shù)據(jù)結(jié)構(gòu)和協(xié)議標(biāo)準(zhǔn)。處理器提供基本的內(nèi)存管理功能集。這些功能保證功能機(jī)制設(shè)置的平衡。它取決于操作系統(tǒng)是否決定使用處理的內(nèi)存管理機(jī)制。如果是,則使用處理器的內(nèi)存管理。操作系統(tǒng)創(chuàng)建這樣的策略來權(quán)衡和控制內(nèi)存管理機(jī)制。
下一章節(jié),我會從硬件的角度來解釋,硬件如何提供內(nèi)存訪問和控制的機(jī)制。

Memory Management:Alogorithms and Implementation in C/C++
by Bill Blunden
Wordware Publishing © 2003 (360 pages)
This book presents several concrete implementations
of garbage collection and explicit memory management algorithms.
原書下載 地址