系統初始化
乙個程序發出系統呼叫,建立乙個新程序協作其工作
使用者請求建立乙個新的程序
乙個批處理昨夜的初始化
正常退出(自願的)
出錯退出(自願的)
嚴重錯誤(非自願)
被其它程序殺死(非自願)
程序有三種狀態:執行、阻塞、就緒
程序的實現是通過一張由作業系統維護的程序表,每個程序占用乙個程序表項,該專案中包含程序狀態的重要資訊(程式計數器,堆疊指標),根據這些資訊進行排程。通過中斷向量來實現不同程序間的切換。當該程序結束後,作業系統會顯示乙個提示符並等待新的命令
不同的程序和執行緒都存在公共資源和空間的問題,那麼為了避免兩個程序對資源同時占有的問題提出了互斥和訊號量兩個概念。其中互斥是指這個空間或者資源只允許一方使用,當有人使用時其他人不能使用;而訊號量則是允許幾個人同時使用,但有一定的使用方限制
當a處於臨界區時,b將不能進入而產生阻塞直到a離開臨界區
當多個程序或執行緒,如果有兩個或者多個程序處於就緒的狀態時,他們同時要使用cpu,這時就需要排程演算法來實現哪乙個先被cpu使用
(a)cpu密集型程序:cpu計算時間長,等待i/o輸入時間短
(b)i/o密集型程序:等待i/o輸入時間長,cpu計算時間短
fcfs是一種最簡單的排程演算法,該排程演算法既可以用於作業排程也可以用於程序排程。在作業排程中,演算法每次從後備作業佇列中選擇最先進入該佇列的乙個或幾個作業,將它們調入記憶體,分配必要的資源,建立程序並放入就緒佇列
下面通過乙個例項來說明fcfs排程演算法的效能。假設系統中有4個作業,它們的提交時間分別是8、8.4、8.8、9,執行時間依次是2、1、0.5、0.2,系統釆用fcfs排程演算法,這組作業的平均等待時間、平均周轉時間和平均帶權周轉時間
作業號提交時間
執行時間
開始時間
等待時間
完成時間
周轉時間
帶權周轉時間18
28010
2128.4110
1.611
2.62.6
38.8
0.511
2.211.5
2.75.449
0.211.5
2.511.7
2.713.5
平均等待時間 t = (0+1.6+2.2+2.5)/4=1.575
平均周轉時間 t = (2+2.6+2.7+2.7)/4=2.5
平均帶權周轉時間 w = (1+2.6+5.牡13.5)/4=5.625
fcfs排程演算法的特點是演算法簡單,但效率低;對長作業比較有利,但對短作業不利(相對sjf和高響應比);有利於cpu繁忙型作業,而不利於i/o繁忙型作業。
2.短作業優先(sjf)排程演算法
短作業(程序)優先排程演算法是指對短作業(程序)優先排程的演算法。短作業優先(sjf)排程演算法是從後備佇列中選擇乙個或若干個估計執行時間最短的作業,將它們調入記憶體執行。而短程序優先(spf)排程演算法,則是從就緒佇列中選擇乙個估計執行時間最短的程序,將處理機分配給它,使之立即執行,直到完成或發生某事件而阻塞時,才釋放處理機。
例如,考慮表2-3中給出的一組作業,若系統釆用短作業優先排程演算法,其平均等待時間、平均周轉時間和平均帶權周轉時間
作業號提交時間
執行時間
開始時間
等待時間
完成時間
周轉時間
帶權周轉時間
182801021
28,4110.72.311.73.33.3
38.80.510.21.410.71.93.8
490.210110.21.26
平均等待時間 t = (0+2.3+1.4+1)/4=1.175
平均周轉時間 t = (2+3.3+1.9+1.2)/4=2.1
平均帶權周轉時間 w = (1+3.3+3.8+6)/4=3.525
sjf排程演算法的平均等待時間、平均周轉時間最少。
時間片輪轉演算法(round robin,rr)的基本思路是:把系統當中的所有就緒任務按照先來先服務的原則,排成乙個佇列,然後再每次排程的時候,把處理器分派給佇列當中的第乙個任務,讓它去執行一小段cpu時間(即時間片,time slice)。當這個時間片結束時,如果任務還沒有執行完成的話,將會發生時鐘中斷,在時鐘中斷裡面,排程器將會暫停當前任務的執行,並把它送到就緒佇列的末尾,然後執行當前的隊首任務。反之,如果乙個任務在它的時間片用完之前就已經結束了或者阻塞了,那麼它就會立即讓出cpu給其他任務。
圖3-25所示是時間片輪轉法的示意圖。圖a表示初始狀態,總共有四個任務位於就緒佇列中,先後順序是b、c、d、a,其中任務b位於佇列之首。當cpu空閒時,排程器就會選擇b去執行。假設當b執行完乙個時間片後,即沒有結束也沒有被阻塞,這時作業系統就會通過時鐘中斷來中止它的執行,並把它送到就緒佇列的末尾。於是就成了圖b的狀態,此時,c位於佇列之首,c就被排程執行。當c時間片用完後也會送到佇列末尾,以此內推。當某個任務執行結束了,就會退出就緒佇列,或者某任務被阻塞也也會退出,並加入阻塞佇列中去。
4.優先順序演算法優先順序排程演算法(priority)的基本思路是:給每個任務都設定乙個優先順序,然後在任務排程的時候,在所有處於就緒狀態的任務中選擇優先順序最高的任務去執行。上文提到的短作業優先演算法其實也是一種優先順序演算法,每個任務的優先順序就是它的執行時間,執行時間越短,優先順序越高。
優先順序演算法可以分為可搶占方式和不可搶占方式。區別在於,乙個任務正在執行時,如果來了乙個優先順序更高的任務,可搶占方式則會立即搶占cpu去執行高優先順序的任務,不可搶占方式則會等當前任務執行結束後再執行。
在任務優先順序的確定方式上,可以分為靜態方式和動態方式。
在優先順序演算法中,高優先順序的任務將搶占低優先順序的任務,但如果兩個任務的優先順序相同,又該如何處理呢?通常的
做法是把任務按照不同的優先順序進行分組,然後在不同組之間使用優先順序演算法,在同一組的各個任務之間使用時間片輪轉法。(如圖)
補:多執行緒的三種建立方式
建執行緒類繼承thread類建立執行緒類
(1)定義thread類的子類,並重寫類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run方法稱為執行體
(2)建立thread子類的例項,即建立了執行緒物件
(3)呼叫執行緒物件的start()方法來啟動執行緒
通過runnable介面建立執行緒類
(1)定義runnable介面的實現類,並重寫該介面的run()方法,該run()方法的方法體同樣是該執行緒的執行緒執行體。
(2)建立 runnable實現類的例項,並依此例項作為thread的target來建立thread物件,該thread物件才是真正的執行緒物件。
(3)呼叫執行緒物件的start()方法來啟動該執行緒。
通過callable和future建立執行緒
(1)建立callable介面的實現類,並實現call()方法,該call()方法將作為執行緒執行體,並且有返回值。
(2)建立callable實現類的例項,使用futuretask類來包裝callable物件,該futuretask物件封裝了該callable物件的call()方法的返回值。
(3)使用futuretask物件作為thread物件的target建立並啟動新執行緒。
(4)呼叫futuretask物件的get()方法來獲得子執行緒執行結束後的返回值
作業系統 程序和執行緒
從處理機只能執行單一程式,到處理機可以通過不停的切換所執行的程式,達到看似同時處理多個程序的過程,經歷了很長一段時間。從單道程式設計到多道程式設計,主要解決了在執行過程中需要頻繁等待資源或者i o操作的問題,因為這類操作通常都是很耗時間的 相對於cpu的快速執行來說 進而提高了整個cpu執行的效率和...
現代作業系統 程序和執行緒
概念 對正在執行程式的乙個抽象。偽並行 由於cpu在各個程序中的切換時間很短 幾十毫秒到幾百毫秒 所以在1s內它可以執行多個程序,這樣就產生了並行的錯覺。這就是說乙個cpu在乙個時間點只能執行乙個程序,在下乙個時間點切換到另外乙個程序,造成同時執行的錯覺。程序和程式 程式就是一些 用一些語言來描述演...
作業系統之執行緒和程序
以下內容 於 上面的面試題可以看出,其實都是一回事,只是換了一種提問方式,只要我們能掌握核心要點,隨便面試官怎麼提問,我們都能輕鬆應對!所以我們可以說 程序 是包含 執行緒 的,執行緒 是 程序 的乙個子集。程序 process 是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排...