現代計算機系統由乙個或多個處理器、主存、磁碟、印表機、鍵盤、滑鼠、顯示器、網路介面以及各種其他輸入/輸出裝置組成。一般而言,現代計算機系統是乙個複雜的系統。如果每位應用程式設計師都不得不掌握系統的所有細節,那就不可能再編寫**了。而且,管理這些部件並加以優化使用,是一件挑戰性極強的工作。所以,計算機安裝了一層軟體,稱為作業系統,它的任務是為使用者程式提供乙個更好、更簡單、更清晰的計算機模型,並管理剛才提到的所有裝置。
使用者與作業系統互動的程式,基於文字的通常稱為shell,而基於圖示的則稱為圖形使用者介面(gui),它們實際上並不是作業系統的一部分,儘管這些程式使用作業系統來完成工作。
下圖給出了這裡所討論的主要部件的乙個簡化檢視。圖的底部是硬體。硬體包括晶元、電路板、磁碟、鍵盤、顯示器以及類似的裝置。在硬體的頂部是軟體。多數計算機有兩種執行模式:核心態和使用者態。軟體中最基礎的部分是作業系統,它執行在核心態(也稱為管態,核心態)。在這個模式中,作業系統具有對所有硬體的完全訪問權,可以執行機器能夠執行的任何指令。軟體的其餘部分執行在使用者態下。 在使用者態下,只使用了機器指令中的乙個子集。特別地,那些會影響機器的控制或可進行i/o操作的指令,在使用者台中的程式裡是禁止的。在本書中,我們會不斷討論核心態和使用者態之間的差別,這些差別在作業系統的執行中扮演著極其重要的角色。
作為擴充套件機器的作業系統
作為資源管理者的作業系統
第一代:真空管和穿孔卡片(1945-1955)
第二代:電晶體和批處理系統(1955-1965)
第三代:積體電路和多道程式設計(1965-1980)
***:個人計算機(1980至今)
第五代:移動計算機(1990至今)
從概念上講,一台簡單的個人計算機可以抽象成類似於下圖的模型。cpu、記憶體以及i/o裝置都由一條系統匯流排連線起來並通過匯流排與其他裝置通訊。
計算機的「大腦」是cpu,它從記憶體中取出指令並執行之。在每個cpu基本週期中,首先從記憶體中取出指令,解碼以確定其型別和運算元,接著執行之,然後取指、解碼並執行下一條指令。按照這一方式,程式被執行完成。
每個cpu都有一套可執行的專門指令集。所以,x86處理器不能執行arm程式,而arm處理器也不能執行x86程式。由於用來訪問記憶體以得到指令或資料的時間要比執行指令花費的時間長得多,因此,所有的cpu內都會有一些用來儲存關鍵變數和臨時資料的暫存器。這樣,通常在指令集中提供一些指令,用以講乙個字從記憶體調入暫存器,以及將乙個字從暫存器存入記憶體。其他的指令可以把來自暫存器、記憶體的運算元組合,或者用兩者產生乙個結果,如將兩個字相加並把結果存在暫存器或記憶體中。
除了用來儲存變數和臨時結果的通用暫存器外,多數計算機還有一些對程式設計師可見的專用暫存器。其中之一是程式暫存器,它儲存了將要取出的下一條指令的記憶體位址。在指令取出之後,程式計數器就被更新以便指向後繼的指令。
另乙個暫存器是堆疊指標,它指向記憶體中當前棧的頂端。該棧包含了每個執行過程的棧幀。乙個過程的棧幀儲存了有關的輸入引數、區域性變數以及那些沒有儲存在暫存器中的臨時變數。
當然還有程式狀態字(program status word,psw) 暫存器。這個暫存器包含了條件碼位(由比較指令設定)、cpu優先順序、模式(使用者態或核心態),以及各種其他控制位。使用者程式通常讀入整個psw,但是,只對其中的少量字段寫入。在系統呼叫和i/o中,psw的作用很重要。
作業系統必須知曉所有的暫存器。在時間多路復用(time multiplexing)cpu中,作業系統經常會中止正在執行的某個程式並啟動(或再啟動)另乙個程式。每次停止乙個運營著的程式時,作業系統必須儲存所有的暫存器值,這樣在稍後該程式被再次執行時,可以把這些暫存器重新裝入。
為了改善效能,cpu設計師早就放棄了同時讀取、解碼和執行一條指令的簡單模型。許多現代cpu具有同時取出多條指令的機制。例如,乙個cpu可以有單獨的取指單元、解碼單元和執行單元,於是當它執行指令n時,還可以對指令n+1解碼,並且讀取指令n+2. 這樣的機制稱為流水線(pipeline) ,下圖a是乙個有著三個階段的流水線示意圖。更長的流水線也是常見的。
在多數的流水線設計中,一旦一條指令被取進流水線中,它就必須被執行完畢,即便前一條取出的指令是條件轉移,它也必須被執行完畢。
比流水線更先進的設計是超標量cpu,如圖b所示。在這種設計中,有多個執行單元,例如,乙個cpu用於整數算數運算,乙個cpu用於浮點算術運算,乙個cpu用於布林運算。兩個或更多的指令被同時取出、解碼並裝入暫存緩衝區中,直至它們執行完畢。只要有乙個執行單元空閒,就檢查保持緩衝區中是否還有可處理的指令,如果有,就把指令從緩衝區中移出並執行之。這種設計存在一種隱含的作用,即程式的指令經常不按順序執行。在多數情況下,硬體負責保證這種運算的結果與順序執行指令時的結果相同,但是,仍然有部分令人煩惱的複雜情形被強加給作業系統處理,我們會在後面討論這種情況。
除了用在嵌入式系統中的非常簡單的cpu之外,多數cpu都有兩種模式,即前面提到的核心態和使用者態。通常,在psw中有乙個二進位制位控制這兩種模式。當在核心態執行時,cpu可以執行指令集中的每一條指令,並且使用硬體的每種功能。在台式電腦和伺服器上,作業系統在核心態下執行,從而可以訪問整個硬體。而在大多數嵌入式系統中,一部分作業系統執行在核心態,其餘的部分則執行在使用者態。
相反,使用者程式在使用者態下執行,僅允許執行整個指令集的乙個子集和訪問所有功能的乙個子集。一般而言,在使用者態中有關i/o和記憶體保護的所有指令是禁止的。當然,將psw中的模式位設定成核心態也是禁止的。
為了從作業系統中獲得服務,使用者程式必須使用系統呼叫(system call) 以陷入核心並呼叫作業系統。trap
指令把使用者態切換成核心態,並啟用作業系統。當有關工作完成之後,在系統呼叫後面的指令把控制權返回給使用者程式。到目前為止,請讀者把它看成乙個特別的過程呼叫指令,該指令具有從使用者態切換到核心態的特別能力。
有必要指出的是,計算機使用陷阱而不是一條指令來執行系統呼叫。其他的多數陷阱是由硬體引起的,用於警告有異常情況發生,如試圖被零除或浮點下溢等。在所有的情況下,作業系統都得到控制權並決定如何處理異常情況。有時,由於出錯的原因,程式不得不停止。在其他情況下可以忽略出錯(如下溢數可以被置為零)。
多執行緒和多核晶元
moore定律指出,晶元中電晶體的數量每18個月翻一番。moore定律已經保持了30年,有希望至少再保持10年。在那以後,每個電晶體中原子的數目會變得太少,並且量子力學將扮演重要角色,這將阻止電晶體尺寸的進一步縮小。
使用大量的電晶體引發了乙個問題:如何處理它們呢? 這裡我們可以看到一種處理方式:具有多個功能部件的超標量體系結構。 但是,隨著電晶體數量的增加,再多電晶體也是可能的。乙個由此而來的必然結果是,在cpu晶元中加入了更大的快取,人們肯定會這麼做,然而,原先獲得的有用效果將最終消失。
顯然,下一步不僅是由多個功能部件,某些控制邏輯也會出現多個。 intel pentium 4 引入了被稱為==多執行緒(multithreading)或超執行緒(hyperthreading)==的特性。近似地說,多執行緒允許cpu保持兩個不同的執行緒狀態,然後在納秒級的時間尺度內來回切換。(執行緒是乙個輕量級程序,即乙個執行中的程式。將在第2中討論。)例如,如果某個程序需要從記憶體中讀出乙個字(需要花費多個時鐘週期),多執行緒cpu則可以切換至另乙個執行緒。多執行緒不提供真正的並行處理。在乙個時刻只有乙個程序在執行,但是執行緒的切換時間則減少到納秒數量級。
大型機作業系統
伺服器作業系統
多處理器作業系統
個人計算機作業系統
掌上計算機作業系統
嵌入式作業系統
感測器節點作業系統
實時作業系統
智慧卡作業系統
程序位址空間
檔案輸入/輸出
保護shell
個體重複系統發育
用於程序管理的系統呼叫
用於檔案管理的系統呼叫
用於目標管理的系統呼叫
各種系統呼叫
windows win32 api
單體系統
層次式系統
微核心客戶端-伺服器模式
虛擬機器外核
c語言標頭檔案
大型程式設計專案
執行模型
讀書筆記 現代作業系統
ch1.1.作業系統中,抽象非常重要,乙個複雜的任務可以抽象成多個簡單的子任務,將複雜的硬體抽象成簡單的介面,書中針對向上層應用提供的介面做詳細的講解,但是對於使用者 終端使用者 介面不會做研究.2.作業系統中的資源有時間資源和空間資源,以及硬碟的空間資源,時間資源是時間復用的 如cpu的輪轉 空間...
現代作業系統 引論
1,作業系統對資源的管理主要有時間復用和空間復用兩種方式 時間復用舉例 每個程序在指定時間段內使用cpu 空間復用舉例 記憶體空間多個程序之間共享 2,虛擬記憶體機制使得程式需要的記憶體大於物理記憶體成為可能,其方法是把程式存放在磁碟上,把記憶體當做快取,用來儲存最頻繁 使用的部分程式,這種機制需要...
《現代作業系統》讀書筆記 執行緒
執行緒是最小的任務排程單位,是依賴於程序而存在的迷你程序。和程序一樣,執行緒也有三種狀態 執行 就緒 阻塞。我認為,執行緒是程序中任務真正的執行者,而程序提供了記憶體空間 cpu 程式計數器以及暫存器讓執行緒使用。對於程序來說,多個程序之間無法分享記憶體空間,對於一些應用而言,共享記憶體空間的能力是...