跳轉到內容

作業系統設計/儲存演變:定址方案

來自華夏公益教科書,開放的書籍,開放的世界

儲存:定址方案

[編輯 | 編輯原始碼]

儲存系統的容量和配置一直影響著可安裝作業系統的性質。一些早期的監控系統必須將自己放置在極小的記憶體中,併為其他程式留出空間。重要的是要認識到,例如關於可以使用卡片安全構建的程式大小的假設,限制了計算機的大小,直到多道程式設計和分時系統改變了規則。

記憶體庫

[編輯 | 編輯原始碼]

最初,記憶體是建立在框架上的,並組織成由多個記憶體框架組成的長“庫”。從那時起,任何線性的記憶體體系結構都被稱為記憶體庫。

記憶體陣列

[編輯 | 編輯原始碼]

隨著記憶體越來越大,增加了更多的庫,建立了二維排列,稱為記憶體陣列。後來,技術將這些二維結構縮小到可以安裝在矽晶片上的小型電路中。

記憶體模組

[編輯 | 編輯原始碼]

如今,我們擁有二維記憶體排列,其中每個庫都是一個記憶體模組,它包含多個晶片,這些晶片構建在小型印刷電路板上,將它們組織成特定的記憶體[檢查拼寫] 體系結構,例如 DDR2 DIMMS of SDRAM。如今的記憶體陣列往往在主機板上儲存千兆位元組的資料。

記憶體快取

[編輯 | 編輯原始碼]

儘管現代記憶體晶片速度很快,比歷史上任何時候都快,但微處理器的晶片速度增長更快,並且一直受到主記憶體晶片速度的限制。為了讓處理器更高效地執行,構建了稱為快取的更快的靜態 RAM 區域,這些區域可以以處理器的全速為處理器提供服務。現代計算機在 CPU 中內建了兩個這樣的快取,因此即使主記憶體的頻率通常仍然以兆赫茲為單位,CPU 也可以在多千兆赫茲範圍內執行。

其理念是,大部分程序都儲存在單個記憶體頁面中,並且可以使用本地跳轉進行定址。因此,我們將幾個記憶體頁面儲存在快取中,處理器在它們之間來回切換,同時執行程式。這意味著只要我們不需要遠呼叫,我們的處理就會保留在快取中。但是,一旦我們需要遠呼叫,就會產生快取未命中,並且我們必須在從較慢的下一級記憶體載入快取之前暫停處理。最終,我們從主記憶體載入記憶體,並將其傳播回頂級快取,在那裡程式可以再次執行一段時間,而無需再次降低到較低的記憶體速度。

定址的長短

[編輯 | 編輯原始碼]

在大多數現代機器語言中,有兩種型別的獲取操作:近呼叫和遠呼叫。正如我們所見,大部分程式設計都是這樣完成的,即記憶體可以儲存在頁面叢集中,並且可以預測,以便記憶體獲取可以在實際需要特定記憶體頁面之前開始。只要獲取可以在需要頁面之前很久開始,頁面就可以準備好使用,而不會出現明顯的等待快取未命中處理。現代最佳化編譯器可以預測這種預載入的需要並將其構建到程式中,以便快取始終預測對新頁面的需求。問題出現在我們需要對屬於另一個程式或部分(例如作業系統)的例程進行遠呼叫時。由於它是在另一個時間編譯的,因此編譯器除了預測您需要更改頁面之外,無法預測任何內容,因此它必須在開始處理新記憶體部分之前才能預測哪些頁面需要預載入。這是機器語言對近跳轉和遠跳轉使用不同調用的原因之一。當然,另一個原因是近跳轉不需要完整地址來訪問記憶體,而遠跳轉則需要。

記憶體頁和交換檔案

[編輯 | 編輯原始碼]

就像處理器預先獲取記憶體頁面以載入到快取中一樣,已經開發了一種類似的體系結構,允許將大型程式大部分保留在輔助儲存裝置上,並根據需要按頁面載入。涉及的機制稱為交換檔案或虛擬記憶體裝置。它包括一個記憶體框架來容納活動頁面,以及一個輔助儲存裝置上的檔案來儲存實際程式。根據需要,頁面將從交換檔案移動到主記憶體框架,在那裡它們可以被快取訪問。如果沒有一個稱為記憶體管理器的程式或裝置將絕對地址對映到虛擬記憶體框架地址,這將造成混淆。

為了使這種型別的定址實用,記憶體系統被組織成基於頁面的結構,記憶體很少以小於頁面獲取的精度進行訪問。一旦建立了這種體系結構,載入頁面並將其交換到磁碟就變得相對容易,從處理器的角度來看,主記憶體只是輔助儲存裝置的快取。

記憶體分割槽和記憶體虛擬化

[編輯 | 編輯原始碼]

直到第三代作業系統,才需要將記憶體的大部分割槽域留出來,以便在多道程式設計或分時系統體系結構中處理不同的使用者或不同的應用程式。一種方法是在 80X86 系列(從 286 開始)的體系結構中展示的。透過建立特殊的分割槽暫存器並將分割槽地址與基地址暫存器邏輯地組合,即使是同一個程式的訪問相同基地址的不同版本也可以透過簡單地更改分割槽暫存器中的分割槽地址來隔離。透過將特定分割槽與特定程序關聯,可以建立彼此隔離的虛擬記憶體區域。

CP 作業系統是為了利用這種能力而編寫的,它為自己的每個克隆分配一個分割槽來執行。因此,CP 既是第一個虛擬機器,也是第一個能夠隔離不同功能或為每個使用者提供其自身虛擬機器的多處理系統之一。這使得批處理系統能夠擺脫 1401 前端和後端處理器,並在主記憶體的不同分割槽中執行其軟體。正是這個程式的相對成功,引發了 360 系列計算機和 OS360 的開發,後者是執行這些計算機的作業系統。

直接訪問硬體

[編輯 | 編輯原始碼]

計算機需要時間來處理資料密集型程序。然而,當一個程式想要執行資料密集型程序時,作業系統本身的開銷可能是影響資料處理量的因素。這在 HCI 中最為明顯,因為使用者是處理迴圈的一部分。開銷至關重要的地方的一個很好的例子是動畫圖形。如果作業系統將螢幕更新的優先順序低於同時執行的其他程序,則螢幕更新可能會被顯著延遲。例如,如果你正在觀看一部電影,這會導致電影畫面卡頓,並會在奇怪的時間停頓,打破聲音和影片之間的聯絡。另一個對時間要求很高的方面是聲音本身,因為卡頓的聲音幾乎不可能轉換為語音。

這裡我們遇到了一個問題:在一個單執行緒、單使用者系統中,允許程序接管處理控制權,並直接寫入物理硬體,而無需經過系統呼叫介面是可行的。然而,在一個多程式設計或分時系統中,這樣做會降低其他人或其他程式對計算機的使用效率,因為當該程式直接控制時,其他程序無法執行。

此外,允許直接訪問硬體還有一個負面影響,那就是所有安全機制都被繞過,惡意程式可以實際接管計算機,建立帳戶或複製資料,同時表面上顯示一部電影。

由於這後兩個因素,直接訪問硬體存在爭議,在設計作業系統時必須仔細考慮。作業系統為程式提供了哪些選擇?它是在沙箱中執行,還是可以隨意修改記憶體和輔助儲存?任何使計算機更安全的操作,都會降低動畫的質量,而任何提高動畫質量的操作,都會降低其他程式和其他使用者的服務質量。

就我個人而言,我記得我發現我的 TRS-80 袖珍電腦沒有實現 peek 或 poke 命令(Basic 的直接訪問命令),因此我無法用機器語言對其進行程式設計。正是在那個時候,我放棄了用袖珍電腦製作東西的計劃,開始考慮購買更強大的玩具。

擴充套件記憶體

[編輯 | 編輯原始碼]

由於英特爾作為晶片製造商設計了 80286 來與 8086 向後相容,並希望保持與 DOS 的相容性,因此出現了一個有趣的問題。問題是 DOS 是基於一個將記憶體限制為 640K(千位元組)的架構構建的,而 286 具有擴充套件記憶體,可以訪問更大的地址空間。為了訪問這部分記憶體,作業系統必須處理 640 KB 和 1 MB 之間的空間地址已被 ROM 使用的事實。透過允許 ROM 停留在第一個 1 MB 空間內,晶片製造商實際上建立了兩個具有間隔的 RAM 記憶體空間:第一個 640 KB 的常規記憶體和從 1 MB 開始的擴充套件記憶體。

程式必須要麼意識到這個間隔並跨越它載入,要麼必須被分成模組,並將一個模組載入到一個記憶體空間,另一個模組載入到另一個記憶體空間。Windows 可以做到這一點,因為它有一個記憶體管理器,但很少有 DOS 程式如此複雜,因此 DOS 程式往往侷限於前 640 KB。正是由於 Windows 允許使用更大的電子表格,286 和 Windows 比 8086/8 版本的 Dos 機器更受歡迎。

最終,到 80386 出現時,Dos 開發了自己的記憶體管理器,成為一個擴充套件作業系統,但在 286 時代,它被限制在最底部的 640 KB 記憶體中。

增強記憶體

[編輯 | 編輯原始碼]

一些主機板製造商對基於 286 的計算機中記憶體定址的不一致感到困擾,因此設計了一種新的記憶體對映,稱為增強記憶體,它允許他們透過在 BIOS 載入後進行銀行切換 ROM 來填補兩個記憶體空間之間的間隔。這種架構已經成為標準,現在作業系統不必再處理由於將 ROM 保留在第一個 1 MB 地址範圍內而導致的不一致。然而,DOS 已從 Windows 中消失,現在只是一個由命令列模式中使用的命令語言語法保留的記憶體。

華夏公益教科書