電腦網路與作業系統 電腦網路與作業系統

電腦網路與作業系統上課教材

電腦網路與作業系統 > 課程內容 > 第 3 堂課 - 作業系統概論

第 3 堂課 - 作業系統概論

上次更新日期 2018/02/07

現今的所有電腦相關設備幾乎都有作業系統在內,程式開發者只要依循作業系統的設計要求,就能夠輕鬆的設計出所需要達成的軟體。 而一般的終端用戶,只要能夠操作軟體,就能夠進行辦公室生產力作業,或者是電腦遊戲、網路遊戲的進行等。這麼方便的設計都是來自於作業系統的輔助! 因此,了解作業系統的概念是有其必要的。

  • 3.1: 電腦硬體概說
  • 3.2: 早期的作業系統類型
  • 3.3: 作業系統概念
  • 3.4: Linux 作業系統初探
  • 3.5: 程序觀察與排程概念
  • 3.6: 課後練習

3.1: 電腦硬體概說

計算機硬體歷史可以回朔到 1800 年代,不過當時的電腦並不是使用電力的,而是機械式的操作。後來到了 1930 年代後,才漸漸開發出以電力提供的計算機硬體。 詳細的計算機硬體可以從底下的連結去查閱比較細節的部份。

  • 第一時期:1642~1946

主要是透過機械設備來進行四則運算 (加減乘除)。例如法國人的 Pascalene 加法器以及德國數學家設計的 Stepped Reckoner 計數器。 後來進入 1833 年,英國數學家巴貝奇設計出差分機等。

  • 第二時期:1946~1954

開始透過真空管作為主要元件來進行電腦的設計,包括美國軍事機構為了計算彈道射程而開發的 ENIAC (重量達 30 公噸,含 1.8 萬隻真空管,耗電 15 萬瓦的電力操作), 英國劍橋大學的 EDSAC 系統,以及 UNIVAC-1 商用電腦系統等。此時電腦還沒有鍵盤輸入資料,而是透過讀卡紙打洞之後,讓系統讀入,然後輸出透過印表機來輸出。 如果有個動作錯誤,就需要全部重來一遍。

  • 第三時期:1954~1964

貝爾實驗室在 1947 年開發出電晶體 (Transistor) 之後,真空管就被這玩意兒取代了。包括貝爾實驗室內部的 TRADIC 系統等等。

  • 第四時期:1964~1970

在真空管之後開發出積體電路 (Integrated Circuit, IC),後來積體電路被拿來取代電晶體,讓電腦的體積大大降低。1964 年 IBM 開發出相當熱門的 system/360 系統即是一例。

  • 個人電腦時代

1972 年開始 Intel 開發出多款的微處理器,包括 8008, 8080, 8086 等,尤其自 8086 之後,就是第一款的 x86 個人電腦設計架構。之後的個人電腦統稱為 x86 架構的原因在此。

3.2: 早期的作業系統類型

電腦軟體當然是跟著硬體來跑的,因此不同的硬體系統就會有不一樣的作業系統產生。最早之前的電腦硬體,因為每部硬體的設計不同, 因此每次要執行程式時,程式設計師都得要自行參考電腦硬體來設計出運算的軟體,當時的系統並沒有『作業系統』的概念,因為應用程式與作業系統是同時設計的。

  • 批次系統

但是因為每次要執行該程式都會很困擾,使用者得要排隊去讓系統讀卡操作。因此後來開始有了『批次系統』的設計。因為電腦裡面有儲存設備 (不論是硬碟還是記憶體), 所以電腦硬體裡面會執行一隻監督程式 (monitor),使用者可以預先將自己的程式讀進系統,系統先儲存該程式到佇列 (queue),等到輪到該程式運作後, 就將該程式讀入讓 CPU 開始運作,直到運作結束輸出到印表機之後,將該工作丟棄,然後開始讀入在 queue 裡面的新的程式,依序執行。

批次系統

不過這樣的架構底下,我們可以發現到程式的進行常常卡在讀卡與印表機上面。因此後來監督程式可以自行判斷該工作是否在列印, 若在列印了,就將該工作丟到另一個子系統去輸出,而不再管理。然後直接讀出下一個程式來運作,以加快系統運作的效能。將 CPU 與 I/O 分離開! 這樣的效率就會好多了。

同時週邊線上作業批次系統
  • 多元程式處理系統

這種架構是在記憶體比較大之後才開發出來,系統允許兩個以上的程序在記憶體中等待被 CPU 執行,當 CPU 執行完其中一隻程式後, 第二隻程式就可以立刻被執行,因此效能會比較好。此外,當系統進入 I/O (例如列印) 情況下,該程序就會被中斷 (Interrupt) ,但這個中斷並不是停止的意思, 而是『程序的狀態進入中斷狀態,CPU 不會理會該程序』的意思。

多元程式處理系統

基本上在記憶體當中的程序有底下三種基本的狀態:

  • 執行 (running):該程序正被 CPU 運作當中
  • 預備 (Ready):該程序排在佇列當中,等待 CPU 的運作
  • 等待或中斷 (wait/interrupt):該程序需要在 I/O 的情況下,此時 CPU 不會理會該程序。

這種系統最重要的設計在於 CPU 的排程 (cpu scheduling),包括是否有最優先需要運作完畢的程序?每支程序最多能夠運作多少時間等, 都是需要考量的。另外,讀者須知道早期單核 CPU 的運作中,CPU 一次只能運作一個工作,因此,若有多個工作要同時進行, 那麼 CPU 就得要安排一個 CPU 運作時間給所有的工作,當該程序達到最大工作時間後,CPU 就會將該工作排回佇列,讓下一隻程序接著運作。 由於 CPU 的速度太快,因此你會覺得 CPU 是同時運作所有的程序,其實不是的!而是 CPU 在各個程序之間切換工作而已。

  • 分時系統

前兩個系統通常沒有安排使用者操作界面,亦即所有的程序都是監督程式在進行的,使用者只能將工作丟進系統而已,並不能即時的操作控制。 後來分時系統 (Time-Sharing system) 就被提出來使用。所謂的分時系統其實與多元程式處理系統有點類似, 只是工作的輸入改為透過終端機操作輸入,CPU 可以在各個用戶操作間切換工作,於是每個使用者感覺似乎都是在同步操作電腦系統一般, 這就是分時系統。

分時系統
拿出計算紙,繪製出多元程式處理系統,注意每個圓圈的箭頭方向,並且說明基本的程序三種狀態。

之所以要繪製多元程式處理系統,是因為目前的許多概念都是從這個系統來的,尤其是在記憶體當中的程序狀態,更是重要!

3.3: 作業系統概念

早期的程式設計師要設計程式事件苦差事,因為得要了解電腦硬體,並根據該電腦硬體來選擇程式語言,然後根據程式語言來設計運算工作、記憶體讀寫工作、 磁碟與影像輸入輸出工作、檔案存取工作等。等於從硬體、軟體、輸入輸出行為都得要在自己的程式碼裡面一口氣完成才行。但是所有的電腦硬體都有點不太一樣, 所以,只要換一台電腦硬體,全部的程式碼就得要重新改寫,運作上面非常沒有效率。

後來在 1971 年開始的 unix 系統開發後,後續的系統大多使用 unix 的概念,將硬體管理的工作統一交給一組程式碼去進行,而且這組程式碼還提供了一個開發界面, 因此軟體工程師只要依據這組程式碼規範的開發界面後,該軟體開發完成就能夠在這組程式碼上面運作了!這組程式碼加上那個開發界面就是一個作業系統 (operating system, OS) 了。 如下圖所示,作業系統指的是核心與系統呼叫 (系統呼叫就是剛剛提到的那個統一的開發界面),使用者則是主要操作應用程式 (軟體) 而已。

OS

那麼這個核心 (kernel) 除了管理硬體 (CPU/RAM/DISK...) 之外,還需要進行什麼事情呢?從多元程式處理系統裡面,我們知道程序需要放在記憶體當中, 而 CPU 的工作排程也是很需要設計的,另外,磁碟的讀寫效能,以及相關的檔案系統,還有網路功能,全部都是作業系統應該要提供的主要元件!作業系統的基本元件功能大概有:

  • 程式的執行:
    作業系統除了管理硬體之外,最重要的就是將使用者交付的任務 (程式) 執行完畢。因此,作業系統需要將使用者交付的軟體程序分配到記憶體中, 然後透過 CPU 排程持續的交錯的完成各項任務才行。
  • CPU 中斷 (interrupt) 的功能:
    如同多元程式處理系統談到的,程序的狀態可能會進入所謂的中斷階段。在現在的作業系統中,CPU 根據硬體擁有許多與週邊硬體的中斷通道, 當接收到中斷訊號時,CPU 就會嘗試將該程序列入等待的狀態下,讓該硬體自行完成相關的任務後,然後再接管系統。不像以前舊式的環境, CPU 得要持續不斷的去偵測該動作是否完成。
  • 記憶體管理模組:
    舊的環境底下,程式設計師需要自己判斷自己的程式會用到多少記憶體,然後自行指定記憶體使用位址的任務。現代作業系統會有記憶體管理模組, 該子系統會自動去偵測與管理主記憶體的使用狀態,避免同一個記憶體位址同時被兩個程序所使用而讓程序工作損毀。此外,由於作業系統核心也在記憶體中, 因此核心也會被這個子系統放入受保護的記憶體區段,一般用戶是無法直接操作該受保護的記憶區段的。
  • 虛擬記憶體 (virtual memory):
    當 CPU 要讀入程式或檔案資料時,總得從主記憶體當中讀入,但是,主記憶體當中的資料並不是連續的,主記憶體的資料就像磁碟一樣,重複讀、刪、寫之後, 記憶區段是不會連續的。但是為了強化效能,通常 CPU 要讀入程式,只會讀入該程式在記憶區段的開頭位址與長度而已。因此,現代作業系統有開發一個虛擬記憶體, 他會記憶程序是在主記憶體的哪個區段內,但是程序區段是連續的!所以 CPU 主要讀出虛擬記憶體,記憶體管理模組就會主動讀出資料了。例如下列的示意圖:
    VirtualMemory
    上圖指的是,一隻程序的資料是連續的 (左側),但是實際上對應的是在主記憶體或其他位置上。
  • CPU 排程:
    這是作業系統好不好的重要指標之一!如何讓 CPU 在多工的情況下以最快速的方式將所有的工作完成,這方面的演算法是目前各主要作業系統持續在進步的部份。 目前常見的是優先權多工技術 (Preemptive multitasking),我們知道 CPU 必須要在各個程序之間切換運作,但是哪些程序需要比較優先的等級運作, 哪些程序可以稍微慢點完成,這就是優先權多工的判斷工作。基本上,我們可以想成程序在多個佇列中排隊,有的佇列可以比較快被運作, 有的佇列則是比較晚被運作的意思。
  • 磁碟存取與檔案系統:
    通常使用系統讀寫檔案只要知道檔案位置哪裡就能夠讀寫與複製了。但是作業系統則需要驅動磁碟(不論是傳統硬碟還是 SSD),然後也需要了解該磁碟內的檔案系統格式, 之後透過檔案系統這個子系統來進行資料的處理。
  • 裝置的驅動程式:
    裝置的變化日新月異,所以作業系統必須要能夠接受硬體裝置的驅動,所以硬體製造商可以推出給各個不同作業系統使用的驅動程式 (dirver / modules), 這樣作業系統直接將該驅動程式載入後,即可開始使用該硬體,而不需要重新編譯作業系統。
  • 網路子系統:
    其實網路是作業系統提供的!因此才有所謂的『網路作業系統』的名詞。目前所有的現代作業系統都會支援 Internet,所以現代的作業系統都是網路作業系統。
  • 使用者界面:
    一個桌上型生產力軟體經常需要一個圖形話界面的支援,這也是作業系統應該要提供的界面選項。不過許多的伺服器就無須圖形界面,只要有文字界面即可。 圖形界面被稱為 graphical user interface (GUI),在一般桌上型應用是相當需要的。

也就是說,在四個圓形圖的畫面中,作業系統核心至少就要提供上述的功能與資源管理的任務,所以作業系統管的真的很多! 而且每個子系統內部都有很多重要的、可持續修改以發揮系統效能的部份。

3.4: Linux 作業系統初探

依據老師的說明,請登入本系的虛擬電腦教室系統,取得你專屬的帳號與密碼。

根據虛擬電腦教室的設定,啟動屬於你的 Linux 作業系統,然後使用 remote-viewer 軟體連結到你的 Linux 作業系統終端機。記錄老師告知你的帳號密碼資料。

完成底下的操作:
  1. 以老師說明的帳號與密碼登入 Linux 作業系統
  2. 登入後,請選擇中文界面。
  3. 請登出後再次登入,查看是否具有中文化了。同時,螢幕要你選擇修改目錄成為中文時,請選擇忽略 (保持英文檔名)
  4. 點選右上角的三角形,確認你的網路是啟動的狀態
  5. 點選瀏覽器,前往你經常連結上去的網站,查閱相關資料。
  6. 點選右上角三角形,改變一下解析度,看看能否符合你的螢幕解析度環境
  7. 點選右上角三角形,改變一下輸入法,安裝酷音輸入法,確定可以輸入注音
  8. 嘗試開啟檔案總管,確認目錄框格、資料框格的所在處
  9. 嘗試開啟 office 相關軟體,測試是否能夠建立文字資料檔案
  10. 嘗試開啟『終端機』,輸入『 w 』指令,以及『 ll 』指令(L 的小寫),看看輸出的畫面如何,最終輸入『 exit 』離開。

作業系統提供了 GUI 以及非 GUI 的狀態,在 Linux 就已經存在!Linux 有 tty1 ~ tty6 這六個預設的終端機界面,我們上課的系統預設 tty1 為圖形, 其他五個為純文字。你可以透過底下的組合按鍵切換畫面:

  • [ctrl]+[alt]+[F1]~[F6]
純文字界面登入時,你需要自己輸入帳號與密碼,且滑鼠不能動作。
Login: 你的帳號
Password: 你的密碼(注意,螢幕不會出現 *,你的鍵盤沒鎖死!)
同樣輸入『 w 』以及『 ll 』查看輸出的資訊之後,離開請輸入『 exit 』即可。最終回到 tty1 的圖形畫面中。

3.5: 程序觀察與排程概念

除了作業系統是由 BIOS 去載入執行的,然後第一隻系統程式則是作業系統自己去呼叫的之外,其餘的程式要載入到記憶體當中執行時,都需要透過觸發的程序。 在 GUI 界面,就是透過滑鼠點擊,在終端機界面,就是透過指令來觸發的。無論如何,當程序被觸發之後,就會被載入到記憶體當中, 成為記憶體當中的活動單位,這就是所謂的程序 (process, 也有翻譯做行程)。

  • 程序的識別碼 PID

在儲存媒體當中的單位稱為程式 (program),這個程式是可以被重複觸發的!例如你可以在一個系統上面打開多個 chrome 瀏覽器, 這就是一個程式 (chrome) 被重複觸發的情況。既然有多個 chrome,那麼作業系統如何知道現在使用者操作的是哪一個程序?其實作業系統認的是程序識別碼 Process ID, 現代的作業系統在記憶體當中的程序都是以 PID 來管理的。

完成底下的練習:(windows 10 為例)
  1. 打開工作管理員
  2. 選擇『處理程序』的頁面
  3. 在『名稱』那一欄位上面按下右鍵,增加勾選『 PID 』的顯示,查詢一下每個程序的 PID
完成底下的練習:(Linux 為例)
  1. 打開一個終端機界面
  2. 輸入 top ,查看一下 PID 的欄位項目
  3. 觀察完畢之後輸入 q 即可離開 top 的動態更新畫面
  4. 輸入 exit 離開終端機畫面
  • 程序的狀態

程序有相當多的狀態,如上個練習裡面的 top 輸出結果中,就會有說明正在執行中的、睡眠中的以及成為殭屍的程序數量。 另外,程序也有進入等待的中斷狀態等等。

此外,在 top 的畫面中,整體 CPU 狀態內有個 iowait 的項目,該項目指的是 CPU 用於等待輸入輸出的情境, 由於 I/O 的速度比 CPU 運算的速度要慢上許多,因此當你系統上面的 iowait 百分比過高時,可能系統的效能就會很低落。 此時適當的找出問題程序並加以管理則是很重要的任務之一。

  • CPU 排程

基本上,依據使用者操作的行為,一般排程重點有兩種類型:

  • CPU bound:運算導向,比較著重於運算的類型,很操 CPU 運算功能。
  • I/O bound:輸入輸出導向,比較著重於週邊界面的資料傳輸行為,例如資料庫系統。

一般來說,CPU 執行過一段時間分量之後,會將程序丟回佇列池。但丟回佇列池時,會根據程序的狀態而進行一些額外的工作,如下圖示意:

程序佇列

在 Linux 底下使用的是透過優先權 (priority) 的方式去判斷哪個佇列底下的程序可以執行比較久的時間依據!

程序佇列
完成底下的練習:(Linux 為例)
  1. 打開一個終端機界面
  2. 輸入 top ,查看一下 PR 的欄位項目,那個就是 Priority 的佇列,越小有越多的 CPU 分量時間
  3. 觀察完畢之後輸入 q 即可離開 top 的動態更新畫面
  4. 輸入 exit 離開終端機畫面
  • 程序的相依性

另外,程序是有相依性的,因此有所謂的父程序與子程序,某些狀態底下,你關閉子程序之後,父程序會反覆的產生子程序。 因此,如果要刪除掉該程序串,就得要刪除程序樹的最上層父程序才行。

完成底下的練習:(Linux 為例)
  1. 打開一個終端機界面
  2. 輸入『 pstree 』指令,觀察輸出的結果
  3. 輸入『 pstree -p 』指令,觀察輸出的結果
  4. 找出 PID 為 1 的程序名稱為何?
  5. 輸入『 history 』看看曾經下達過哪些指令了。
  6. 輸入 exit 離開終端機畫面
  • 程序的管理

程序執行完畢之後就會被移出主記憶體。但某些時刻你可以透過管理工具來手動移除非必要的程序。在 Linux 底下可以透過 kill 來刪除, 在 windows 底下則是透過工作管理員來刪除。

完成底下的練習:(windows 10 為例)
  1. 打開工作管理員
  2. 選擇『處理程序』的頁面
  3. 選擇一個 chrome 來關閉看看。
完成底下的練習:(Linux 為例)
  1. 打開一個終端機界面
  2. 輸入『 pstree -p 』並找到名為 bash 的程序 PID 號碼
  3. 輸入『 kill -9 PID號碼 』來強迫關閉該程序,結果會如何?
  4. 這代表終端機畫面是由哪一隻程式提供的?
  5. 再次打開終端機
  6. 輸入『 ps -l 』找出 bash 的 PID 是幾號
  7. 跟前一個 bash 的號碼是否相同?
  8. 輸入『 kill -9 PID號碼 』來強迫關閉該程序,結果會如何?
  • 執行緒 (thread)

在 Linux 系統裡面所有的記憶體內的單元都是以程序的概念來處理的,但是總有父程序與子程序之分。在 windows 底下則有所謂的執行緒。 基本上執行緒你可以想成是與父程序共用某些資料區段的子程序這樣的概念。

同學們應該會發現,第一次載入 word 或 chrome 時,其花費的時間相當大量,但再次載入另一隻 chrome 時,速度就快的多! 這是因為第一隻 chrome 會是完整的程序,後面載入的 chrome 則是透過行程內的資料在產生一隻新的執行緒,並且該執行緒可以在行程內共用相關的軟體或資料, 因此第二次觸發該程式時,就會感覺速度比較快,原因是許多已經載入到記憶體中的程式段落無須再次載入。

  • 多 CPU 狀態

由於目前 PC 已經是多核的情況,因此,你可以在同一個時間點進行多個程序的執行。以 4 核心的 CPU 而言,代表可以同時有 4 個程序被同時執行,而不是切換執行。 然而由於系統希望完整的將負載做個平衡,因此在 Linux 的預設環境下,這些程序會在不同的 CPU 之間輪流的轉換運作喔。

完成底下的練習:(Linux 為例)
  1. 打開一個終端機界面
  2. 輸入『 top 』之後,再按下 1 (數字的一)
  3. 觀察該系統有幾顆 CPU,且 CPU 的變化。
  4. 輸入『 q 』離開 top
  5. 輸入『 exit 』離開終端機

3.6: 課後練習

請使用 word 檔案 (.doc 或 .docx) 進行下列題目的撰寫(某些題目需要加上圖檔),且檔案容量請不要超過 2MBytes 以上, 以 1Mbytes 為宜,亦即你的圖檔需要限制解析度,並請注意:

  • 首次使用上傳系統時,務必使用 pietty 更改一次密碼,並請將密碼自己記憶下來,未來不能隨時變更密碼的。
  • 檔名請設定為: os_4XXXCYYY_unit03.doc (4XXXCYYY 是你的學號,請填正確,有分大小寫,請確認)
  • 請使用 filezilla 搭配 FTP 協定 (port 21) 上傳
  • 請上傳到你家目錄底下的 os 目錄中 (若不存在,請自行建立該目錄)

開始本章節題目:

  1. 在 wiki 上面查詢 debug 的最原始原因為何?(註:與蟲子及真空管有關)
  2. 繪製出多元程式處理系統,注意每個圓圈的箭頭方向,並且說明基本的程序三種狀態。
  3. 以四個同心圓說明 (1)x86 個人電腦 (2)POSIX 標準 (3)browser (4)Linux kernel 之間的層層相關性。
  4. 找出目前 Linux kernel 的最新版本 (寫下你尋找的日期與該日期你查到的最新版本號碼)
  5. 著名的圍棋電腦深藍使用的作業系統為 AIX,請觀察 https://en.wikipedia.org/wiki/File:Unix_history-simple.svg 這個資料,認真的說明 (1)Linux (2)AIX 作業系統是從哪個系統延伸出來的?
  6. 用 100 個字以內的說明,解釋什麼是虛擬記憶體 (virtual memory) (用自己理解的想法寫下來,所以沒有標準答案)
  7. 在 Linux 系統中,哪些組合按鍵可以進入 tty3 呢?
  8. 在系統的運作過程中,什麼是 CPU bound 與 I/O bound
  9. 當輸入 top 與 ps -l 這兩個指令時,哪個欄位的內容代表的就是不同優先權的等待佇列號碼?
  10. 實際登入 Linux 系統,進入 tty4 ,並且以正確的方式登入系統,將該畫面拍下來
  11. 透過任何上課教的 Linux 指令,找到 crond 這個程序,拍下 crond 的 PID 號碼
  12. 哪一個指令可以查閱曾經下達過得指令?請輸入後將畫面拍下來。
  13. 拍下 top 的執行畫面,然後說明 (1)系統共有幾隻程序 (2)正在運作中的程序有幾隻 (3)有幾隻程序是在停止 (stop) 的狀態 (4)有幾隻程序變成殭屍程序了。