750 likes | 953 Views
第七章 作業系統(一). 每一套電腦系統都必備的軟體就是作業系統,作業系統負責控制與協調電腦系統的資源,為了達到這個目的,因此發展出許多的策略,在本章中,我們將介紹這些策略,包含作業系統如何管理 CPU 、主記憶體以及磁碟。. 第七章作業系統(一). 作業系統是最基本的軟體,所有的應用程式都必須透過它來分配電腦的硬體資源 早期的作業系統只提供了命令列式的操作介面 目前則流行圖形化的視窗作業系統,對於使用者而言,視窗作業系統讓一般使用者不再對電腦產生恐懼感,也帶動了個人電腦的流行。
E N D
第七章作業系統(一) 每一套電腦系統都必備的軟體就是作業系統,作業系統負責控制與協調電腦系統的資源,為了達到這個目的,因此發展出許多的策略,在本章中,我們將介紹這些策略,包含作業系統如何管理CPU、主記憶體以及磁碟。
第七章作業系統(一) • 作業系統是最基本的軟體,所有的應用程式都必須透過它來分配電腦的硬體資源 • 早期的作業系統只提供了命令列式的操作介面 • 目前則流行圖形化的視窗作業系統,對於使用者而言,視窗作業系統讓一般使用者不再對電腦產生恐懼感,也帶動了個人電腦的流行。 • 然而作業系統的設計原理其實是一門大學問,它牽扯到CPU、記憶體、磁碟等等的管理,在本章中,我們將分別就這幾項技術加以介紹。
大綱 • 7.1 作業系統簡介 • 7.2 作業系統的演進 • 7.2.1 真空管時代的電腦作業系統 • 7.2.2 電晶體時代的電腦作業系統 • 7.2.3 積體電路時代的電腦作業系統 • 7.2.4 超大型積體電路時代的電腦作業系統 • 7.2.5 現代化作業系統 • 7.3 程序與CPU管理 • 7.3.1 排程 • 7.3.2 排程演算法 • 7.4 記憶體管理 • 7.4.1 傳統記憶體管理 • 7.4.2 多重程式處理(Multiprogramming) • 7.4.3 虛擬記憶體(Virtual Memory) • 7.5 磁碟管理
7.1 作業系統簡介 • 只有硬體而沒有任何軟體(或韌體)的電腦系統稱為裸機(Bare Machine) • 裸機是無法運作的,它必須透過軟體的操作才能發揮功效 • 作業系統(Operating System)是最基本也是最重要的系統軟體,所有硬體資源的控制與協調都由作業系統負責,例如:CPU使用權的管理、記憶體空間的管理、磁碟管理等等。 • 作業系統擔任的工作主要是作為應用程式與硬體之間的橋樑,不過作業系統也可以直接接受使用者的命令。 作業系統與電腦系統關係圖
7.1 作業系統簡介 • 事實上,作業系統也是由眾多程式所組成,這些程式大體可以分為兩大部分 • 一是監督程式,二是管理資源的各種程式。 • 監督程式(Supervisor program)的工作是監督作業系統其他程式的運作,因此,監督程式大多常駐於記憶體內。 • 監督程式可以說是作業系統中最重要的核心部分,因此也被稱為核心程式(kernel)。 • 當電腦開機之後,首先讀取的程式是放在BIOS內的啟動程式(Bootstrapping),啟動程式的工作非常簡單,會將放在硬碟內的作業系統核心(kernel)載入到主記憶體中,然後程式就會執行核心程式。 • 核心程式由於扮演監督者的角色,因此會一直常駐在主記憶體的某一個固定區塊中,因此核心程式屬於常駐程式(resident program)。 • 作業系統平常是利用常駐的監督程式在運作,直到需要使用其他非常駐程式時,才會將這些非常駐程式從硬碟載入到主記憶體中。
7.1 作業系統簡介 • 除了核心常駐程式之外,現代流行的作業系統還會提供管理資源的各種程式,例如:使用者命令介面程式、磁碟管理程式等等,有些作業系統(例如微軟的Windows)甚至還會提供瀏覽器、編輯器或遊戲軟體等等的軟體,這些部分,我們則將之列入為應用軟體的部分。 • 【註】: • 有關系統軟體與應用軟體的劃分,各書有不同的定義,在本書中,我們將作業系統核心與程式開發所需要的軟體(除編輯器之外)列入為系統軟體;而其他不論是由作業系統(例如磁碟管理、瀏覽器)或其他公司所開發的軟體(例如繪圖軟體)皆列入為應用軟體。換句話說,本書之劃分是依照系統開發與執行之必要性做為軟體之分際。正如同Windows將磁碟重組工具列為『附屬應用程式/系統工具』類別中。 核心常駐程式
7.1 作業系統簡介 • 作業系統的主要功能 • 作業系統的主要功能可以分為下列三大項,其對象各有不同: • 管理電腦硬體資源: • 不論是使用者或應用程式,在運作的過程中都必須使用到硬體資源,例如CPU、主記憶體、磁碟、印表機等等,由於硬體相關程式的發展需要更多背景知識,而這對於一般程式設計師而言,並不十分容易,在分工的概念下,作業系統將扮演硬體資源管理的角色,並且提供許多的應用介面給一般程式設計師,如此一來,程式設計師就不需要了解控制硬體的底層技術。 • 尤其是現今的作業系統大多提供多人或多工的環境,這些使用者或應用程式其實是共用硬體資源的,因此作業系統還需要扮演協調及控制不同應用程式及使用者的角色,以徹底發揮硬體資源的效能。
7.1 作業系統簡介 作業系統是硬體資源的管理者
7.1 作業系統簡介 • 做為應用程式的虛擬機器: • 經過分工後,程式設計師再也不用擔心底層硬體是如何被驅動控制以完成需求,對於應用程式設計師來說,就像是在一個完美的虛擬機器(virtual machine)上面開發應用程式,只需要透過作業系統提供的應用程式介面(Application Program Interface;簡稱API)來下命令,作業系統就會將這些命令轉換為真正的硬體動作。 • 舉例來說,使用者如果想要讀取某個檔案的資料,則可以透過應用程式的讀檔功能來完成,而開發讀檔功能的應用程式設計師只需要下達一道讀檔的API命令即可,至於實際上的硬碟搜尋(seek)等細節,則交由作業系統完成。 作業系統提供了虛擬機器的環境
7.1 作業系統簡介 • 提供使用者操作介面 • 使用者除了透過應用程式來操作電腦之外,作業系統也直接提供了一些基本功能,可以用來操作電腦,例如檔案複製、刪除等都是作業系統提供的基本操作。 • 作業系統提供的使用者介面可以分為兩大類:命令列(command line)及圖形化使用者介面(graphical user interface;簡稱GUI)。 • 命令列操作介面對於一般使用者而言較難以快速上手,並且需要記住一些指令,傳統的Dos及Unix、Linux等都提供了命令列式的操作介面。 • 圖形化使用者介面則非常容易上手,使用者只要透過滑鼠,就可以輕鬆操作電腦,因此對於個人電腦的推廣有非常大的幫助,常見的圖形化使用者介面有Windows、X-Window、Mac OS X等等。
7.1 作業系統簡介 Linux的命令列操作介面 Windows Vista圖形化使用者介面
7.2 作業系統的演進 • 作業系統並不是一開始就是如今的模樣,隨著電腦的演進,作業系統也隨之改變,功能也越趨多樣化,在本節中,我們將搭配電腦演進的歷史來介紹作業系統的演變。
7.2.1 真空管時代的電腦作業系統 • 在此階段中,作業系統的概念其實尚未成形,主要是因為電腦的運算速度慢,記憶體容量小,能夠執行的工作非常少,在當時甚至還沒有程式設計的觀念(真空管電腦連開機都必須等待一段很長的時間來熱機)。 • 對於真空管電腦而言,使用者只想要讓電腦做一些簡單重複性的動作,此時需用使用插卡(Plug-board)來驅動電腦執行相關動作。
7.2.2 電晶體時代的電腦作業系統 • 電晶體時代的電腦作業方式必須透過讀卡動作來控制,程式設計師利用固定格式的卡片來撰寫程式,透過讀卡設備將程式輸入到電腦中,然後電腦會自動執行這些程式。程式的長短不一,有時候一個程式就必須使用許多張卡片,而執行一個程式稱為執行一個工作(Job),由於是採用批次作業的方式,因此此類作業系統稱為批次處理系統(Batch processing system)。 • 所謂批次處理代表工作群是採用整批且中間不間斷的作業方式,換句話說,一個工作(Job)在被執行完畢之前,絕對不會去執行其他的工作;並且工作事先被編排好順序,當前面一個工作被執行完畢後,將繼續執行下一個工作。批次處理的過程中,不會有人為的動作介入 • 而安排工作的程式稱為工作控制程式(Job Control Program),它會將工作事先進行適當的排序,先收集同一類性質的工作,再將這些工作以批次方式來處理。 批次處理示意圖
7.2.2 電晶體時代的電腦作業系統 • 批次處理作業系統是一種單工系統(Single-task system),也就是說,它一次只服務一個使用者。當有多個使用者時,必須等到前一個使用者服務完成後,後面的使用者才能進入系統執行工作,所以如果該前一個使用者的工作必須進行I/O的存取時,則其他資源必須等到I/O完成後,才能繼續服務其他使用者的工作,而I/O是非常耗時的工作,因此,早期的作業系統通常會使用批次處理的方式,來增加電腦資源的使用率。例如OS/360作業系統。 • 現代的作業系統仍然可以使用批次處理方式,例如Unix shell可以結合多個指令形成一個新定義的指令,而MS-DOS可以使用BAT檔執行批次任務。 單工系統示意圖
7.2.2 電晶體時代的電腦作業系統 • 往返時間(Turnaround Time)是評鑑一個批次處理系統成功與否的指標,往返時間就是指使用者開始委託(Submit)電腦工作直到所委託的所有工作都完成所需要的時間。 • 舉例來說,假設使用者A希望先計算成績總和,然後再將結果列印出來,使用者B希望透過電腦求出 的數值。因此一共有3個工作,其中使用者A的工作分別為使用(1)CPU計算。(2)使用印表機列印。使用者B的工作則為(3)CPU計算。 • 請注意,使用者A的CPU計算工作其實耗費時間很少,假設只需要花費3秒,但使用者A的列印工作耗費時間很多,假設需要耗費10分鐘。而使用者B的CPU計算工作也很少,假設需要耗費10秒。 • 假設先服務使用者A,然後再服務使用者B,在不使用工作控制程式的情況下,使用者A可以使用電腦10分03秒,完成工作(往返時間為10分03秒),但使用者B則必須等待10分03秒後,才能夠花費10秒鐘完成工作(往返時間為10分13秒),這對於使用者B來說,必須等待非常久的時間,但它卻只要求電腦服務極短的時間,這將會讓使用者B不太願意使用電腦,例如或許他用手算計算 值也只需要花費5分鐘而已。
7.2.2 電晶體時代的電腦作業系統 • 批次作業的意義在於,先透過工作控制程式將使用CPU計算的工作合併批次處理,再將使用印表機列印的工作合併批次處理,也就是將順序調整為(1)使用者A的CPU計算,(2)使用者B的CPU計算,(3)使用者A的列印工作。 • 如此一來,使用者B只需要等待3秒鐘後,就可以使用電腦完成工作。而使用者A也不會感覺等待太久。因為使用批次處理的結果,使用者B一共等待了13秒(往返時間為13秒),工作就完成了(而其中他真正使用電腦的時間為10秒),而使用者A一共等待了10分13秒(往返時間為10分13秒),工作就完成了(而其中他真正使用電腦的時間為10分3秒)。 • 對於使用者而言,這與未使用批次處理的效果(使用者B等待10分13秒完成工作,使用者A等待10分3秒完成工作)明顯改善了許多。
7.2.3 積體電路時代的電腦作業系統 • 積體電路使得電腦的運算速度加快許多,並且提供了比較大的記憶體容量,因此在此階段的作業系統朝向提供多工的方向努力,以下是此時期作業系統的特點: • 週邊線上同時處理(Simultaneous Peripheral Operation On Line;簡稱SPOOL) • 多重程式處理(Multiprogramming) • 分時處理(Time sharing processing) • 週邊線上同時處理(Simultaneous Peripheral Operation On Line;簡稱SPOOL) • 分享專屬設備是分享的一大難題,所謂專屬設備(Dedicated Device)指的是在某一個程式使用該設備尚未結束時,其他程式不能使用該設備,例如印表機就是專屬設備的一種。 • 週邊線上同時處理(Spooling)可以有效地解決共用專屬設備所衍生的問題,它將專屬設備模擬成分享設備(Shared Device),並且能夠正確有效的運作,例如共用印表機時,不會發生你印一行,我印一行的問題。
7.2.3 積體電路時代的電腦作業系統 • 週邊線上同時處理的控制程式稱為Spooler,它利用磁碟作為暫存裝置,先將等待執行的工作存放於磁碟中,然後控制程式依序在磁碟中讀入這些工作並且進行處理。以列印工作為例,首先,Spooler會將所有要列印的輸出資料暫時儲存於硬碟中,然後依據印表機的使用狀況,依序由磁碟中,將這些資料由印表機輸出。 • 週邊線上同時處理使得一個程式的I/O動作與另一個程式CPU計算工作得以同時進行,因此不但增加了CPU的使用率,也增加了I/O設備的使用率。 線上同時週邊處理(Spooling)
7.2.3 積體電路時代的電腦作業系統 • 多重程式處理(Multiprogramming) • 為了使得多個程式可以同時執行(嚴格來說只是一個同時執行的假像),發展了多重程式處理技術,它可以使得CPU一直處於忙碌狀態,而不會等待程式進行週邊的運作,進而提昇電腦系統的整體效率。 • 在單工系統中,前面的程式必須執行完畢才會進行後面的程式,若前一個程式遇到I/O處理時,CPU將進入閒置的狀態,因此單工系統的整體效能表現並不佳。 • 在支援多重程式處理的系統中,多個程式都會被載入到記憶體中,而當某一個程式進行I/O作業時,CPU就會切換到另一個工作,使得多個工作可以並行處理(concurrent),達到類似同時執行多個程式的效果。 • 雖然,在任何的單一時間點內,CPU只能執行某一個程式,但多重程式處理透過切換工作的方式,使得CPU持續保持忙碌狀態,如此便可以提高電腦的產量以及CPU的使用率。
7.2.3 積體電路時代的電腦作業系統 【產量】 產量(Throughput)指的是單位時間的工作量,例如每單位時間完成多少個工作或程式。 多重程式處理
7.2.3 積體電路時代的電腦作業系統 • 分時處理(Time sharing processing) • 分時處理也是利用多重程式處理的方式,但它主要應用於交談式系統的多使用者環境。 • 對於批次處理而言,它透過事先的批次排序工作,讓多個使用者的等待時間平均化,以提高整體效率,但由於批次處理中途不允許人為的介入,因此無法透過交談方式來執行程式(所有的工作都必須事先安排好順序,中途不可改變)。因此,當面臨多使用者環境,且又希望程式可以透過與使用者的交談來決定下一步驟的動作,則無法使用批次處理方式來增加效率。 • 分時系統將CPU時間分成許多小段,稱之為時間配額(Time Slice) • 例如50ms,程式被執行時,代表正在執行屬於該程式的時間配額 • 當該時間配額執行完畢後,CPU控制權將交給下一個程式執行,如此輪流執行各程式的時間配額,直到所有程式被執行完畢為止。 • 當程式必須進行I/O作業時(例如等待使用者的輸入),程式將被移轉到懸置佇列(Blocked Queue)內排隊,而CPU排程則至等待佇列中,取出下一個程式交由CPU執行工作,此時CPU排程會重新分配時間配額,讓每個使用者享有相同的時間片段。而當放在懸置佇列內的程式等待的事件發生時,則進入等待佇列的末端,與等待佇列內的各程式輪流使用CPU。
7.2.3 積體電路時代的電腦作業系統 • 從另一個角度來看,一個程式將被切割為不連續的多個時間配額,所以整體來看,所有的程式是共用CPU的,但由於每一個時間配額的時間其實都非常短,如果程式總數不多,使用者就不會感覺到和別人共用同一個CPU,故而不但能夠提供多使用者環境,且每個使用者也可以透過交談方式操作電腦。 分時處理系統
7.2.3 積體電路時代的電腦作業系統 • 回應時間(Response time)是評鑑一個分時系統成功與否的指標,回應時間指的是使用者輸入指令,直到電腦回傳該指令執行結果的時間。 • 當回應時間在人類無法感受到與別人共用一台電腦的時間範圍內,則代表該分時系統是成功的。 • 而通常回應時間和機器的處理速度以及時間配額的大小有關,機器處理速度不是作業系統能夠控制的(與硬體有關),因此設計此類作業系統的責任是調整合理的時間配額 • 通常,時間配額越短(當然不可以過短,否則將造成過多的額外控制負擔),使用者可以獲得較滿意的回應時間。
7.2.4超大型積體電路時代的電腦作業系統 • 超大型積體電路(VLSI)不但使得電腦的運算更快、大幅度提昇記憶體容量,並且在超大型積體電路技術成熟的因素下,使得相關的晶片(例如CPU)價格大幅降價,進而使得整組電腦的價格也大幅降價,這使得更先進的作業系統可以提供更多的服務,此時期作業系統所衍生的新議題如下: • 即時處理(Real-time processing) • 多處理器系統 (Multiprocessor) • 分散式處理(Distributed processing)
7.2.4超大型積體電路時代的電腦作業系統 • 即時處理(Real-time processing) • 在許多的應用場合中,電腦的處理速度被嚴格要求,例如對於自動駕駛系統而言,如果在駕駛速度非常快的狀況下,電腦無法在規定時間內做出判斷,則會面臨極度的危險。為了符合此種要求,因此發展了即時處理系統。即時處理系統詳細的定義如下: • 即時處理系統能立即針對問題做出反應,並在規範的條件內自動執行相關軟體,且必須得到正確結果。 • 在即時處理系統中,最嚴格的要求就是反應時間(Response Time),而即時處理系統又可以分為硬性即時(Hard Real Time)及軟性即時(Soft Real Time)兩種。 • 硬性即時系統的要求是,必須在限制的反應時間內,即時反應並完成所有需要被處理的工作。 • 軟性即時系統的要求則比較寬鬆,只要能夠在限制的反應時間內即時反應,但在此時間過後,程式仍然可以持續佔用CPU進行後續處理,以求得更佳的解答。
7.2.4超大型積體電路時代的電腦作業系統 • 多處理器系統 (Multiprocessor) • 隨著晶片價格的下降,在一部電腦內含有多個CPU的電腦結構也更為常見,此類系統稱為多處理器系統(Multiprocessor Systems),在多處理器系統內的CPU可以同時執行工作,並且使用共用的匯流排、時脈、記憶體及週邊設備,此外,共用的作業系統也必須經過特別設計。 • 多處理器作業系統能夠讓多顆CPU同時執行工作,所以又稱為平行系統(Parallel System)。由於這些CPU共用同一部電腦內的資源,因此屬於緊密性系統(Tightly Coupled System)。 即時處理
7.2.4超大型積體電路時代的電腦作業系統 • 由於在一部電腦內有許多顆CPU,因此產量得以增加,除此之外,電腦系統的可靠度也提高了,換句話說,多處理器系統擁有優雅衰減(Graceful Degradation)的特色,例如在多處理器系統中,損壞一顆CPU,並不會使得電腦系統完全停止運作,而只是讓電腦系統的執行效率降低而已。由於優雅衰減的特色,使得多處理系統擁有處理軟性失誤(Fail Soft)的功能。 多處理器系統
7.2.4超大型積體電路時代的電腦作業系統 • 多處理器系統執行程式的方式有兩種 • (1)一個程式同時分配給多個CPU執行,以便快速完成運算。 • (2)將每個程式分配給一個CPU執行,若程式間必須傳遞訊息,則透過系統執行同步(Synchronous)機制來解決。 • 多處理器作業系統依照硬體結構則可以分為(1)對稱性多重處理(Symmetric Multiprocessing )系統 及(2)非對稱性多重處理(Asymmetric Multiprocessing)系統。 • 對於對稱性多重處理系統而言,所有的CPU都是處於同等地位,並沒有一個主CPU做控管的機制,作業系統依照需求分派工作給各CPU,這些CPU則透過匯流排互相傳遞訊息以便分工合作。 • 對於非對稱性多重處理系統而言,CPU中有一個會作為主處理器(Master Processor),並且由主處理器來執行作業系統,其他的CPU則稱為從屬處理器(Slave Processor),從屬處理器只接受並執行主處理器所交代的工作,換句話說,非對稱性多重處理結構的設計基礎就是主從式架構。
7.2.4超大型積體電路時代的電腦作業系統 • 分散式處理(Distributed processing) • 分散式處理是比較新的作業系統設計技巧,具有分散式處理的系統稱為分散式系統(Distributed Systems),它將多部電腦透過通訊線路(Communication Lines)加以連接,使得彼此可以共用資源、交換訊息及分工合作。 分散式處理系統
7.2.4超大型積體電路時代的電腦作業系統 • 在分散式系統中,每個CPU可以擁有屬於自己的區域記憶體(local memory),而相對於多處理器系統而言,分散式系統屬於鬆散性系統(Loosely Coupled System)。透通性(Transparency) 是分散式作業系統的一大特色,它代表著使用者不需要關心他的程式被分配到哪些處理器以及如何被執行,因為這是分散式作業系統的責任, • 分散式系統為了讓程式在不同處理器上同時執行,必須在許多方面進行更細緻的設計,因此,分散式系統的設計相對於傳統系統複雜了許多。而分散式系統又可以細分為網路作業系統(Network Operating Systems;簡稱NOS)及分散式作業系統(Distributed Operating Systems;簡稱DOS)兩種。 • 對於網路作業系統(NOS)而言,它允許連接在一起的電腦使用不同的作業系統。當這些電腦需要共用資源時,則可以透過遠端登錄或檔案傳輸的方式來分享資源,例如FTP伺服器及WWW伺服器都可以歸類為此類作業系統的服務。 • 對於分散式作業系統(DOS)而言,所有連接在一起的電腦都必須使用相同的作業系統。並且所有的遠端資源,在邏輯上都被作業系統視為系統本身的資源,因此可以直接存取。
7.2.5 現代化作業系統 • 作業系統經過多年來的技術演進,一個現代化的作業系統通常具有下列特色: • 具備批次處理特性。必須擁有大量的記憶體以便事先將工作安排完畢,不必然需要以互動方式操作電腦,電腦即可進行這些工作。 • 具備週邊線上同時工作能力。例如使用者不該等待印表機列印而無法從事其他工作。 • 具有多工能力,包含多重程式處理以及多人使用環境。 • 具備分時系統功能,也就是多人使用環境的基礎。 • 可提供安排工作優先等級的機制。 • 具備網路通訊及共用資源的能力。 • 提供分散式系統環境,以提高產量。
7.2.5 現代化作業系統 • 【未來的作業系統】: • 未來的作業系統,應該具備怎麼樣的新功能呢? • 針對目前現有的問題與需求,我們可以預見未來的作業系統必須在安全性上加強,例如減少本身的漏洞,最好是直接將防毒軟體也視為必要軟體。 • 另一方面,隨著數位家庭時代的來臨,數位家庭電子設備的核心設備(可能是PC,也可能是電視)所需要的作業系統必須具有高度整合性,以及對各類網路、無線網路、無線傳輸的支援。
7.3 程序與CPU管理 • 電腦的核心是CPU,作業系統若能對CPU善加管理,將可以使得系統的整體效能得以大幅提升,CPU管理最顯著的範例就是多工系統,為了讓多個程式或多個使用者能夠共用電腦,因此必須對於CPU有所管理 • 在介紹CPU的管理之前,首先我們必須先說明一些關於CPU管理的專業術語(Terminology)。 • 程序(Process) • CPU執行的對象是程序(Process),對於現代作業系統核心而言,程序是指一個正在執行中的程式 • 更詳細地說,程式(Program)本身並非程序,程式只是單純的被動實體(例如一個檔案內容),而程序則是主動實體,它會指出下一步要執行的指令。 • 一般而言,一個程式在運作時會產生一個或多個程序,這些程序將交由CPU執行,並透過作業系統加以管理。
7.3 程序與CPU管理 • 一個程序從建立到結束之間,可能處於五種狀態: • 建立(New):建立程序所需要的各項資訊,然後新建立的程序將在Job佇列中排隊進入準備狀態。 • 準備(Ready):程序已經準備好可以被指派到某個CPU執行。處於準備狀態的程序可能有很多個,由於CPU的數量有限,所以必須在Ready佇列中排隊等待執行。 • 執行(Running):程序正在被CPU執行指令。 • 等待(Waiting):原本正在執行的程序,由於某些事件的發生(通常是I/O事件),故而暫停程序的服務,並將程序狀態更改為等待狀態。等待狀態的程序與準備狀態的程序不同,即使CPU有空也不會立刻處理等待狀態的程序;等待狀態的程序必須在Waiting佇列中排隊,先將等待狀態更改為準備狀態。 • 結束(Terminated):程序已經完全執行完畢,此時的工作是釋放程序所佔用的所有資源。
7.3 程序與CPU管理 • 程序為執行狀態(Running)代表程序正在被執行,但程序不一定一次就會執行完畢,它也可能會因為下列各種狀況而改變狀態,其狀態移轉如圖7-15所示。以下是狀態轉移時機的說明: 程序狀態移轉圖
7.3 程序與CPU管理 • (1)【建立 → 準備】:只要Ready佇列中仍有空位,就會將Job佇列中新建立的行程移往Ready佇列中。 • (2)【準備 → 執行】:若有空閒的CPU,將會由排程程式(Scheduler)挑選Ready佇列中的程序來執行。 • (3)【執行 → 準備】:發生某些中斷(Interrupt)事件時(例如分配的時間配額已經用完),將會暫停尚未執行完畢的程序,該程序將被移往Ready佇列中等待下一次CPU有空閒時再服務。 • (4)【執行 → 等待】:發生某些需要較長時間處理的事件時(例如I/O事件),將會暫停執行中的程序,該程序將被移往Waiting佇列中。 • (5)【等待 → 準備】:當需要長時間處理的事件處理完畢後(例如I/O事件已經處理完畢),將會把程序移往Ready佇列中等待下一次CPU有空閒時再服務。 • (6)【執行 → 結束】:程序已經完成所有的執行動作,將會被變更為結束狀態,此時只要釋放程序所佔用的資源,該程序就告終止。
7.3 程序與CPU管理 • 工作量(Throughput) • 在前面章節中,我們曾介紹過工作量(產能)代表在某一段時間內,電腦系統所能完成的工作數量。而在作業系統的CPU管理中,工作量(產能)則被定義為在某一段時間內,電腦系統所能完成的程序數量。當然工作量越高代表程序執行效能越佳,這與CPU排程有很大的關係。 • 執行緒(Thread) • 現代的作業系統不但以程序來切割工作,程序還可以分為多個執行緒(Thread),這些執行緒同屬一個程序,共用同一記憶體空間位址,但卻可以擁有自己的控制流程。 • 在支援多執行緒(Multi-Threading)的系統中,執行緒可以共用CPU時間,類似於多重程式處理的分時程式 • 舉例來說,IE瀏覽器就是一個多執行緒程式,在Windows系統中,不但可以一邊瀏覽網路,也可以同時列印資料。若讀者曾有IE瀏覽器發生錯誤時的經驗,就可以發現,一旦某一個執行緒產生錯誤而被不正常中斷時,將會關閉所有的IE執行緒,使得所有的IE視窗全部被關閉(因為這些執行緒都同屬一個IE程序)。但若是經由正當方式關閉某一個IE6視窗時,其實只會關閉一個IE執行緒,而不會關閉整個IE程序。
7.3.1 排程 • 當資源有限而需要被服務的對象很多時,服務勢必有先後順序,這個順序關係稱之為排程(Schedule)。 • 舉例來說,對於一個電腦系統而言,CPU數量是有限的(甚至很多系統的CPU只有一個),但為了提供多使用者及多程式的服務,所以我們就需要對這些服務需求進行排程。 • 在電腦領域中,安排服務順序所提出的方法稱之為排程演算法(Schedule algorithm),而實現排程演算法的程式稱為排程程式(Scheduler)。針對使用CPU服務的排程則可以稱之為CPU排程或程序排程(Process Scheduling)。 • 程序的特性 • CPU排程與程序的特性有關,一般來說,我們可以依照程序的CPU指令及I/O指令,將程序(process)區分為下列兩大類: • I/O存取較多的程序(I/O Bound Process):此類程序的I/O存取動作比較多(相對於CPU運算而言),例如列印報表程序即是一例。 • CPU運算較多的程序(CPU Bound Process):此類程序的CPU運算動作比較多(相對於I/O存取而言),例如數值計算程序即是一例。
7.3.1 排程 • 排程程式種類 • 排程程式可以分為長程、短程、中程等三大類,分別適用於不同的時機。 長程、短程、中程排程程式
7.3.1 排程 • (1)長程排程程式(Long-term scheduler): • 此類排程主要是應用在選取工作方面,所以也稱之為工作排程程式(Job scheduler)。 • 工作排程會選擇停留在Job佇列中的工作,將其相關的程序載入到Ready佇列中等待CPU服務。 • 因此對於多重程式系統而言,長程排程程式直接影響了記憶體中同時存在程序的數量,由於程序與程式有對應關係,因此,我們可以利用它來控制多重程式的程度(Degree of multiprogramming)。
7.3.1 排程 • (2) 短程排程程式(Short-term scheduler): • 短程排程程式是在Ready佇列中選取程序,交由CPU執行,所以又稱為CPU排程程式(CPU scheduler)。 • 簡單的說,CPU排程程式的工作就是不要讓CPU閒置,每當CPU閒置時(例如程序執行完畢、程序進行I/O存取、程序暫時被移出等等),它就會從主記憶體的Ready佇列中挑選程序供CPU執行。 • 在多工的系統中(尤其是分時系統),短程排程程式的執行非常頻繁,因為每個程序每一次使用CPU的時間非常短。 • (3)中程排程程式(Medium-term scheduler): • 中程排程程式的應用場合介於長程與短程排程之間。 • 當CPU發生競爭過於激烈時(Ready佇列內的程序過多),將使得CPU排程程式的負荷過重,此時中程排程程式會利用置換(Swapping)技術,將某些停留在Ready佇列內的程序暫時從主記憶體移出到磁碟上(swap out),以便減輕CPU排程程式的負荷,等到Ready佇列內的程序不那麼多時,再將這些程序由磁碟移入到主記憶體(swap in)。
7.3.2 排程演算法 • 任何一個排程程式都有一套排程演算法以決定該服務那一個需求,在這一節中我們將介紹幾種常見的排程演算法 • 這些排程演算法它不只可以應用於CPU排程,也可以應用於其他各種排程(資訊科學的特點便是如此,基本觀念大多相同,只是應用領域有一點點不同而已),但為了更具體說明,我們將以CPU排程為例來加以說明。 • (1)先到先做(First-Come-First-Serviced;簡稱FCFS): • 越早到Ready佇列排隊的排程將越早被處理,所以Ready佇列可以使用具有FIFO(First-In-First-Out)特性的佇列資料結構來實作。 • (2)優先權(Priority): • 每一個在Ready佇列中的程序都事先被定義其優先權,優先權越高的越先被服務。 • (3)循環分配(Round-Robin;簡稱RR): • RR排程演算法只適用於分時系統,由於每一個程序都會被配置一個時間配額,當時間配額執行完畢後,CPU切換到下一個程序,而原來的程序若尚未執行完畢,則必須重新回到佇列中等待,如此形成一個循環狀態。
7.3.2 排程演算法 • (4)最短工作優先(Shortest-Job-First;簡稱SJF): • 每個程序需要CPU服務的時間不一定相同,而SJF排程演算法會按照程序所需要的CPU服務時間長短做為挑選依據,並且所需時間越短的會越早被挑選出來。 • (5)最短剩餘時間優先(Shortest-Remaining-Time-First;簡稱SRTF): • SRTF也是以CPU時間的長短來決定要執行哪一個程序,但此處所稱之CPU時間則專指剩餘需要服務的CPU時間,並且不只是Ready佇列內的程序是目標對象,連正在執行的程序也必須考慮在內。 • SRTF與SJF有些相似,所以又稱為先佔式最短工作優先(preemptive SJF)排程。 • 唯一不同的是,SJF的程序一旦被CPU服務後就不會被其他程序插隊(non- preemptive),而SRTF的程序即使已經進入執行狀態,仍可能被準備狀態的程序插隊(preemptive)。 • 下圖是SJF與SRTF的範例。
7.3.2 排程演算法 SJF與SRTF排程演算法
7.4 記憶體管理 • 硬碟內的程式是靜態的,當程式真的要被執行時,必須先載入到主記憶體中,CPU才能執行這些程式,由於記憶體容量有限,因此在多工及多使用者的環境下,必須透過某些記憶體管理方式,讓所有要被執行的程式輪流載入記憶體中並被CPU所執行。 • 記憶體管理也隨著時代演進而改變,從早期的單一程式處理到後來的多重程式處理,以及虛擬記憶體觀念等等都將在這一節中加以介紹。
7.4.1 傳統記憶體管理 • 早期電腦只能夠一次處理一個程式,完全沒有多工的能力,記憶體的分配方式也非常簡單,除了作業系統核心之外,就是使用者程式,有些作業系統核心會放置在低記憶體位址,有些則會放置在高記憶體位址。 早期電腦的記憶體配置
7.4.1 傳統記憶體管理 • 單一程式處理(Monoprogramming) • 事實上,圖7-18就是單一程式處理的記憶體管理方式,記憶體的某一塊區域被劃分為作業系統核心(Kernel)作為監督程式(Monitor),剩餘的部分則為使用者程式可以使用的部分。這種記憶體配置方式一次只能載入一個程序,若有兩個以上的程序要被執行的話,必須等到前一個程序被執行完畢,完全釋放記憶體空間之後,才能載入下一個程序,如下圖。
7.4.1 傳統記憶體管理 單一程式處理的記憶體配置
7.4.1 傳統記憶體管理 • 重疊的單一程式處理(Monoprogramming with Overlay) • 雖然單一程式處理的記憶體管理非常簡單,一次只需要載入一個程序,但即使如此,當程序過大時,仍然會面臨記憶體容量不夠用的問題(例如使用者程式須配置720KB記憶體,但全部的可用記憶體空間卻只有640KB)。 • 『重疊』(Overlay)技術就是為了解決程式大於記憶體空間所發展的技巧,它將大的程式分為若干片段程式模組,記憶體內只會保留執行時所需要的模組與資料,其他尚未需要使用到的模組將存放在磁碟中,若發現要執行的程式不在記憶體中,則透過置換方式將磁碟內的程式模組載入記憶體,並取代原先在記憶體中的程式模組,由於記憶體類似被重複覆蓋的共用方式,因此稱之為重疊。