日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【学习笔记】操作系统之哲学原理

發布時間:2024/9/30 windows 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】操作系统之哲学原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 引言:
    • 魔術與管理
    • 用戶程序與操作系統
  • 進程、內存和文件
    • 進程原理
    • 進程的狀態
    • 操作系統管理進程
    • 進程調度
    • 調度算法
      • 1.先來先服務調度算法
      • 2.時間片輪轉算法
      • 3.短任務優先算法
      • 4.優先級調度算法
      • 5.混合調度算法
    • 進程調度的過程

引言:

很多人都覺得操作系統枯燥、乏味,甚至令人厭煩。更有人說懂不懂操作系統沒有關系。不是很多人在學習操作系統之前就已經寫過程序了嗎?有的人甚至已經寫過很大很復雜的程序了。可見,不懂操作系統并不妨礙我們學習使用計算機。 如果讀者這樣想,我勸你再想一想。你雖然寫過程序,可你知道程序到底是如何在計算機上運行的嗎?如果不知道,你怎么敢肯定你的程序總會運行正確呢?你怎么敢說你寫的程序最大限度地利用了系統的能力呢?一個人覺得操作系統沒用,那是因為他不知道怎么用,或者他沒有用操作系統的意愿。說明白一點,如果你認為操作系統沒有用,那是因為你的編程和程序開發處在一個低級的水平上。如果你掌握了操作系統,你的編程水平將顯著提高。 換句話說,操作系統有沒有用,我的回答是"As you will"。你如果有意愿或者有行動使用操作系統,操作系統就是有用的;如果你沒有意愿或行動,則操作系統就是沒有用的。

程序的運行至少需要如下四個因素:
★ 程序設計語言。
★ 編譯系統。
操作系統。
★ 指令集結構(計算機硬件系統)。

我們可以給操作系統下定義:
★ 操作系統是一個軟件系統;
★ 操作系統使計算機變得好用(將人類從繁瑣、復雜的對機器掌控的任務中解脫);
★ 操作系統使計算機運作變得有序(操作系統掌控計算機上所有的事情)。總結起來就是:操作系統是掌控計算機上所有事情的軟件系統。
從這個定義可以引申出操作系統的功能:
★ 替用戶及其應用管理計算機上的軟硬件資源。
★ 保證計算機資源的公平競爭和使用。
★ 防止對計算機資源的非法侵占和使用。
★ 保證操作系統自身正常運轉

魔術與管理

提升上面所列的操作系統功能,可以得出操作系統所扮演的兩個根本角色:管理者和魔術家。只要記住了這兩個角色,就差不多明白了什么是操作系統。

魔術家角色 魔術家的目標是把差的東西變好,把少的東西變多,把復雜變簡單。同樣,操作系統將計算機以一個更加容易、更加方便、更加強大的方式呈現給用戶。例如,如果在裸機上直接編程是很困難的,因為各種數據轉移均需要用戶自己來控制,對不同設備要用不同命令來驅動,而這對一般人很難勝任。操作系統將這些工作從用戶手中接過來,從而讓用戶感覺編程是一件容易的事(相對來說,編程對于有些人來說永遠很難), 操作系統通過進程抽象讓每一個。 用戶感覺有一臺自己獨享的CPU;通過虛擬內存抽象,讓用戶感覺物理內存空間具有無限擴張性,這就是把少變多。當然,操作系統的把少變多不是無中生有,變多也不是無限多,只是針對磁盤容量的大小。
管理者角色 操作系統管理計算機上軟硬件資源。例如,操作系統對CPU、內存、磁盤等的管理,使得不同用戶之間或者同一用戶的不同程序之間可以安全有序地共享這些硬件資源。那怎么讓用戶很好地利用這些硬件資源呢?就是分塊(parcel out),把硬件分塊給應用程序使用。這里關鍵的原則是有效和公平,這是管理者的必備素質。有效指的是不能浪費資源,公平指的是每個人都有可能享有資源,即不能有不公平的現象。當然真正的公平是沒有的事,這很像人類生活的現實。不過追求公平卻是我們的本能,在虛擬世界里盡可能公平一點還是非常應該的,至少應該是設計操作系統時的不懈追求。

根據管理的資源不同,操作系統具體功能如下:
★ CPU管理,即如何分配CPU給不同應用和用戶。
★ 內存管理:即如何分配內存給不同應用和用戶。
★ 外存管理:即如何分配外存(磁盤)給不同應用和用戶。
★ I/O管理:即如何分配輸入輸出設備給應用和用戶。 除了對上述資源進行管理和抽象外,操作系統作為掌控一切的軟件系統,其自身必須是穩定和安全的,即操作系統自己不能出現故障。因此,操作系統的設計還需包括如下兩項:
★ 健壯性管理:即如何確保操作系統自身的正常運作。
★ 安全性管理:即如何防止非法操作和入侵

CPU管理就是將要介紹的進程管理。進程管理的主要目的有3個:第一個是公平,即每個程序都有機會使用CPU。第二個是非阻塞(non-blocking),即任何程序不能無休止地阻撓其他程序的正常推進。如果一個程序在運行過程中需要輸入輸出或者因別的什么事情而發生阻塞,這個阻塞不能妨礙別的進程繼續前進。就像人類世界,缺了誰地球照樣旋轉。第三個是優先級。在人類生活中人的地位不完全一樣,地位高的就比地位低的優先級高。人類把自己生活中的這種關系搬到操作系統里面,就有了優先級的概念,即某些程序比另外一些程序優先級高。如果優先級高的程序開始運行,則優先級低的程序就要讓出資源。就像我們經常說的,我們堅決反對大鍋飯,應該讓一部分人(程序)先富起來。

內存管理主要是管理緩存、主存、磁盤、磁帶等存儲介質所形成的內存架構。為此目的,操作系統設計人員發明了虛擬內存的概念,即將物理內存(緩存和主存)擴充到外部存儲介質(磁盤、光盤和磁帶)上。這樣內存的空間就大大地增加了,能夠運行的程序的大小也大大地增加了。內存管理的另一個目的是讓很多程序共享同一個物理內存。這就需要對物理內存進行分割和保護,不讓一個程序訪問另一個程序所占的內存空間,專業術語稱為運行時不能越界。在生活中,就是我家的東西不希望你跑來拿。
外存管理通常也稱為存儲管理,它就是眾所周知的文件系統了。文件系統的主要目的是將磁盤變成一個很容易使用的存儲媒介以提供給用戶使用。這樣我們在訪問磁盤時無須了解磁盤的物理屬性或數據在磁盤上的精確位置,諸如磁道、磁柱、扇面等。當然,文件系統還可以建立在光盤和磁帶上。只是使用最為頻繁的文件系統都以磁盤為介質。
I/O管理也稱為設備管理,就是管理輸入輸出設備。I/O管理的目的有兩個:一是屏蔽不同設備的差異性,即用戶用同樣的方式訪問不同的設備,從而降低編程的難度;二是提供并發訪問,即將那些看上去并不具備共享特性的設備(如打印機)變得可以共享。

用戶程序與操作系統

操作系統上下分別是虛擬機器界面和物理機器界面。處于物理機器下面的是硬件,而硬件和操作系統的關系將是本書的關注點。處于虛擬機器界面上面的是應用軟件,應用軟件和操作系統的關系不是本書的重點,而是系統編程或底層編程等課程的關注點。在這里,我們只想來簡要討論一下應用程序和操作系統的關系,因為這個關系對理解操作系統非常重要。 那么,操作系統和應用程序之間是什么關系呢?很顯然,操作系統為用戶程序提供了一個虛擬機器界面,而應用程序運行在這個界面之上。但這個答案似乎太抽象,并不能幫助深入理解它們之間的關系。前面講過,操作系統是一個程序,而用戶程序也是程序,程序和程序之間能有什么關系呢?無非是調用和被調用的關系。 那操作系統和用戶程序之間到底誰是調用者,誰是被調用者呢?答案似乎很清楚:操作系統通過虛擬機器界面為用戶程序提供各種服務,用戶程序在運行過程中不斷使用操作系統提供的服務來完成自己的任務。例如,用戶程序在運行過程中需要讀寫磁盤,這個時候就需要調用操作系統的服務來完成磁盤讀寫操作;如果需要收發數據包,也需要調用操作系統的服務來完成。當調用這些服務時,控制從用戶程序轉移到操作系統,而操作系統在完成這些服務后將控制返回給用戶程序。在這種思維模式下,用戶程序是主程序,而操作系統是子程序。
但是有正就有反,這就是哲學中的矛盾論。如果我們從另一個角度來看,會得出相反的結論。系統啟動之后最先啟動的是什么程序?操作系統。用戶程序不能在操作系統啟用之前啟動(除非是很厲害的病毒)。在此之后,每次啟動一個用戶程序,都相當于操作系統將控制轉移給用戶程序;而在用戶程序執行完畢后,控制又回到操作系統。這樣看上去,操作系統是主程序,它在一生當中不斷調用各種應用程序,而每個應用程序執行完之后再回到操作系統。就這樣循環往復,直到無窮或機器關閉。在此種思維模式下,操作系統是主程序,用戶程序是子程序

 操作系統為主程序,用戶程序為子程序的圖示

進程、內存和文件

進程是操作系統里面的核心概念。它指的是一個運動中的程序。從名字上看,進程表示的就是進展中的程序。一個程序一旦在計算機里運行起來,它就成為一個進程。操作系統對進程的管理通過進程表來實現。進程表里存放的是關于進程的一切信息。在任何時候,進程所占有的全部資源,包括分配給該進程的內存、內核數據結構和軟資源形成一個進程核(core)。核快照(core image)代表的是進程在某一特定時刻的狀態。 如果在Linux或UNIX操作系統下編寫程序,在出現分段錯誤(segmentation fault)時,操作系統會自動進行核倒出(core dump)。“核倒出”把所有計算機的狀態保存在一個文件中,通過閱讀這個文件的內容可以得知溢出時的進程狀況,從而幫助調試程序。 進程與進程之間可以通信、同步、競爭,并在一定情況下可能形成死鎖。內存是操作系統里面的另一個核心概念。它是進程的存放場所。如何對內存進行管理,使得數據的讀寫具有高效率、高安全、高空間利用率和位置透明的特性是內存管理所要達到的目的。 ==文件是操作系統提供的外部存儲設備的抽象,它是程序和數據的最終存放地點。==如何讓用戶的數據存放變得容易、方便、可靠和安全是文件系統要解決的問題。

進程原理

顧名思義,計算機是用來進行計算的,或者說計算機的基本功能是計算功能。而進行計算的關鍵部件是計算機的芯片,即CPU。CPU能夠按照一定的順序進行正確計算是在一個指揮者的控制之下完成的。這個指揮者就是操作系統。操作系統對CPU進行管理的重要手段就是進程模型,或者說進程是操作系統這個魔術師施法的道具。 進程是操作系統演化過程中的一個里程碑,由于進程的出現,人類希望的并發從理想變為了現實。從根本上說,進程出現的動機是人類渴望的并發。進程的出現也讓操作系統的復雜性大為增加:由于需要對進程進行分離存儲而導致出現內存管理;由于需要讓不同進程有條不紊地往前推進而導致進程調度的出現。顯然,理解進程對理解操作系統十分重要,對其進行管理也就理所當然地成為操作系統的一個關鍵職責。


進程從根本上說是操作系統對CPU進行的抽象和裝扮

那么什么是進程呢?顧名思義,進程就是進展中的程序,或者說進程是執行中的程序。就是說,一個程序加載到內存后就變為進程。即: 進程=程序+執行 進程在Multics操作系統出現前叫做工作(job)。工作是IBM用于多道批處理程序設計中的概念。由于歷史的原因,Multics操作系統的研發人員不愿意承用IBM發明的術語,而將工作改為了進程(process)。那么進程出現的動機是什么呢? 什么是進展中的程序呢?
從物理內存的分配來看,每個進程占用一片內存空間,從這點上說,進程就是內存的某片空間。由于在任意時刻,CPU只能執行一條指令,因此任意時刻在CPU上執行的進程只有一個,而到底執行哪條指令由物理程序計數器指定。也就是說,在物理層面上,所有進程共用一個程序計數器。 而從邏輯層面上來看,每個進程可以執行,也可以暫時掛起讓別的進程執行,之后又可以接著執行。這樣,進程就需要某種辦法記住每次掛起時自己所處的執行位置,這樣才能在下次接著執行時從正確的地點開始。因此,從這個角度看,每個進程有著自己的計數器,記錄其下一條指令所在的位置。從邏輯上說,程序計數器可以有很多個。 而從時間上看,每個進程都必須往前推進。在運行一定的時間后,進程都應該完成了一定的工作量,即每次進程返回,它都處在上次返回點之后。這就像古希臘哲學家赫拉克里特說過的:“一個人不能兩次踏入同一條河流。
對于操作系統來說,進程是其提供的一種抽象,目的是通過并發來提高系統利用率,同時還能縮短系統響應時間。這種抽象聽上去很不錯。但這種抽象是如何實現的呢?或者說,操作系統如何實現進程呢? 首先,任何抽象都需要有一個物理基礎。對于進程來說,其物理基礎就是程序。程序運行在計算機上,而在計算機上運行首先需要解決的問題是進程的存儲:給進程分配合適的內存,讓其有一個安身之處。由于多個進程可能同時并存,因此進程的存儲需要考慮如何讓多個進程共享同一個物理內存而不發生沖突。操作系統解決這個問題的手段是內存管理。 此外,進程運行實際上是指進程在CPU上執行。那么如何將CPU在多個進程之間進行交接或切換,這就是進程實現需要解決的另一個問題。操作系統解決這個問題的手段就是進程調度:決定在什么時候讓什么進程使用CPU

多道編程的好處
人們發明進程是為了支持多道編程,而進行多道編程的目的則是提高計算機CPU的效率,或者說系統的吞吐量。例如,如果一個進程有20%的時間使用CPU進行計算,另外80%的時間用來進行I/O,則如果使用單道編程,CPU的利用率只有20%。但如果同時運行兩個這樣的進程,即進行所謂的2道編程,則CPU利用率將提高到36%(CPU只在兩個進程同時進行I/O時才處于閑置狀態,因此CPU的利用率為1-0.8×0.8=36%)。這里忽略了進程切換所需要的系統消耗。

進程的狀態

我們前面說過,進程可以在CPU上執行,也可以處于掛起狀態。顯然,一個進程至少有這么兩種狀態。那么進程還有別的狀態嗎? 如果進程在CPU上執行,自然就是執行狀態。而如果是掛起狀態呢?那就得看是什么原因掛起的。因為操作系統在進行進程調度時要從掛起的進程中選擇一個來執行,所以清楚一個進程掛起的原因對調度的有效推進十分重要。 那么進程掛起有哪些原因呢?首先是一個進程在運行過程中執行了某種阻塞操作,如讀寫磁盤由于阻塞操作需要等待結果后才能繼續執行,因此操作系統將把這個進程掛起,讓其他進程運轉。另外一種情況是一個進程執行的時間太長了,為了公平,操作系統將其掛起,讓其他進程也有機會執行。 這兩種掛起的原因十分不同:第一種掛起是進程自身的原因。這個時候,即使把CPU控制權交給它,它也無法運行。第二種掛起是操作系統的原因。進程自己并無問題。只要把CPU交給進程,它就可以立即運行。這樣,如果將掛起進程分為這樣兩類,操作系統在進程調度時就只需要查看第二類進程,而無須浪費時間查看第一類進程。 因此,將進程分為3種狀態:執行、阻塞和就緒,如圖4-5所示。 在3種狀態之間可以進行各種轉換。如果每個狀態都可以轉換為另外一種狀態,則一共有6種轉換:


★ 執行→就緒
★ 執行→阻塞
★ 阻塞→就緒
★ 就緒→執行
★ 阻塞→執行
★ 就緒→阻塞
問題是,上面的轉換并不是都可以發生。一個進程在執行時,因為運行時間太長,操作系統可以將其掛起,轉換為就緒狀態,因此第1種轉換是可以的。在進程執行過程中如果執行了某種阻塞操作,則進入阻塞狀態,因此第2種轉換也是可以的。一個阻塞的進程在其等待的資源到達后,就可以隨時執行,進入就緒狀態,因此第3種轉換也是可以的。最后,就緒進程由操作系統調度到CPU上就進入執行狀態,因此第4種轉換也是可以的。 但是第5、第6兩種轉換是不可以的。我們前面講過,阻塞進程即使被給予CPU,也無法執行,因此操作系統在調度時并不會在阻塞隊列里挑選。因此,阻塞狀態無法轉換為執行狀態。對于處于就緒狀態的進程來說,因為它并沒有執行,自然無法進入阻塞狀態。這就像一個人停滯不前,自然就不會有任何人成為其障礙。因此,就緒狀態無法轉換為阻塞狀態

操作系統管理進程

與一個社會管理人的過程類似,操作系統要管理進程就要維護關于進程的一些信息。當一個進程產生時,操作系統也需要為其創建記錄。操作系統用于維護進程記錄的結構就是進程表或進程控制塊(Process Control Block, PCB)。這個進程表或PCB中存放的就是有關該進程的資料。那么進程表里有什么資料呢?顯然,不同的操作系統維護的進程資料不盡相同。但一般來說,維護的資料信息應當包括寄存器、程序計數器、狀態字、棧指針、優先級、進程ID、信號、創建時間、所耗CPU時間、當前持有的各種句柄等。而采納的數據結構主要是線性表、鏈表和結構(struct),當然也可能使用樹和圖(網絡)結構。例如,Solaris的進程表就使用了上述4種數據結構。

進程創建在不同的操作系統里方法也不一樣。例如,UNIX將進程創建分為兩個步驟:第1步是fork,創建一個與自己完全一樣的新進程;第2步是exec,將新的進程的地址空間用另一個程序的內容覆蓋,然后跳轉到新程序的起始地址,從而完成新程序的啟動。而Windows使用一個系統調用就可以完成進程創建。這個系統調用就是CreateProcess。在調用該函數時我們把欲執行的程序名稱作為參數傳過來,創建新的頁表,而不需要復制別的進程。 UNIX和Windows的進程創建過程各有優缺點。UNIX的創建過程要靈活一些,因為我們既可以自我復制,也可以啟動新的程序。而自我復制在很多情況下是很有用的。例如,Web服務器在每收到一個用戶請求后,就創建一個新的一模一樣的進程來服務用戶請求。而在Windows下,復制自我就要復雜一些了。而且,共享數據只能通過參數傳遞來實現。


進程調度

進程的調度就是操作系統進程管理的一個重要組成部分。其任務是選擇下一個要運行的進程。那么如何進行選擇呢?要探明這一點,首先需要確定操作系統進程調度的目標是什么。有了目標,我們就知道選擇什么進程最合適了。 那么操作系統進程調度的目標是什么呢?這需要對進程使用CPU的模式進行分析。那么進程在執行時有什么樣的模式呢?

一般來說,程序使用CPU的模式有3種:一種是程序大部分時間在CPU上執行;另一種是程序大部分時間在進行輸入輸出;還有一種是程序介于前兩種模式之間。
第1種程序運行的模式是在CPU上執行較長時間,接著進行短暫的輸入,然后又在CPU上進行較長的運算,之后又進行短暫的輸入輸出操作,就這樣循環往復。這種程序由于使用CPU的時間遠遠長于其用于輸入輸出上的時間,因此稱為CPU導向(CPU-bound)或計算密集型程序。計算密集型程序通常是科學計算方面的程序。計算宇宙大爆炸各種參數的程序、矩陣乘法程序等就都是CPU導向的程序。
第2種程序則與第1種相反,這種程序的大部分時間用來I/O,每次I/O后進行短暫的CPU執行,因此稱為I/O導向(I/O-bound)或輸入輸出密集型程序。一般來說,人機交互式程序均屬于這類程序。如游戲程序以及講課時使用的PPT程序,都屬于I/O導向的程序。
第3種程序自然介乎二者之間,既有長時間的CPU執行部分,又有長時間的I/O部分。或者說,這種程序使用CPU和I/O的時間相差不大。這種程序稱為平衡型程序。例如,網絡瀏覽或下載、網絡視頻等就屬于此類程序。 自然,對于不同性質的程序,調度所要達到的目的也有所不同。例如,對于I/O導向的程序來說,響應時間非常重要;而對于CPU導向的程序來說,周轉時間(turnaround)就比較重要;對于平衡型程序來說,進行某種響應和周轉之間的平衡就顯得重要。

CPU調度就是要達到極小化平均響應時間、極大化系統吞吐率、保持系統各個功能部件均處于繁忙狀態和提供某種貌似公平的機制。 極小化平均響應時間就是要極小化用戶發出命令和看到某種結果之間所花費的時間,即減少做一件工作平均等待的時間;極大化系統吞吐率就是要在單位時間內完成盡可能多的程序,就是單位時間內能完成的工作數量,即整個系統運行效率高;保持系統各個功能部件繁忙就是要讓CPU和輸入輸出設備均處于忙碌狀態。由于CPU非常昂貴,讓其閑置顯然是一種浪費,因此保持CPU繁忙十分重要。就像生命非常珍貴,因此要一直保持學習繁忙狀態,才能不浪費生命。 提供公平就是要讓各個程序感到某種“平等”,即在CPU面前“人人平等”。公平是任何系統都應該努力達到的目標。因為沒有公平,該系統對用戶的吸引力就會急劇下降。這就像一個國家或者社會,如果缺乏公平,公民對該國家的認同度就會急劇下降一樣。 對于不同的系統來說,在調度目標方面也有一些細微的不同。例如,對于批處理系統來說,由于用戶并不坐在計算機前面等待結果,響應時間就顯得不太重要,但系統吞吐率、CPU利用率和周轉時間則很重要。 對于交互式系統來說,由于用戶在等待計算機,因此響應時間要很快。但在這里要注意的是適度性(proportionality)。適度性就是響應時間要和期望值相匹配。這里是說你不要超越用戶的期望。比如,用戶期待1秒鐘的響應時間,你就給他1秒鐘的響應時間,而不必提供0.1秒鐘的響應時間。這是因為,提供超出用戶期望的響應會增加系統設計的難度,而又不會提高用戶的滿意度(對于一個人來說,1秒鐘和0.1秒鐘的差別并不是很大)。 對于實時系統來說,調度就是要達到在截止時間前完成所應該完成的任務和提供性能可預測性。

調度算法

1.先來先服務調度算法

縮寫為FCFS(First Come First Serve)。誰先來,就先服務誰。這個算法所有地球人都能想到。因為先來先到是人的本性中的一種公平觀念,而且生活實際中這種規則隨處可見。例如,我們排隊買東西或者辦理政務體現的就是先來先到原則。 先來先到的一個隱含條件就是不能搶占,一個程序一旦啟動就一直運行到結束或者受阻塞為止。這是因為一旦允許搶占,就破壞了先來先到的原則。先來先到的優點就是簡單,人人都能理解,實現起來容易。而缺點則是短的工作有可能變得很慢,因為其前面有很長的工作。這樣就造成用戶的交互式體驗也比較差。例如,現在有兩個程序:A需要運行100秒,B需要運行1秒。A程序與B程序幾乎同時啟動,但B就是慢了一點兒,排在A之后執行,則需要等待100秒。這樣A的響應時間為100秒,而B的響應時間則為101秒,從而,平均響應時間100.5秒。那么響應時間非常慢。就像我們排隊辦理事情,你要辦理的事情只要幾分鐘就可辦好,而你前面的一個人辦理的事情因為復雜需要1個小時。這個時候你要等在他后面就十分不高興。這個時候你就想,要是每個人輪流辦理10分鐘事務的話,那多好呀。
自然,研究進程調度的人也想到了這一點,而這種輪流辦理的調度方式就是時間片輪轉。

2.時間片輪轉算法

時間片輪轉算法是對FCFS算法的一種改進,其主要目的是改善短程序的響應時間。其方法就是周期性地進行進程切換。例如,每1秒鐘進行一次進程輪換。這樣,短程序排在長程序后面也可以很快得到執行。因此長程序執行1秒后就得把CPU讓出來。這樣整個系統的響應時間就得到了改善。以前面的A、B程序為例,A需要運行100秒,B需要運行1秒。使用FCFS時系統平均響應時間為100.5秒。而使用時間片輪轉,則A在執行1秒后,CPU切換到進程B,在執行1秒后,B結束,A接著執行99秒。這樣A的響應時間是101秒,而B的響應時間為2秒。系統的平均響應時間是51.5秒。這顯然比FCFS的效率強多了。 仔細的讀者可能已經看出,系統響應時間依賴于時間片的選擇。我們因為選擇了1秒鐘的時間片,上述系統的響應時間是51.5秒。如果時間片是10秒鐘,則上述系統的平均響應時間將是65秒。如果選擇別的時間片,則響應時間還將不同。那我們自然想知道,到底選擇多大的時間片才合適呢? 顯然,如果選擇的時間片過大,時間片輪轉將越來越像FCFS,當選擇的時間片超過任何一個程序所需要的執行時間長度時,則完全退化為FCFS。而如果選擇的時間片過小,則進程切換所用的系統消耗將太多,使得系統的大部分時間花在進程的上下文切換上,而用來真正執行程序的有用時間很少,從而降低系統效率,并造成浪費。

那如何選擇一個合適的時間片呢?做研究。我們需要知道進行一次進程切換所用系統消耗和我們能夠承受的整個系統消耗,就可以得出合適的時間片。例如,如果每次進程切換需要消耗0.1毫秒的CPU時間,則選擇10毫秒的時間片將浪費約1%的CPU時間在上下文切換上;如果選擇5毫秒的時間片,則浪費約為2%;20毫秒的時間片,則浪費約為0.5%。如果我們能夠承受的CPU浪費為1%,則選擇10毫秒的時間片就很合理。

3.短任務優先算法

那么時間片輪轉真的那么公平嗎?當然不是。如果每個人的能力一樣,大家輪流坐莊當然比較公平,問題是每個人的能力并不完全一樣。讓一個能力很差的人與一個能力很好的人輪流執政恐怕沒有多少人會同意。我們不是因為不滿大鍋飯而提出讓一部分人先富起來嗎?而時間片輪轉就是大鍋飯!

從前面可以看出,時間片輪轉改善了所謂的系統響應時間的論斷也不一定經得起推敲。更為重要的是,時間片輪轉所達到的系統響應時間并不是我們所能達到的響應時間下限。如果有30個用戶,其中一個用戶只需要1秒鐘時間執行,而其他29個用戶需要30秒鐘執行,如果因為某種原因,這個只要1秒鐘的程序排在另外29個程序的后面輪轉,則它需要等待29秒鐘才能執行(假定時間片為1秒)。這個程序的響應時間和交互體驗就變得非常差。 那要改善短任務排在長任務后面輪轉而造成響應時間和交互體驗下降的辦法就是短任務優先(Shorted Time to Completion First, STCF)算法。這種算法的核心是所有的程序并不都一樣,而是有優先級的區分。具體來說,就是短任務的優先級比長任務的高,而我們總是安排優先級高的程序先運行。就像晚輩在公交汽車上見到長輩需要讓座一樣。 短任務優先算法有兩個變種:任務優先算法的原理是讓已經在CPU上運行的程序執行到結束或阻塞,然后在所有候選的程序中選擇需要執行時間最短的進程來執行。搶占式短任務優先算法則是每增加一個新的進程就需要對所有進程(包括正在CPU上運行的進程)進行檢查,誰的時間短,就運行誰。 顯然,由于短任務優先總是運行需要執行時間最短的程序,因此其系統平均響應時間在目前已經討論過的幾種調度算法里面是最優的。這就是STCF算法的優點。事實上,在所有非搶占調度算法中,STCF算法的響應時間最優。而在所有搶占調度算法中,搶占式STCF算法的響應時間最優。一種是非搶占,一種是搶占。非搶占短任務優先算法的原理是讓已經在CPU上運行的程序執行到結束或阻塞,然后在所有候選的程序中選擇需要執行時間最短的進程來執行。搶占式短任務優先算法則是每增加一個新的進程就需要對所有進程(包括正在CPU上運行的進程)進行檢查,誰的時間短,就運行誰。
但STCF調度算法也有缺點。第一是可能造成長程序無法得到CPU時間而導致“饑餓”。除此之外,還有一個重大缺點,就是我們怎么知道每個進程還需要運轉多久?難道我們能夠預測將來不成?就好像你第一次做某種事情時怎么知道需要多長時間呢? 這個時候就需要做研究!我們可以用一些啟發式(heuristic)方法來進行估算,例如,根據程序大小來推測一個程序所需CPU執行時間。但這個方法并不可靠。另外一個辦法就是先將每個程序運行一遍,記錄其所用CPU時間,這樣在以后的運行中,即可根據這個實測數據來進行STCF調度了。

4.優先級調度算法

前面介紹的STCF算法有一個缺點是可能造成長進程“饑餓”。但這個問題比較容易解決,使用優先級即可。優先級調度算法的原理是給每個進程賦予一個優先級,每次需要進程切換時,找一個優先級最高的進程進行調度。這樣,如果賦予長進程一個高優先級,則該進程就不會再“饑餓”。事實上,STCF算法本身就是一種優先級調度,只不過它給予短進程高優先級而已。 優先級調度的優點是可以賦予重要的進程以高優先級以確保重要任務能夠得到CPU時間。其缺點則與STCF算法一樣,低優先級的進程可能會“饑餓”。不過,這個問題在優先級調度算法里比在STCF里好解決:只要動態地調節優先級即可。例如,在一個進程執行特定CPU時間后將其優先級降低一個級別,或者將處于等待進程的優先級提高一個級別。這樣,一個進程如果等待時間很長,其優先級將因持續提升而超越其他進程的優先級,從而得到CPU時間。這樣,“饑餓”現象就可以防止。 不過,優先級調度還有一個缺點,就是響應時間不能保證,除非將一個進程的優先級設置為最高。即使將優先級設置為最高,但如果每個人都將自己進程的優先級設為最高,則響應時間還是無法保證。

5.混合調度算法

之前介紹的所有算法都存在缺點,我們自然想設計一個算法合并它們的優點,摒棄它們的缺點。這就是所謂的混合調度算法。該算法的原理是將所有進程分成不同的大類,每個大類為一個優先級。如果兩個進程處于不同的大類,則處于高優先級大類的進程優先執行;如果兩個進程處于同一個大類,則采用時間片輪轉來執行。混合調度算法的示意圖如圖5-3所示。

自然,CPU調度算法并不只有上面介紹的幾種。由于不同系統的目標不同,不同進程的性質和重要性不同,因此進程調度也就不同。事實上,調度算法非常多,有興趣的讀者可以參閱有關調度方面的大量論文。

進程調度的過程

前面的內容討論了進程調度的含義及各種調度算法,但調度一個進程對于操作來說意味著什么卻并沒有解釋。那么在更換進程的時候到底有哪些操作需要完成呢?首先,當然需要將當前進程的狀態予以保護,以便將來能夠重新執行。然后是將選中的進程的環境布置好,這包括設置寄存器、棧指針、狀態字等操作。最后是跳轉到選中的進程,也就是設置或恢復其程序計數器。下面給出的是調度進程時操作系統所執行的操作概覽: ★ 因時序或外部中斷或進程掛起而導致操作系統獲得CPU控制權。
★ 操作系統在所有就緒的進程中按照某種算法遴選進程。
★ 如果選中的是非當前進程,則操作系統將當前進程(中斷或掛起的進程)狀態予以保護。
★ 將選中的進程的環境布置好(設置寄存器、棧指針、狀態字等)。
★跳轉到選中的進程

總結

以上是生活随笔為你收集整理的【学习笔记】操作系统之哲学原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: xxxx国产片| 免费精品在线观看 | 国产欧美网站 | 91三级视频 | 97超碰福利 | 中文字幕av免费观看 | 久久狠狠婷婷 | 伊人影院在线观看视频 | 欧美精品成人一区二区三区四区 | 天天色天天看 | 少女视频的播放方法 | 69亚洲乱人伦 | 国产做爰全过程免费视频 | 成人h动漫精品一区 | 九色视频在线观看 | 制服丝袜一区二区三区 | 亚洲一区在线视频观看 | 欧美少妇xxxxx | 熟女自拍一区 | 日韩在线1| 日韩精品毛片 | 毛片视频在线免费观看 | 国产一区二区三区免费观看 | 四虎视频国产精品免费 | 免费在线看a | 色戒电影未测减除版 | 国产无遮挡a片又黄又爽 | 色呦呦视频在线 | 老妇女性较大毛片 | 国产艳妇疯狂做爰视频 | 国产一区二区在线精品 | 国产资源网 | 宇都宫紫苑在线播放 | 在线 色 | 麻豆视频播放 | 成人av综合网 | 久久久av免费 | 亚洲午夜在线播放 | 性色一区 | 蜜桃传媒一区二区亚洲av | 伊人tv| 亚洲视频在线观看网址 | 91传媒网站 | 日韩欧美的一区二区 | 久久久久久久国产精品视频 | av无线看 | 亚洲综合日韩在线 | 又黄又刺激的视频 | 影音先锋中文字幕人妻 | 光棍影院手机版在线观看免费 | 亚洲色图小说 | 欧美在线观看一区二区 | 国产精品美女久久久久久久 | 国产www | 黄色日批| 性色欲网站人妻丰满中文久久不卡 | 午夜亚洲AV永久无码精品蜜芽 | 国产在线视频在线观看 | 91精品人妻一区二区三区蜜桃2 | 理论片中文 | 精品人妻天天爽夜夜爽视频 | 永久免费不卡在线观看黄网站 | 99在线视频观看 | 国产自产 | 亚洲女人被黑人巨大进入 | 男人插入女人阴道视频 | 日韩经典第一页 | 男生裸体视频 | 三级无遮挡| 天天精品 | 人人超碰人人 | 国产又黄又 | 色偷偷中文字幕 | 免费视频国产 | 69成人网 | 久久99精品国产麻豆婷婷 | 国产激情一区二区三区在线观看 | 成人性生活免费视频 | 久久无码人妻丰满熟妇区毛片 | 岳乳丰满一区二区三区 | 久久久久久久久久久99 | 18禁裸乳无遮挡啪啪无码免费 | 久久精品一区二区三 | 日本中文字幕不卡 | 9l蝌蚪porny中文自拍 | 欧美黑人疯狂性受xxxxx野外 | 午夜一级在线 | 国产精品无码一区二区三区三 | 亚洲一区中文字幕 | 日韩一区二区三区网站 | 国产成人小视频 | 欧美日韩六区 | 亚洲天堂中文在线 | 日本久久综合 | 欧美日韩在线观看一区二区 | 国产成人久久婷婷精品流白浆 | 国产一区二区三区四 | 拔擦8x成人一区二区三区 | 亚洲女人天堂成人av在线 |