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