天天看點

作業系統概述(os 筆記一)

作業系統概述

作業系統的目标和功能

1、目标:作為使用者/計算機接口

​ 計算機的使用人群大緻可以分為三類,終端使用者,程式開發者,作業系統設計人員。

對于終端使用者,即應用程式的使用者來說,他們通常不關注計算機程式的組成和計算機的硬體細節,是以在終端使用者看來,計算機系統是一組應用程式的組合。終端使用者需要學習的隻是各種應用程式的使用。

對于程式開發者來說,計算機系統是由各種程式設計語言和系統調用接口組成。程式開發者可以選擇一種程式設計語言去開發應用程式。而應用程式的執行脫離不了硬體的支援,如果程式開發者在開發應用時還需要考慮硬體的操作,控制細節,那麼對于他們來說開發應用程式無疑是一件極為複雜的工作,而且效率也很低下。為了簡化這種開發的難度,需要提供一些系統程式來實作對硬體的操作如 I/O 裝置操作,檔案管理等。作業系統正是這類程式,它為程式開發者提供了一系列的系統調用接口,向程式開發者屏蔽了硬體的細節,使他們更加容易的使用這些功能和服務。

而對于作業系統設計人員,計算機系統是一個複雜的監控,管理類的程式,計算機系統的主要目标是作為程式開發者和硬體實作之間的中間層。向上為程式開發者提供易用的系統調用接口,向下通過低級語言實作對底層硬體的操作和控制。

2、目标:作為資料總管

​ 一台計算機就是一組(硬體)資源,這些資源用于對資料的移動、儲存、和處理,以及對這些功能的控制。作業系統負責管理這些資源(對硬體的操控)。通常我們把具有控制能力的作業系統想象成在被控制對象(應用程式)之外或者至少與被控制對象有一些差别和距離。但是事實卻不然。實際的情況是,

作業系統與普通的計算機軟體相同,他也是由處理器執行的一段程式或一組程式。

作業系統也是一段可以被處理器執行的指令序列,它與應用程式的主要差別是二者的意圖不同。作業系統控制處理器使用其他系統資源,并控制其他程式的執行時機。是以作業系統經常會釋放控制,而且必須依賴處理器才能恢複控制(之後進一步讨論如何釋放和恢複)。

3、功能

​ 簡要的說,作業系統通常提供了一下幾個方面的服務和功能:

  • 程式開發:作業系統提供各種各樣的工具比如 編譯器,編輯器 和 調試器等,用于幫助程式員開發程式。
  • 程式運作:運作一個程式需要很多步驟,包括必須把 指令 和 資料 加載到記憶體、初始化 I/O 裝置和檔案,準備一些資源,作業系統負責這些工作。(沒有作業系統時這些都需要程式員來實作)
  • 檔案的通路和控制
  • 系統通路:對共享資源和授權資源的通路控制,同時還必須解決資源競争時的沖突問題。
  • 錯誤檢測和響應:計算機系統運作時可能發生各種錯誤,包括硬體錯誤,軟體錯誤。對于每種錯誤作業系統必須能對每種錯誤提供響應并清除錯誤條件,使其對正在運作的程式的影響降到最小。響應可以是終止引起錯誤的的程式、重試操作或簡單的給應用程式報告錯誤資訊。
  • 記賬:統計收集對各種資源的使用資訊。用于預測和優化性能。

作業系統的發展

1、串行處理

​ 對于早期沒有作業系統的計算機,程式員都是直接和硬體打交道,程式的輸入使用編有機器碼的打孔的紙帶,輸出通過控制台的訓示燈和列印機顯示。在這個時期,現在的作業系統是以人工的形式進行的。當我們要運作一個程式,首先需要估計程式将要運作的時間,然後在計算機裝置上的一個硬拷貝的登記表預定機器時間,這個時間一旦登記後就不可更改,如果程式運作時間估計過長,那麼即便程式結束,計算機仍不能被使用。如果時間過短,那麼程式将被強制停止。另外,如果我們需要在執行的源程式中加載和連結公用函數或者是進階語言的編譯器,那麼還可能将涉及到錄音帶和卡片組的拆卸和更換,而這些都是由人工來完成的,不僅很易出錯,而且效率非常低下。是以基于人工操作的串行處理其實是比較糟糕的。

2、簡單的批處理系統

​ 為了提高計算機的使用率,人們有了開發批處理作業系統的想法。批處理系統不再像串行進行中每次需要人工的切換,排程程式,而是将多個程式作為一個批次一同處理,程式的切換和時間安排由批處理系統處理。單單這一項将人工的操作更改為電子的操作就極大地提高了計算機的使用率。

簡單批處理系統的中心思想使用一個稱作監控程式的軟體。這個程式可以監控使用者程式的執行,每當有使用者程式執行結束時,控制就傳回到監控程式,同時監控程式自動加載下一個程式。(用計算機程式實作了計算機程式更換裝載的自動化:))

為了實作監控程式對事件執行順序的控制,大部分監控程式必須總是處于記憶體中,并且可以執行。這部分稱作__常駐監控程式__。

從處理器角度來說,監控程式和使用者程式的切換是通過分支指令來實作的。通過分支指令可以讓處理器從監控程式代碼段起始位址開始取址執行,也可以從使用者程式代碼段處開始。

可以看出,監控程式或者說批處理作業系統,隻是一個簡單的計算機程式。它依賴于處理器可以從記憶體的不同部分取指令的能力,以交替的擷取或釋放控制權。此外,還有其他的 硬體 功能:

  • 記憶體保護:當使用者程式正在運作時不能改變監控程式的記憶體區域。如果發生這種情況,處理器将發現錯誤,并停止這個程式,加載下一個使用者程式。
  • 定時器:用于防止一個使用者程式長時間獨占計算機。在每個程式開始時設定定時器,如果時間到了,使用者程序被停止,控制傳回監控程式。
  • 特權指令:隻能由監控程式執行的指令,如果使用者程式執行了這些指令,将引發一個錯誤。如果使用者需要執行特權指令的操作,那麼必須請求監控程式為自己執行這個操作。
  • 中斷:為不同的程式的交替執行提供了可能。

記憶體保護和特權指令引入的同時也産生了一個新的概念——操作模式。即 使用者态 和 核心态。

3、多道程式設計批處理系統

在批處理系統的使用中,人們發現由于 CPU 和 I/O 速度的嚴重不比對使得整個__計算機性能__很差。考慮這樣一種情況,當一個程式發出 I/O 請求後,由于批處理系統每次處理一個程式,是以此時處理器保持空閑等待 I/O 結束後再繼續執行指令。CPU 等待 I/O 的過程與 CPU 的執行指令的速度相比是非常慢的,執行個體證明計算機可能在 90% 的時間都在等待 I/O 的操作結束。這種每次必須等到一個程式結束才能繼續下一個程式的運作的計算機系統被稱為 單道程式設計系統 。

這種低效在當時的技術層面上是可以避免的(使用中斷)。解決辦法就是使用 多道程式設計批處理系統。針對于單道程式設計批處理系統的低效問題,多道批處理系統提供了解決辦法。

在多道批處理系統中,當一個使用者程式有涉及到 I/O 請求時,CPU 不選擇空閑等待,而是轉而去執行另一個或多個可執行的使用者程式,并可能在他們當中不斷的切換,而當等待 I/O 的程式 I/O 結束後,CPU 再次傳回這個程式繼續執行。顯而易見,這種設計方法有效的利用了程式在執行 I/O 期間 CPU 空閑的時間,盡量的保證了 CPU 的使用率,進而提高了計算機的整體使用率。和簡單的批處理系統一樣,多道批處理系統也需要依賴一些硬體的功能,支援 I/O 中斷 和 直接存儲器通路(DMA)是最為顯著的硬體功能。通過中斷驅動的 I/O 或 DMA ,當一個 I/O 操作完成後,處理器被中斷,控制器被傳遞給作業系統中的中斷處理程式,然後作業系統将控制權傳遞給另一個程式。

多道批處理系統引入的同時,也帶來了新的問題,對準備運作的多個程式,他們必須保留在記憶體中,這就需要 記憶體管理 方案,如果 CPU 等待期間多個作業都準備運作,處理器必須選擇運作哪一個,這就需要某種 排程算法。

4、分時系統

​ 通過使用多道批處理系統使得計算機處理一批使用者程式變得更加高效。但是有時我們需要一種模式可以使使用者和計算機進行互動,即多個使用者程式能同時響應多個使用者的請求。分時系統與多道批處理系統非常相像,不同的是分時系統用來處理互動式的任務。由于多個使用者同時分享處理器的時間(處理器在多個互動類的程式之間飛快的切換),是以這種技術被稱為 分時系統 (本質仍是多道批處理系統)。

而分時技術能同時實作多使用者互動的原因在于,人的反應時間要遠遠慢于處理器在不同程式間切換的速度,每個使用者程序執行一個很短的時間片,然後切換到下一個程序,進而給每個使用者一種計算機在單獨服務自己的假像。

其他

1、層次結構

​ 我們可以将作業系統看做是一系列的層,每一層執行作業系統所需的功能的相關子集。他依賴于下一個較低層,較低層執行更為原始的功能并隐藏這些功能的細節。他還給相鄰的較高層提供服務。通常情況下,較低層的處理時間很短,作業系統的某些部分必須直接與計算機硬體進行互動,在硬體層次,事件的時間刻度為幾十億分之一秒。而在作業系統與使用者互動的一端,使用者發出指令的頻率要小得多,可能每隔幾秒中發送一次。使用層次結構可以很好的與這種頻率差别場景保持一緻。

2、shell

​ 為使用者提供作業系統的一個界面。他之是以被稱為 指令行解釋器 ,是因為它将使用者和作業系統細節分離開,而簡單的把作業系統作為一組服務的集合提供給使用者,通過使用者輸入指令實作對系統的控制。

3、UNIX的曆史

UNIX 最初是在貝爾實驗室開發的。UNIX 的設計開發參考了 MIT 的分時系統 CTSS。而随着貝爾實驗室工作的展開和其他地方關于 UNIX 的工作産生了一系列 UNIX 版本。第一個著名的曆程碑是把 UNIX 系統從 PDP-7 移植到 PDP-11 上,第一次暗示了UNIX 将成為所有計算機上的作業系統;下一個重要的裡程碑是用 C 語言重寫了UNIX ,這在當時是聞所未聞的政策。原因如下:

  • 記憶體小且昂貴,是以需要高效的使用記憶體,這就包括了不同的記憶體覆寫技術,如使用不同的代碼段和資料段,以及自修改代碼等。
  • 從 20 世紀 50 年代就開始使用編譯器,但是計算機行業還是對自動生成的代碼的品質持有懷疑。
  • 處理器和總線速度相對較慢,是以節省時鐘周期會使得運作時間上有很大的改進。

現在,幾乎所有的UNIX 都是使用 C編寫的。

繼續閱讀