作業系統的概念與功能
現代計算機系統由一個或多個處理器、主存、磁碟、印表機、鍵盤、滑鼠、顯示器、網路介面以及各種其他輸入/輸出裝置組成。
一般而言,現代計算機系統是一個複雜的系統。如果每位應用程式設計師都不得不掌握系統所有的細節,那就不可能再編寫程式碼了。而且,管理所有這些部件並加以優化使用,是一件挑戰性極強的工作。所以,計算機安裝了一層軟體,稱為作業系統,它的任務是為使用者程式提供一個更好、更簡單、更清晰的計算機模型,並管理剛才提到的所有這些裝置。
多數讀者都會對諸如Windows, Linux,或Mac OS等某個作業系統有些體驗,但表面現象會騙人的。使用者與之互動的程式,基於文字的通常稱為shell ,而基於圖示的則稱為圖形使用者介面(Graphical User Interface,GUI),它們實際上並不是作業系統的一部分,儘管這些程式使用作業系統來完成工作。
圖1-1給出了在這裡所討論主要部件的一個簡化檢視。圖的底部是硬體。硬體包括晶片、電路板、磁碟、鍵盤、顯示器以及類似的裝置。在硬體的頂部是軟體。多數計算機有兩種執行模式:核心態和使用者態。軟體中最基礎的部分是作業系統,它執行在核心態(也稱為管態、態下核心態)。在這個模式中,作業系統具有對所有硬體的完全訪問權,可以執行機器能夠執行的任何指令。軟體的其餘部分執行在使用者。在使用者態下,只使用了機器指令中的一個子集。特別地,特別地,那些會影響機器的控制或可進行IO(輸入/輸出)操作的指令,在使用者態的程式是禁止的。
使用者介面程式,shell或者GUI,處於使用者態程式中的最低層次,允許使用者執行其他程式,諸如Web瀏覽器、電子郵件閱讀器或音樂播放器等。這些程式也大量使用作業系統。
作業系統和普通軟體(使用者態)之間的主要區別是,如果使用者不喜歡某個特定的電子郵件閱讀器,他可以自由選擇另一個,或者選擇自己寫一個,但是他不能自行寫一個屬於作業系統一部分的時鐘中斷處理程式。這個程式由硬體保護,防止使用者試圖對其進行修改。
作業系統是一種執行在核心態的軟體。作業系統執行兩個墓本上獨立的任務,對上為應用程式提供一個資源集的清晰抽象,對下管理硬體資源。
抽象是管理複雜性的一個關鍵口好的抽象可以把一個幾乎不可能管理的任務劃分為兩個可管理的部分。其第一部分是有關抽象的定義和實現,第二部分是隨時用這些抽象解決問題。幾乎每個計算機使用者都理解的一個抽象是檔案。檔案是一種有效的資訊片段,諸如數碼照片、儲存的電子郵件資訊或Web頁面等。處理數碼照片、電子郵件以及Web頁面等。要比處理磁碟的細節容易,這些磁碟的具體細節實現十分複雜。作業系統的任務是建立好的抽象,並實現和管理它所建立的抽象物件。抽象是理解作業系統的關鍵。
硬體是醜陋的。真實的處理器、記憶體條、磁碟和其他裝置都是非常複雜的,對於那些為使用某個硬體而不得不編寫軟體的人們而言,他們使用的是困難、可怕、特殊和不一致的介面。有時這是由於需要相容舊的硬體,有時是為了節省成本,但是,有時硬體設計師們並沒有意識到(或在意)他們給軟體設計帶來了多大的麻煩。作業系統的一個主要任務是隱藏硬體,呈現給程式(以及程式設計師)良好、清晰、優雅、一致的抽象。如圖I-2所示,作業系統將醜陋轉變為美麗。
需要指出,作業系統的實際客戶是應用程式(當然是通過應用程式設計師)。它們直接與作業系統及其抽象打交道。或者是命令列shell或者是圖形介面。
現代作業系統允許同時執行多道程式。假設在一臺計算機上執行的三個程式試圖同時在同一臺印表機上輸出計算結果,那麼開始的幾行可能是程式1的輸出,接著幾行是程式2的輸出,然後又是程式3的輸出等,最終結果將是一團糟。採用將列印結果送到磁碟上緩衝區的方法,作業系統可以把潛在的混亂有序化。在一個程式結束後,作業系統可以將暫存在磁碟上的檔案送到印表機輸出,同時其他程式可以繼續產生更多的輸出結果,很明顯,這些程式的輸出還沒有真正送至印表機。
當一個計算機(或網路)有多個使用者時,管理和保護儲存器、I/O裝置以及其他資源的需求變得強烈起來,因為使用者間可能會互相干擾。另外,使用者通常不僅共享硬體,還要共享資訊(檔案、資料庫等)簡而言之,作業系統的這一種觀點認為,作業系統的主要任務是記錄哪個程式在使用什麼資源,對資源請求進行分配,評估使用代價,並且為不同的程式和使用者調解互相沖突的資源請求。
資源管理包括用以下兩種不同方式實現多路複用(共享)資源:在時間上覆用和在空間上覆用。當一種資源在時間上覆用時,不同的程式或使用者輪流使用它.先是第一個獲得資源的使用,然後下一個,以此類推。例如,若在系統中只有一個CPU,而多個程式需要在該CPU上執行,
CPU分配給某一個程式,在它執行了足夠長的時間之後,另一個程式得到CPU,然後是下一個,如此進行下去,最終,輪到第一個程式再次執行。至於資源是如何實現時間複用的—
--誰應該是下一個以及執行多長時間等—則是作業系統的任務。還有一個有關時間複用的例子是印表機的共享。當多個列印作業在一臺印表機上排隊等待列印時,必須決定將輪到列印的是哪個作業。
另一類複用是空間複用。每個客戶都得到資源的一部分,從而取代了客戶排隊。例如,通常在若干執行程式之間分割記憶體,這樣每一個執行程式都可同時入住記憶體(例如,為了輪流使用CPU ) 假設有足夠的記憶體可以存放多個程式,那麼在記憶體中同時存放若干個程式的效率,比把所有記憶體都分給一個程式的效率要高得多,特別是,如果一個程式只需要整個記憶體的一小部分時,結果更是這樣。當然。如此的做法會引起公平、保護等問題甲這有賴於作業系統解決它們。有關空間複用的其他資源還有磁碟。在許多系統,一個磁碟同時為許多使用者儲存檔案。分配磁碟空間並記錄誰正在使用哪個磁碟塊,是作業系統資源管理的典型任務。
作業系統的歷史
2.1 真空管與穿孔卡片(無作業系統)
第一代計算機的產生背景:
第一代之前人類是想用機械取代人力,第一代計算機的產生是計算機由機械時代進入電子時代的標誌
過程:
萬能程式設計師們將對應於程式和資料的已穿孔的紙帶(或卡片)裝入輸入機,然後啟動輸入機把程式和資料輸入計算機
記憶體,接著通過控制檯開關啟動程式針對資料執行;計算完畢,印表機輸出計算結果;使用者取走結果並卸下紙帶(或卡片)後,才讓下一個使用者上機。
注意點:
1 程式設計師需要在牆上的計時錶上預約時間
2 同一時刻只有一個程式在記憶體中被CPU呼叫執行(序列的)
優點:程式設計師在申請的時間段內獨享整個資源,即時的除錯自己的程式,如果有bug可以當場處理.
缺點:這對於計算機提供商來說是一種浪費(你買一臺電腦4000塊,那 一年中你用365比只用1天,肯定是省成本的,物盡其用)
2.2 電晶體和批處理系統
第二代計算機的產生背景:
由於當時的計算機非常昂貴,自認很自然的想辦法較少機時的浪費。通常採用的方法就是批處理系統。
特點:
有了作業系統的概念FORTRAN,這些機器現在被稱為大型機
工作過程:
第一代計算機的問題是:
人機互動太多了(人機互動過程:輸入-》計算-》輸出)
一個人的互動:輸入-》計算-》輸出
10個人的互動:
輸入-》計算-》輸出
輸入-》計算-》輸出
輸入-》計算-》輸出
第二代如何解決第一代的問題:
1.把一堆人的輸入攢成一大波輸入,
2.然後順序計算(這是有問題的,但是第二代計算沒有解決)
3.把一堆人的輸出攢成一大波輸出
現代作業系統的前身:
在收集了大約一個小時的批量作業之後,這些卡片被讀入磁帶,然後磁帶被送到機房裡並裝到磁帶上。然後磁帶被送到機房裡並裝到磁帶機上。隨後,操作員裝入一個特殊的程式(此乃現代作業系統的前身),它負責從磁帶上讀入第一個作業(job,一個或一組程式)並執行,其輸出寫到第二個磁帶上,而且不列印。每個作業結束後,作業系統自動的從磁帶上讀入下一個作業並且執行。當一整批的作業全部結束後,操作員去下輸入和輸出磁帶,講輸入磁帶換成下一批作業,並且把輸出磁帶拿到一臺1041機器上進行離線(不與主計算機聯機)列印
優點:批處理,節省了機時
缺點:
1.整個流程需要人蔘與控制,將磁帶搬來搬去(中間倆小人)
2.計算的過程仍然是順序計算-》序列
3.程式設計師原來獨享一段時間的計算機,現在必須被統一規劃到一批作業中,等待結果和重新除錯的過程都需要等同批次的其他程式都運作完才可以
2.3 積體電路晶片和多道程式設計
第三代計算機的產生背景:
20世紀60年代初期,大多數計算機廠商都有兩條完全不相容的生產線。一條是面向字的:大型的科學計算機,如IBM 7094,見上圖,主要用於科學計算和工程計算另外一條是面向字元的:商用計算機,如IBM 1401,見上圖,主要用於銀行和保險公司從事磁帶歸檔和列印服務
開發和維護完全不同的產品是昂貴的,同時不同的使用者對計算機的用途不同。IBM公司試圖通過引入system/360系列來同時滿足科學計算和商業計算,360系列低檔機與1401相當,高檔機比7094功能強很多,不同的效能賣不同的價格360是第一個採用了(小規模)晶片(積體電路)的主流機型,與採用電晶體的第二代計算機相比,價效比有了很大的提高。這些計算機的後代仍在大型的計算機中心裡使用,此乃現在伺服器的前身,這些伺服器每秒處理不小於千次的請求。
如何解決第二代計算機的問題1:
卡片被拿到機房後能夠很快的將作業從卡片讀入磁碟,於是任何時刻當一個作業結束時,作業系統就能將一個作業從磁帶讀出,裝進空出啦的記憶體區域執行,這種技術叫做同時的外部裝置聯機操作:SPOOLING,該技術同時用於輸出。當採用了這種技術後,就不在需要IBM1401機了,也不必將磁帶搬來搬去了(中間倆小人就失業了)
如何解決第二代計算機的問題2:
第三代計算機的作業系統廣泛應用了第二代計算機的作業系統沒有的關鍵技術:多道技術
多道技術:
多道技術中的多道指的是多個程式,多道技術的實現是為了解決多個程式競爭或者說共享同一個資源(比如cpu)的有序排程問題,解決方式即多路複用,多路複用分為時間上的複用和空間上的複用。
空間上的複用:將記憶體分為幾部分,每個部分放入一個程式,這樣,同一時間記憶體中就有了多道程式。
時間上的複用:當一個程式在等待I/O時,另一個程式可以使用cpu,如果記憶體中可以同時存放足夠多的作業,則cpu的利用率可以接近100%。
空間上的複用最大的問題是:程式直接的記憶體必須分割,這種分割在硬體層面實現,由作業系統控制實現。如果記憶體彼此不分割,則一個程式可以訪問另外一個程式的記憶體,首先喪失的是安全性,比如你的qq程式可以訪問作業系統的記憶體,這意味著你的qq可以拿到作業系統的所有許可權。
其次喪失的是穩定性,某個程式崩潰時有可能把別人的記憶體也給回收了,比方說把作業系統的記憶體給回收了,則作業系統崩潰。
第三代計算機的作業系統仍然是批處理,許多程式設計師懷念第一代獨享的計算機,可以即時除錯自己的程式。為了滿足程式設計師們很快可以得到響應,出現了分時作業系統
如何解決第二代計算機的問題3:
分時作業系統:
多個聯機終端+多道技術
20個客戶端同時載入到記憶體,有17在思考,3個在執行,cpu就採用多道的方式處理記憶體中的這3個程式,由於客戶提交的一般都是簡短的指令而且很少有耗時長的,索引計算機能夠為許多使用者提供快速的互動式服務,所有的使用者都以為自己獨享了計算機資源
CTTS:麻省理工相容分時系統,知道第三代計算機廣泛採用了必須的保護硬體(程式之間的記憶體彼此隔離)之後,分時系統才開始流行
MIT,貝爾實驗室和通用電氣在CTTS成功研製後決定開發能夠同時支援上百終端的MULTICS(其設計者著眼於建造滿足波士頓地區所有使用者計算需求的一臺機器),很明顯真是要上天啊,最後摔死了。
後來一位參加過MULTICS研製的貝爾實驗室電腦科學家Ken Thompson開發了一個簡易的,單使用者版本的MULTICS,這就是後來的UNIX系統。基於它衍生了很多其他的Unix版本,為了使程式能在任何版本的unix上執行,IEEE提出了一個unix標準,即posix(可移植的作業系統呼叫介面標準)
後來出現了minix,芬蘭學生Linus Torvalds基於它編寫了Linux
第四代計算機(1980~至今):個人計算機
隨著大規模積體電路的發展,每平方釐米的矽片晶片上可以整合數千個電晶體,個人計算機的時代就此到來。