作業系統 (operating system)
是控制電腦整體運作的軟體,提供使用者儲存和讀取檔案的路徑、提供介面讓使用能執行程式和提供程式執行所需要的環境。
最著名的作業系統是微軟開發的 Windows
他廣泛地用在個人電腦中,另一個享有盛名的是 UNIX
廣泛用於大型電腦系統或個人電腦,UNIX 也是兩個很受歡迎的作業系統的核心,Mac OS
是 Apple 開發的作業系統,還有還有一種作業在大型電腦系統或個人電腦中常見的 Linux
是由一群電腦愛好者所開發的非商業性作業系統。
初期的作業系統僅只是為為簡化程式設定和精簡工作過度流程,早期的作業系統是將使用者
與設備
分離開來以減少人員進出電腦室的次數,要達到此目的就需要電腦操作人員來操作電腦,想要執行程式的人將程式和所需要的資料及程式執行所需要的說明提交操作人員,操作人員把程式和資料在載入到電腦的儲存設備中,接著作業程序的城市會讀取並執行這些程式,每次只執行一個這也就是所謂的批次處理 (batch processing)
,亦即先把所有要執行的工作集合成一批在一個一個的處理,期間使用者將不會進行電腦的操作。
在批次處理的作業系統中,位於儲存設備中的設備在工作的工作佇列 (job queue)
中等著被執行,佇列 (queue)
是一個儲存系統,遵照著先進先出 (first-in, first-out FIFO)
的順序執行。
但實際上大部分的工作並沒有嚴格的執行 FIFO 的順序,因為大多數的作業系統考量到工作的優先權,因為較高優先權的工作可以擠掉在工作佇列中等待執行的工作。
在早期批次處理的作業系統中每個工作都盼隨著一組指令,用於說明電腦執行該程式時需要做的準備工作,這些指令是經過編碼以系統所知的工作控制語言 (job control language, JCL)
撰寫,並與工作一起儲存在工作佇列中,當程式要執行時作業系統會命令印表機影印出這些指令讓操作人員可以照這些指令進行操作。
使用批次處理的作業系統的缺點就是一但將工作交給操作人員後就無法與他們的工作有互動,所以為了顧及互動的需求於是開發了新的作業系統,允許程式在執行時可以讓的使用者透過遠程終端機與程式進行互動,這種功能稱為交談式處理 (interactive processing)
。
交談式處理的成功要素就是需要動作夠快,所以電腦比需要在某個時間前將工作執行完畢,因次所謂的及時處理 (real-time processing)
的程序就是指需要及時完成的程序,若電腦能夠即時執行某個工作表示該電腦能很快的在時限內完成該動作,但交談式系統一次只能服務一個使用者
,所以無法解決需要滿足多人使用的功能。
這個問題的解決辦法就是設計能夠同時服務多人的作業系統
: 系統要有分時 (time-sharing)
的特性,有一種實踐分時概念的方法稱為多程式化 (multiprogramming)
,亦即時間被切割取多區域而每個工作只允許執行一個區段的時間
,在區段時間結束時正在執行的工作就會暫時放在一邊,另一個工作會在下一個時間區段執行,藉由這種快速交錯執行可以產生許多工作同時執行的錯覺。
到了現代作業系統地不斷演進,多處理器電腦的發展讓作業系統能夠藉由支配不同工作給不同處理器的方式而有分時/多工
處理的能力,這類的作業系統必須處理像負載平衡 (load balancing)
和 分割 (scaling)
這類的問題,負載平衡是只能夠動態分配工作到不同處理器
,使得所有處理器都能有效率的被利用到,而分割是指將工作分割為數個小工作
,讓所有處理器可以同時處理。
為了瞭解一般作業系統架構,先來看看一般電腦系統中的軟體類型
電腦軟體區分為兩大類: 應用軟體 (application software)
和 系統軟體 (system software)
,應用軟體包含特定用途
的軟體比如資料庫系統
, 排版系統
, 會計系統
...。
而系統軟體一般用於電腦共通的工作上,系統軟體提供了應用軟體所需要的基礎環境
,而系統軟體又可以分為兩類,一類是作業系統本身
另一類是公共軟體 (utility software)
,多數公共軟體用於電腦基礎硬體設備的運作
上但不包含作業系統,從某種意義上來說公共軟體所包含的軟體是用於擴充作業系統的效能。
為了執行電腦使用者所要求的工作,作業系統必須要能夠與使用者進行溝通,而作業系統處以溝通的元件稱為使用這介面 (user interface)
,舊得使用者介面稱為外殼 (shells)
是利用鍵盤
和螢幕
透過文字訊息
的方式與使用者進行溝通; 而較新的系統使用圖形使用者介面 (graphocal user interface, GUI)
則是利用物件的方式來處理和使用者的溝通,雖然作業系統的使用者介面扮演著重要的角色,但也僅是作為使用者與作業系統之間的中介者。
相對於作業系統的使用者介面,作業系統內部稱為核心 (kernel)
,它包含著哪些負責執行電腦基本功能的軟體。
作業系統的核心元件是裝置驅動程式 (device drivers)
,也就是用來溝通控制器的軟體元件,讓連接於電腦的周邊設備能夠正常運作,而每個裝置驅動程式都是針對特定
型態的裝置所設計的,並將電腦裝置的操作請求轉呈裝置內部的特定程序。
作業系統的另一個核心元件是記憶體管理員 (memory manager)
負責協調主記憶體的使用,在多人多工的還境下電腦在同一時間需要服務多人或執行多個程式,這種情況下記憶體管理員就非常重要了,多個程式和資料區塊同時存在主記憶體中,因此主記憶體必須要為了這些程式和資料只配記憶體空間並確保每個程式的運作都只局限在各自分配到的記憶體空間中,隨著程式和資料的來來去去,記憶體管理員就必須追蹤這些記憶體的使用狀況。
若是主記憶體所需要的空間超過電腦實際的空間的話,記憶體管理員就會將程式和資料在主記憶體和儲存裝置中來回搬動以製造還有額外記憶體的假象,這種技術稱為分頁處裡 (paging)
,分頁技術所製造出來的虛假記憶體空間稱為虛擬記憶體 (virtual memory)
。
作業系統的啟動是透過開機程序 (boot strapping)
來完成簡單來說就是開機 (booting)
,每當電腦打開後就會自動執行,這是將作業系統從硬體或其他儲存裝置載入到主記憶體中(當電腦打開時,主記憶體並未儲存任何內容),當電腦第一次開啟時記憶體內需要有一個程式,但每當電腦關閉時儲存在記憶體的內容就會跟著消失,為了解決這個問題 CPU 會從電腦主記憶體的某個區塊讀取初始程式,這個初始程式放置於種特殊非揮發
的記憶體中稱為唯讀記憶體 (read-only memory, ROM)
。
一般電腦中有個啟動載入器 (boot loader)
的程式儲存於 ROM
中,他就是當電腦第一次開啟時的初始程式,會引導 CPU 將作業洗桶從預先設定好的位置仔入到記憶體中,新式的啟動載入器可以從任何位置將作業系統載入到主記憶體中,所以執行啟動載入器
和啟動作業系統
就稱為電腦的開機 (booting)
。
本章要介紹作業系統如何協調應用軟體、公共軟體以及作業洗桶元件之間的執行工作。
現代作業系統最基本的概念之一是程式與執行程式的區別,程式是靜態的指令集合,執行程式是動態的運作,程式的執行是在作業系統的控制下運作
稱為處理程序 (process)
,與處理程序相關連的是該程式執行的狀態稱為處理狀態 (process state)
,一般分時多工的電腦會執行許多處理程序,所有的處理程序會彼此競爭電腦資源,所以作業系統會負責管理這些處理程序,讓每個處理程序能夠得到它需要的資源。
協調處理程序的工作是由作業系統核心內的排程器 (scheduler)
和調度器 (dispatcher)
負責。
排程器 (scheduler) 紀錄著電腦執行中的所有處理程序,並加入新的處理程序或移除已完成的處理程序,排程器為了要追蹤所有處理程序就需要在主記憶體中佔用一塊區域,稱之為處理程序表 (process table)
,每當有程式要求執行就會在這裡新增一個項目以加入到新的程序中,如果是可以執行的狀態則該程序會定義為就緒 (ready)
,如果需要延遲則定義為 等待中 (watiting)
。
調度器 (dispatcher) 是作業系統核心元件之一,主要負責監控已排成的處理程序,在多時多工的系統中透過多程式化 (multiprogramming)
還處理已排程的程序,換句話說就是把時間分割為小片段,每個片段稱為時間片段 (time slice)
可以讓 CPU 在不同處理程序間轉換,每個處理程序只能執行一個時間片段,CPU 在處理程序之間切換的動作稱為處理程序交換 (process seitch)
或數據交換 (context switch)
。
每個調度器給予一個處理程序一個時間片段就會啟動一個計時器電路,他在時間片斷結束時會送出一個訊號稱為中斷 (interrupt)
,CPU 收到後會暫停目前進行的工作並記錄工作中的階段以便稍後可以返回該進度然後再處理中斷的事情,所以當 CPU 收到中斷訊號會先完成目前的機械週期,保存狀態最後才執行中斷處置氣 (interrupt handler)
的程式,因此中斷訊號造成的效應是將目前執行的處理程序暫停
,然後將控制轉給調度器此時調度器會從處理程序表中選擇一個最高優先權且已就緒
的處理程序讓他執行。
作業系統的一項重要工作就是配置電腦資源給系統中的處理程序。
當作業系統需要追蹤某設備是否已經被使用,有一種方法是使用旗標
,他是指記憶體上某個位元,狀態通成為有 (set)
和 無 (clear)
,一個無旗標代表設備可以使用反之代表有設備正在被使用,但這種檢查和設定旗標可能需要數個機械指令來完成,因此可能在偵測到無旗標後以及設定旗標值之前產生一個中斷訊號,比如說要使用某個設備前檢測他的旗標發現是無,正要使用這個設備時他的時間片斷到期時,換了一個處理程序但他也是要使用該設備,所以他也會監測到此設備的旗標為無,所以就會開始使用這個設備,但當他的時間週期也結束切回一開始的處理程序時,他會遵照剛剛收到某設備旗標為無的結果使用該設備,這樣就會導致兩個不同的處理程序同時使用同一個設備。
解決辦法就是堅持不讓檢查與設置旗標的工作被中斷,有兩種方法:
中斷去能 (interrupt disable)
和中斷賦能 (interrupt enable)
兩個指令,若作業系統開始旗標值檢查會啟動中斷去能指令以防止動作被中斷,當檢查完後就會使用中斷賦能重新讓中斷功能恢復。資運配置會遇到另一個問題就是死結 (deadlock)
,當兩個以上的處理程序由於彼此都在等待一個已配置給對方資源而無從取得進展,比如說一個處理程序已獲得設備 A 的存取權限但在等待設備 B 的存取權限,但另一個處理程序則是獲得了設備 B 的存取權限但在等待設備 A 的存取權限,這樣就會造成死結 (deadlock),要符合三種情況才可能發生死結:
死結偵測與修正法會
偵測死結是否發生並強制取回某些以配置的資源
已修正死結問題,例如使用這可以使用 kill
強制刪除某些處理程序,死結避免法
則是讓每個處理程序一次請求所有的資源或是將不可共用的資源轉換為可共用資源,簡單來說就是將某個資源的請求全部同意並存放在一個位置中先保留起來等時機成熟後再輸出,這種技巧稱為排存 (spooling)
。
多核心作業系統: 傳統分時多工系統利用人力無法察覺的切換速度達到可以處理多個處理程序的錯覺,但現在的多核處理器則是真正能做到同時處理多個處理程序的功能,所唷對一個多核心的作業系統來說,排程器與調度器比須安排那個處理程序在哪個核心就會變得更複雜。
由於作業系統會監控電腦中發生的任何事件,所以很自然的也要維護著電腦的安全性。
作業系統的一項重要任務就是防止電腦資源被未授權者進行存取,再多人共用的情況下,通常會對使用者建立使用者帳號 (account)
,所以在系統中每個帳號其實都是一筆紀錄,包含了使用者名稱、密碼和使用者權限等等,這樣作業系統就可以依據帳號內容掌控使用者對系統的存取。
這些使用這帳號通常是由超級使用者 (super user)
或管理員 (administrator)
所建立,他們擁有整個系統的最高權限,一但登錄系統就可以修改作業系統的設定值、變更重要軟體元件、調整使用者權限和執行許多系統維護工作,這些是一般使用者無權執行的。
所以身為系統的最高權限者也可以監控系統中的所有事件,以找出任何破外系統的行為,所以為了輔助這些安全性的監控,所以發展出許多多稽查軟體 (aduiting software)
,能夠紀錄並分析電腦系統所發生的事件,簡單來說他可以偵測使用不正確密碼登錄的行為也可以找出使用者與平常活動不相符的行為,比如說某個使用者常常只會用文書軟體或試算表,但某天突然開始使用高技術性的應用工具等等。
一但入侵者得到的系統的權限,就會開始取得想要的資訊或是破壞系統的設置,如果是一般的使用者被入侵就必須要騙過系統以獲取更高的權限,但現今的 CPU 都經過強化可以阻擋類似的攻擊,比如處理程序被嚴格限制僅能存取記憶體管理員所配置的記憶體區塊,若沒有這樣的限制則處理程序就可以存記憶體刪除整個作業系統進而控制整個電腦。
多程式化系統的 CPU 會在兩種特權等級 (privilege level)
其中之一運作,一種是特權模式
另一種是非特權模式
,在特權模式下 CPU 能夠執行所有機械語言下達的指令,相反的非特權模式中就只能執行有限的指令。
能在特權模式下執行的指令稱為特權指令 (privileged instructions)
,當 CPU 在非特權模式下運行時,如果嘗試執行一個特權指令的話會導致一個中斷程序
,他會將 CPU 的運行模式轉換為特權模式
並且將控制權交給作業程序裡的中斷處置器。
當電腦開啟時 CPU 會處於特權模式,因此在開機程序後啟動作業程序時所有指令都能執行,然而每次作業系統允許處理程序使用其時間片段時,他會執行變更特權模式
將 CPU 轉為非特權模式,這樣的好處是如果這個處理程序想要執行一個特權指令時,系統就會被告知。
保存狀態最後才執行中斷處置氣 (interrupt handler) 的程式,因此中斷訊號造成的效應是將目前執行的處理程序暫停,然後將控制轉給調度器此時調度器會從處理程序表中選擇一個最高優先權且已就緒的處理程序讓他執行。
這邊應該有錯字~