校招之作業系統
1、執行緒和程序的基本概念
程序:程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,是系統進行資源分配和排程的一個獨立單位。(包括程式段,相關資料段,和程序控制塊PCB)
執行緒:執行緒是程序中執行運算的最小單位,是程序中的一個實體,執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行。
好處 :(1)易於排程。
(2)提高併發性。通過執行緒可方便有效地實現併發性。程序可建立多個執行緒來執行同一程式的不同部分。
(3)開銷少。建立執行緒比建立程序要快,所需開銷很少。。
(4)利於充分發揮多處理器的功能。通過建立多執行緒程序,每個執行緒在一個處理器上執行,從而實現應用程式的併發性,使每個處理器都得到充分執行。
2、程序的基本狀態及狀態之間的關係
狀態:執行、阻塞、掛起阻塞、就緒、掛起就緒
狀態之間的轉換:準備就緒的程序,被CPU排程執行,變成執行態;
執行中的程序,進行
執行中的程序,程序執行完畢(或時間片已到),變成就緒態;
將阻塞態的程序掛起,變成掛起阻塞態,當導致程序阻塞的I/O操作在使用者重啟程序前完成(稱之為喚醒),掛起阻塞態變成掛起就緒態,當用戶在I/O操作結束之前重啟程序,掛起阻塞態變成阻塞態;
將就緒(或執行)中的程序掛起,變成掛起就緒態,當該程序恢復之後,掛起就緒態變成就緒態;
3、執行緒和程序的關係以及區別?
程序和執行緒的關係:
(1)一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒。
(2)資源分配給程序,同一程序的所有執行緒共享該程序的所有資源。
(3)處理機分給執行緒,即真正在處理機上執行的是執行緒。
(4)執行緒在執行過程中,需要協作同步。不同程序的執行緒間要利用訊息通訊的辦法實現同步。執行緒是指程序內的一個執行單元,也是程序內的可排程實體.
程序與執行緒的區別:
(1)排程:執行緒作為排程和分配的基本單位,程序作為擁有資源的基本單位
(2)併發性:不僅程序之間可以併發執行,同一個程序的多個執行緒之間也可併發執行
(3)擁有資源:程序是擁有資源的一個獨立單位,執行緒不擁有系統資源,但可以訪問隸屬於程序的資源.
(4)系統開銷:在建立或撤消程序時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於建立或撤消執行緒時的開銷。
4、程序間通訊的方式?
1)管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。
管道是單向的、先進先出的、無結構的、固定大小的位元組流,它把一個程序的標準輸出和另一個程序的標準輸入連線在一起。寫程序在管道的尾端寫入資料,讀程序在管道的首端讀出資料。資料讀出後將從管道中移走,其它讀程序都不能再讀到這些資料。
管道有三種:
① 普通管道:有兩個限制:一是隻支援半雙工通訊方式,即只能單向傳輸;二是隻能在父子程序之間使用;
② 流管道:去除第一個限制,支援雙向傳輸;
③ 命名管道:去除第二個限制,可以在不相關程序之間進行通訊。
2)命名管道 (named pipe): 命名管道也是半雙工的通訊方式,它克服了管道沒有名字的限制,並且它允許無親緣關係程序間的通訊。命令管道在檔案系統中有對應的檔名,命名管道通過命令mkfifo或系統呼叫mkfifo來建立。
3)訊號量( semophore ): 訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。
4)訊息佇列( message queue ): 訊息佇列是由訊息的連結串列結構實現,存放在核心中並由訊息佇列識別符號標識。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
5)訊號 ( sinal ):訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。除了用於程序通訊外,程序還可以傳送訊號給程序本身。
6)共享記憶體( shared memory ):共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的IPC方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號量配合使用,來實現程序間的同步和通訊。
7)套接字( socket ): 也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程序通訊
1.2.4 作業(程序)排程演算法
1)先來先服務排程演算法(FCFS) 每次排程都是從後備作業佇列中選擇一個或多個最先進入該佇列的作業,將它們調入記憶體,為它們分配資源、建立程序,然後放入就緒佇列。
2)短作業(程序)優先排程演算法(SPF) 短作業優先(SJF)的排程演算法是從後備佇列中選擇一個或若干個估計執行時間最短的作業,將它們調入記憶體執行。缺點:長作業的執行得不到保證
3)優先權排程演算法(HPF) 當把該演算法用於作業排程時,系統將從後備佇列中選擇若干個優先權最高的作業裝入記憶體。當用於程序排程時,該演算法是把處理機分配給就緒佇列中優先權最高的程序,這時,又可進一步把該演算法分成如下兩種。 可以分為: 1.非搶佔式優先權演算法 2.搶佔式優先權排程演算法
4)高響應比優先排程演算法(HRN) 每次選擇高響應比最大的作業執行,響應比=(等待時間+要求服務時間)/要求服務時間。該演算法同時考慮了短作業優先和先來先服務。
(1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該演算法有利於短作業。
(2) 當要求服務的時間相同時,作業的優先權決定於其等待時間,等待時間愈長,其優先權愈高,因而它實現的是先來先服務。
(3) 對於長作業,作業的優先順序可以隨等待時間的增加而提高,當其等待時間足夠長時,其優先順序便可升到很高,從而也可獲得處理機。簡言之,該演算法既照顧了短作業,又考慮了作業到達的先後次序,不會使長作業長期得不到服務。因此,該演算法實現了一種較好的折衷。當然,在利用該演算法時,每要進行排程之前,都須先做響應比的計算,這會增加系統開銷。
5)時間片輪轉法(RR) 在早期的時間片輪轉法中,系統將所有的就緒程序按先來先服務的原則排成一個佇列,每次排程時,把CPU分配給隊首程序,並令其執行一個時間片。時間片的大小從幾ms到幾百ms。當執行的時間片用完時,由一個計時器發出時鐘中斷請求,排程程式便據此訊號來停止該程序的執行,並將它送往就緒佇列的末尾;然後,再把處理機分配給就緒佇列中新的隊首程序,同時也讓它執行一個時間片。這樣就可以保證就緒佇列中的所有程序在一給定的時間內均能獲得一時間片的處理機執行時間。換言之,系統能在給定的時間內響應所有使用者的請求。
6)多級反饋佇列排程演算法 多級反饋佇列排程演算法是時間片輪轉排程演算法和優先順序排程演算法的綜合和發展,
(1) 應設定多個就緒佇列,併為各個佇列賦予不同的優先順序。第一個佇列的優先順序最高,第二個佇列次之,其餘各佇列的優先權逐個降低。該演算法賦予各個佇列中程序執行時間片的大小也各不相同,在優先權愈高的佇列中,為每個程序所規定的執行時間片就愈小。例如,第二個佇列的時間片要比第一個佇列的時間片長一倍,……,第i+1個佇列的時間片要比第i個佇列的時間片長一倍。
(2) 當一個新程序進入記憶體後,首先將它放入第一佇列的末尾,按FCFS原則排隊等待排程。當輪到該程序執行時,如它能在該時間片內完成,便可準備撤離系統;如果它在一個時間片結束時尚未完成,排程程式便將該程序轉入第二佇列的末尾,再同樣地按FCFS原則等待排程執行;如果它在第二佇列中執行一個時間片後仍未完成,再依次將它放入第三佇列,……,如此下去,
(3) 僅當第一佇列空閒時,排程程式才排程第二佇列中的程序執行;
相當於先按優先順序排程,優先順序相同的,按時間片輪轉
多級反饋佇列的優勢有:
-
- 終端型作業使用者:短作業優先。
- 短批處理作業使用者:週轉時間較短。
- 長批處理作業使用者:經過前面幾個佇列得到部分執行,不會長期得不到處理。
常用頁面置換演算法(作業系統如何進行分頁排程)
一、 OPT(最佳頁面置換演算法)
該演算法選擇置換下次訪問距當前時間最長的那些頁,可以看出該演算法可以導致最少的缺頁中斷,但它要求作業系統能夠預知未來的時間,這是不可能實現的,但是該演算法可以作為一種標準來衡量其他演算法的效能
二、 LRU(最近最少使用置換演算法)
選擇最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。該演算法為每個頁面設定一個訪問欄位,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。
三、 FIFO策略(先進先出頁面置換演算法)
優先淘汰最早進入記憶體的頁面,亦即在記憶體中駐留時間最久的頁面。該演算法實現簡單,只需把調入記憶體的頁面根據先後次序連結成佇列,設定一個指標總指向最早的頁面。但該演算法與程序實際執行時的規律不適應,因為在程序中,有的頁面經常被訪問。
四、 時鐘策略
LRU演算法的效能接近於OPT,但是實現起來比較困難,且開銷大;FIFO演算法實現簡單,但效能差。所以作業系統的設計者嘗試了很多演算法,試圖用比較小的開銷接近LRU的效能,這類演算法都是CLOCK演算法的變體。
簡單的CLOCK演算法是給每一幀關聯一個附加位,稱為使用位。當某一頁首次裝入主存時,該幀的使用位設定為1;當該頁隨後再被訪問到時,它的使用位也被置為1。對於頁替換演算法,用於替換的候選幀集合看做一個迴圈緩衝區,並且有一個指標與之相關聯。當某一頁被替換時,該指標被設定成指向緩衝區中的下一幀。當需要替換一頁時,作業系統掃描緩衝區,以查詢使用位被置為0的一幀。每當遇到一個使用位為1的幀時,作業系統就將該位重新置為0;如果在這個過程開始時,緩衝區中所有幀的使用位均為0,則選擇遇到的第一個幀替換;如果所有幀的使用位均為1,則指標在緩衝區中完整地迴圈一週,把所有使用位都置為0,並且停留在最初的位置上,替換該幀中的頁。由於該演算法迴圈地檢查各頁面的情況,故稱為CLOCK演算法
1. 父程序建立子程序之後,父子程序間的關係是什麼?
一個程序通過fork()函式建立一個新的程序,兩者關係為父子關係,子程序擁有和父程序幾乎但又不完全一樣。兩者擁有相同但又相互獨立的地址空間,是可以併發執行的獨立程序,子程序共享父程序的正文段和已經開啟的檔案兩者最大的差別就是程序ID不一樣。
2. fork程序時的操作,
每個程序都有一個非負整數表示的唯一程序ID,如交換程序(即排程程序)ID為0,init程序ID為1,頁守護程序ID為2;
fork函式被呼叫一次,但返回兩次,兩次返回的區別就是子程序返回的是0,父程序返回的新子程序的ID;
子程序是父程序的副本,獲得了父程序資料空間、堆和棧的副本;父子程序並不共享這些儲存空間,共享正文段(即程式碼段);因此子程序對變數的所做的改變並不會影響父程序。
目前採用了寫時複製技術(即fork之後,子程序不會立馬執行exec)負責管理父子程序的儲存空間關係。資料段、堆疊這些區域是父程序和子程序共享的,只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製一份給子程序。
同步與互斥的區別與聯絡
互斥:是指散佈在不同程序(執行緒)之間的若干程式片斷,當某個程序(執行緒)執行其中一個程式片段時,其它程序(執行緒)就不能執行它們之中的任一程式片段,只能等到該程序(執行緒)執行完這個程式片段後才可以執行。
同步:是指散佈在不同程序(執行緒)之間的若干程式片斷,它們的執行必須嚴格按照規定的 某種先後次序來執行,這種先後次序依賴於要完成的特定的任務。
同步是一種更為複雜的互斥,而互斥是一種特殊的同步。也就是說互斥是兩個執行緒之間不可以同時執行,他們會相互排斥,必須等待一個執行緒執行完畢,另一個才能執行,而同步大部分情況下也是不能同時執行,但他是必須要安照某種次序來執行相應的執行緒,而且少數時候同步可以允許多個執行緒同時執行!
執行緒同步的方式
執行緒間同步的方式主要由以下三種:
互斥量:採用互斥物件機制,只有擁有互斥物件的執行緒才有訪問公共資源的許可權。因為互斥物件只有一個,所以可以保證公共資源不會被多個執行緒同時訪問。
訊號量:它允許同一時刻多個執行緒訪問同一資源,但是需要控制同一時刻訪問此資源的最大執行緒數量。當需要一個計數器來限制可以使用某共享資源的執行緒數目時,可以使用“訊號量”物件。
事件(訊號):通過通知操作的方式來保持多執行緒同步,還可以方便的實現多執行緒優先順序的比較操作。即事件機制允許一個執行緒在處理完一個任務後,主動喚醒另外一個執行緒執行任務。
一、死鎖的定義
死鎖的概念: 在兩個或多個併發程序中,如果每個程序持有某種資源而又都等待別的程序釋放它或它們現在保持著的資源,在未改變這種狀態之前都不能向前推進,稱這一組程序產生了死鎖。通俗地講,就是兩個或多個程序被無限期地阻塞、相互等待的一種狀態。
二、死鎖產生的原因
1) 系統資源的競爭
通常系統中擁有的不可剝奪資源,其數量不足以滿足多個程序執行的需要,使得程序在 執行過程中,會因爭奪資源而陷入僵局,如磁帶機、印表機等。只有對不可剝奪資源的競爭 才可能產生死鎖,對可剝奪資源的競爭是不會引起死鎖的。2) 程序推進順序非法
程序在執行過程中,請求和釋放資源的順序不當,也同樣會導致死鎖。例如,併發程序 P1、P2分別保持了資源R1、R2,而程序P1申請資源R2,程序P2申請資源R1時,兩者都 會因為所需資源被佔用而阻塞。
訊號量使用不當也會造成死鎖。程序間彼此相互等待對方發來的訊息,結果也會使得這 些程序間無法繼續向前推進。例如,程序A等待程序B發的訊息,程序B又在等待程序A 發的訊息,可以看出程序A和B不是因為競爭同一資源,而是在等待對方的資源導致死鎖。3) 死鎖產生的必要條件
產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生。- (1)互斥(mutualexclusion),一個資源每次只能被一個程序使用;
(2)不可搶佔(nopreemption),程序已獲得的資源,在未使用完之前,不能強行剝奪;
(3)佔有並等待(hold andwait),一個程序因請求資源而阻塞時,對已獲得的資源保持不放;只能在程序使用完時由自己釋放。
(4)環形等待(circularwait),若干程序之間形成一種首尾相接的迴圈等待資源關係。
三、如何避免死鎖1.破壞“互斥”條件:就是在系統裡取消互斥。若資源不被一個程序獨佔使用,那麼死鎖是肯定不會發生的。但一般來說在所列的四個條件中,“互斥”條件是無法破壞的。因此,在死鎖預防裡主要是破壞其他幾個必要條件,而不去涉及破壞“互斥”條件。
2.破壞“佔有並等待”條件:破壞“佔有並等待”條件,就是在系統中不允許程序在已獲得某種資源的情況下,申請其他資源。即要想出一個辦法,阻止程序在持有資源的同時申請其他資源。
方法一:建立程序時,要求它申請所需的全部資源,系統或滿足其所有要求,或什麼也不給它。這是所謂的 “ 一次性分配”方案。
方法二:要求每個程序提出新的資源申請前,釋放它所佔有的資源。這樣,一個程序在需要資源S時,須先把它先前佔有的資源R釋放掉,然後才能提出對S的申請,即使它可能很快又要用到資源R。
3.破壞“不可搶佔”條件:破壞“不可搶佔”條件就是允許對資源實行搶奪。
方法一:如果佔有某些資源的一個程序進行進一步資源請求被拒絕,則該程序必須釋放它最初佔有的資源,如果有必要,可再次請求這些資源和另外的資源。
方法二:如果一個程序請求當前被另一個程序佔有的一個資源,則作業系統可以搶佔另一個程序,要求它釋放資源。只有在任意兩個程序的優先順序都不相同的條件下,方法二才能預防死鎖。
4.破壞“迴圈等待”條件:破壞“迴圈等待”條件的一種方法,是將系統中的所有資源統一編號,程序可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(升序)提出。這樣做就能保證系統不出現死鎖
四.死鎖的解除:
一旦檢測出死鎖,就應立即釆取相應的措施,以解除死鎖。死鎖解除的主要兩種方法:
1) 搶佔資源。從一個或多個程序中搶佔足夠數量的資源,分配給死鎖程序,以解除死鎖狀態。
2) 終止(或撤銷)程序。終止(或撤銷)系統中的一個或多個死鎖程序,直至打破迴圈環路,使系統從死鎖狀態解脫出來。