1、知道什么是前驅圖:有向、無環;前驅圖的表示方式有兩種:箭頭、集合
2、程序順序執行的特征:順序性、封閉性、可再現性;程序並發執行的特征:間斷性、失去封閉性、不可在現性。失去封閉性和不可在現行是我們不希望看到的,對程序設計是不利的
3、進程:由程序段、數據段、PCB(進程控制塊)組成,PCB中包含了一些進程的關鍵信息,例如ID號、進程狀態等等。
4、區分進程和程序:a、進程是動態的,是活的,由程序調入內存產生,執行完或特殊情況消亡,程序是死的。b、進程是可以並發的,程序不可以。c、進程是分配資源的最小單位、獨立單位、基本單位。d、一個程序可能會對應多個進程,一個進程可以為多個程序服務
5、進程的三個基本狀態:就緒、執行、阻塞。正在被CPU執行的,稱為執行態,以單核CPU為例,所有的進程只能有一個進程處於執行態。除了CPU之外,其余資源都准備好了,叫就緒態(萬事具備只欠東風,萬事是所有資源,東風就是CPU)。因為I/O、分配資源不夠,成為阻塞態。(萬事具備,只欠東風,萬事都沒具備,給了東風也沒用)
6、三個基本狀態之間的轉換:自己去看課本,深入理解三個狀態的含義,自然能夠正確畫出關系轉換圖。
7、此外還可以有創建狀態、終止狀態。創建是一個過程,如果一個進程一直處於創建態,一定是沒有分配完全進程運行所需的必要資源。終止是說進程消亡,要回收進程創建之初為其分配的資源。
8、引入掛起狀態:掛起是將進程由內存調入外存。原因有:a、終端用戶請求,例如程序員寫程序,一般都是寫一段調試一段,調試的時候,我們就需要把進程掛起,暫時不去執行它。b、父進程的請求:當爹的讓兒子暫停,兒子不得不從。c、負荷調節的需要,當內存不夠用了,怎么辦?可以將一些暫時執行不到的進程調出內存,進入外存,空出這部分內存,執行比較重要的進程。
d、操作系統的需要,有時候為了某些需要,操作系統有權利掛起某些進程。其實掛起的原因可以說是什么可以使進程掛起。
9、引入掛起之后,進程的狀態分為:執行態、活動阻塞、活動就緒、靜止阻塞、靜止就緒。活動的是在內存里,靜止的是在外存中。靜止的就是掛起狀態。
10、引入掛起狀態后,進程狀態之間的轉換把握好幾點:a、掛起態(靜止態)的要想被CPU調度,必須要先進入內存,變為活動態。b、只能從活動就緒隊列里取出一個進程,被CPU調度,變為執行態,也就是說執行態的進程只有一個來源。c、活動就緒(阻塞)掛起后變為靜止就緒(阻塞),反過來是激活。說白了,掛起就是進程內存到外存,激活是外存進入內存。d、再和前邊三種基本的狀態轉換聯系起來,就沒有問題了
11、計算機中的資源都是以鏈表的形式表示(指針)。有內存表、設備表、文件表、進程表。PCB實際上就是一種數據結構,通過鏈表的形式,表明進程需要的資源等一些信息。操作系統管理PCB,就是管理進程需要的資源組成的資源表。
12、PCB的作用:a、作為獨立運行基本單位的標志:進程是否存在,就是看進程的PCB是否存在,操作系統感知進程,就是感知PCB。進程產生要創建PCB,進程消亡要回收PCB,也就是回收PCB占用的空間資源。b、能實現間斷性運行方式:操作系統的異步性是由於進程的異步性,走走停停。要想停了繼續走,就需要PCB里存儲進程離開CPU時的現場信息,其實就是匯編里講到的保護現場和恢復現場。
c、提供進程管理所需要的信息:進程除了PCB還有程序、數據,程序和數據在內存中的什么位置?會在PCB里給出,也就是說,根據PCB的一些信息是可以找到該進程的程序和數據。進程被調度需要什么資源?也在PCB中由。此外還有訪問IO、文件的一些信息。d、提供進程調度所需要的信息:進程的ID、進程狀態、進程優先級等等。e、實現與其他進程的同步與通信:與其他進程通信需要的信息,也在PCB中,例如后邊提到的信號量
13、進程控制塊中(PCB)的信息:a、進程標識符,有內部標識符和外部標識符。內部標識符是給OS用的,外部標識符是給用戶看的。類似咱們人的身份證號和學號,身份證號是給國家看的,是國家分配的,學號是在學校中用的。b、處理機狀態:為了進程離開CPU時,能保存現場狀態。c、進程調度信息:進程的狀態(就緒還是阻塞)、進程優先級(在某些算法中,優先級越高的進程越優先被調度)、調度算法相關信息(在用某些算法時需要進程的一些信息,比如等待時間越長的進程越優先被執行,這時候等待時間會在PCB中體現)、事件:進程阻塞的原因。
d、進程控制信息:進程需要的程序和數據在內存或外存的地址、與其他進程通信的必要信息、進程所需資源清單、本進程的下一個進程PCB的地址。(這里充分體現了數據結構:鏈表。進程如何排好隊?就是靠這種鏈表機制,每一個表就是PCB,每一個表中會存放下一個PCB的首地址。可以是就緒隊列、阻塞隊列等)
14、PCB的組織方式:線性、鏈接、索引。線性是所有的進程PCB在一張表中,鏈接是分隊列,阻塞一隊,就緒一隊這樣。索引是為這些PCB再創建一張表,表中有PCB所在位置的指針。相當於為PCB的地址做了一張表。PCB的順序是在這個表里體現,而不是像剛才的鏈接方式一樣,下一個PCB的地址放在上一個PCB中。
15、進程控制:進程創建、終止、狀態轉換
16、進程控制一般由OS內核來實現。什么是OS內核?是操作系統中距離硬件最近的一層軟件,相當於操作系統和硬件之間的大門,也是操作系統中非常重要的一部分,很多功能都需要由OS內核來實現。OS內核包含了一些使用頻率比較高的模塊,例如時鍾管理、設備驅動等等,為了提高OS的效率,他們常駐內存。
17、OS內核有什么功能?支撐、資源管理。支撐:中斷處理(在匯編中的很多操作需要中斷實現,比如輸入和輸出等。還有鍵盤、鼠標這些IO設備都要依靠中斷機制)、時鍾管理(計算機方方面面都要用到時鍾,比如分時系統中的時間片)、原語操作(進程的狀態轉換依靠原語,原語是說不能中斷的代碼)。資源管理:進程管理(進程創建、終止、狀態轉換等)、存儲器管理(關於內存的一些東西,比如虛擬內存,內存分配回收等。說白了就是處理和內存相關的事物。)、設備管理(前邊提到的驅動程序等)
18、什么事件可以引起進程的創建?a、用戶登錄(在分時系統中,每一個終端有一個進程,根據操作可以再由該進程創建子進程、孫進程);b、作業調度(由外存進入內存);c、提供服務(用戶使用打印機,內核會為這個請求建立進程,當然使用完畢會終止進程);d、應用請求,由用戶自己創建
19、進程的創建過程:a、申請空白PCB(每一個進程的標志就是PCB是否存在);b、為新進程分配其運行所需的資源(可以縮減為能夠跑起來的資源,在執行過程中可能再次因為某些資源不夠阻塞);c、初始化進程控制塊PCB(aa、ID號父進程ID號這些標識信息;PC指向要執行的代碼的入口地址,也就是第一行的位置,棧指針指向棧頂;設置進程狀態是靜止就緒還是活動就緒);d、將新進程插入就緒隊列(資源給足之后,就差處理機了,就可以放入就緒隊列了)。進程的創建時調用Creat原語實現的,由OS內核創建的。
20、進程的終止原因:正常結束(類似於人的正常死亡,壽命到了,比如打印機請求,用完了打印機需要終止打印請求進程);異常結束(屬於內部原因,比如人暴病死亡);外部終止(外部原因,比如出車禍、地震等自然災害)。不需要把課本中每一個詳細的事件都說出來,但是舉出一個終止的例子要能分清屬於三種里邊的哪一種。
21、進程的終止過程:修改進程狀態、終止由該進程創建的子孫進程、回收全部資源、從相關隊列中移除
22、引起進程阻塞與喚醒的事件:a、向系統請求資源失敗(例如進程申請使用打印機,打印機正在被其他的進程占用,打印機是一種臨界資源,這時進程就要阻塞起來。等打印機空閑了,再分配給該進程,進程喚醒,由從阻塞變為就緒)b、等待某種操作完成(例如IO操作,IO操作沒有完成,進程處於阻塞狀態,IO操作完成,進程喚醒,由從阻塞變為就緒)c、新數據尚未到(例如y=a+b,其中a是通過某一進程計算出來的,a沒有計算完,計算y的進程需要阻塞,a計算完了,計算y的進程喚醒由阻塞變為就緒)d、無新工作可做(例如某個進程用於兩個進程間的相互通信,當沒有通信發生時,該進程就要阻塞起來,當有了通信消息了,又由阻塞便為就緒)
23、阻塞通過原語block完成的,過程分為四部:a、保護現場(為了進程再次喚醒占領CPU時,恢復離開時CPU的樣子)b、修改進程狀態(在進程的PCB中有進程狀態的相關信息,代表進程處於何種狀態,當進程要變為阻塞之后,要修改這個信息,同樣喚醒也需要修改)c、插入相關隊列(進程變為阻塞之后,要把進程放置阻塞隊列中)d、轉進程調度(CPU空閑,需要從就緒隊列中根據某個算法選中一個進程占領CPU)
24、進程的阻塞是主動,而不是被動,也就是說阻塞是由進程本身發起的,不是由外部發起的。喚醒時被動的,喚醒原語是寫在其他進程中的。
25、進程的喚醒過程:a、從阻塞隊列摘下,或者說從阻塞隊列剔除掉;b、修改進程狀態為就緒狀態;c、加入到就緒隊列里邊;d、CPU從就緒隊列中根據某個算法選出一個進程占領CPU
26、喚醒是原語weakup完成的,阻塞時原語block完成的。這是一對原語,在程序要成對出現,如果只有block,沒有weakup或缺少weakup,這個進程可能會永遠不會被調度,成為”死進程“。
27、掛起是原語suspend,激活是原語active。進程的掛起和激活與進程的阻塞和喚醒類似,過程也類似,大致就是從原隊列剔除,修改進程狀態,加入新隊列。
28、什么是進程間的同步?進程之間的關系有兩種,一種是間接制約,一種是直接制約。間接制約是由與共享某個資源引起的,比如兩個進程訪問打印機這種臨界資源。直接制約是由於進程之間相互合作引起的制約。例如進程A進程B通過管道相互通信,管道在這里可以暫時理解為緩沖區,進程A向緩沖區發送數據,進程B從緩沖區取走數據,如果進程A沒有向緩沖區發送數據,進程B是去走不了的。像這種制約關系就是進程間的同步。所以說進程間的同步可以理解為為了完成某一個任務,必須按照一定的先后次序執行。
29、什么是臨界資源?打印機就是一種臨界資源。一個進程用完了,另外一個進程才可以用。不然就會出現一張紙上有兩個打印機打印的東西。
30、課本從生產者-消費者模型引出臨界資源。生產者-消費者模型是說有一個緩沖池,生產者生產了產品放入緩沖池,消費者消費從緩沖池中取走產品。代表池中產品數量的counter++或counter--是非原語操作,轉成機器語言后是三行代碼。如果counter++和counter--並發執行,會出現不可再現性。如何解決呢?把counter當作臨界資源,++時不能插入--操作,相當於是生產的時候不能消費,消費的時候不能生產。
31、所以把訪問臨界資源的步驟分為四個:a、進入區(檢查臨界資源是否正在被使用,如果正在被使用就等待,如果沒有被使用就可以進入下一步。同時修改臨界資源狀態由未訪問改為正在訪問)b、臨界區(對臨界資源進行操作的代碼)c、退出區(修改臨界資源使用狀態,由正在訪問修改為未訪問)d、剩余區(其余部分的代碼)
32、如何保證多個進程互斥的訪問臨界資源呢?原則由四個:空閑讓進(資源空閑,就可以被進程使用)、忙則等待(資源正在被使用,需要等待,而不能同時訪問)、有限等待(等待臨界資源的進程不能一直等,一定要有一個時間限制,否則這個進程就變為了”死進程“,永遠不會被CPU再次調度)、讓權等待(權是指占領CPU的權利,如果進程不能訪問臨界資源,要把CPU釋放,讓其他進程使用。否則會造成既不釋放CPU,又不能訪問臨界資源的情況,課本中叫”忙等“。忙是指一直在檢測臨界資源的訪問狀態,循環檢測,一直檢測。如果釋放CPU等於是提高了CPU的執行效率,在”忙等“的這個時間CPU可以處理其他任務,執行其他進程。)
33、如何保證多個進程互斥的訪問臨界資源呢?可以通過硬件、軟件的方法實現。硬件同步機制有關中斷、TS指令、SWAP指令。雖然用代碼實現,看起來像軟件方法,實際是計算機硬件完成的,屬於硬件方法。
34、關中斷,也叫做中斷屏蔽,原理是計算機中的進程調度要依靠中斷,如果不允許中斷,也就不會發生進程切換。在進入臨界區之前關閉中斷,在剩余區打開中斷。缺點:a、 濫用關中斷權力可能導致嚴重后果(開關中斷屬於比較權限比較高的指令,一般CPU在內核態完成,如果把權限下放到用戶態,用戶可以任意開關中斷,就可能造成很嚴重的問題。);b、關中斷時間過長,會影響系統效率,限制了處理器交叉執行程序的能力(限制了並發效率,成了串行);c、關中斷方法也不適用於多CPU 系統(一個CPU對應一個中斷屏蔽位,多個CPU就有多個中斷屏蔽位。即使關閉了一個CPU,另外的CPU中斷屏蔽位不關閉,也可能造成其他CPU的進程訪問臨界資源,不滿足忙則等待)
35、TS指令,叫做Test-and-Set指令,也是標志位的思想。大概思想是寫一個函數,函數的形參是資源狀態,返回值是資源原狀態,中間會把資源狀態強制設為True,意思是正在忙。在進入區,用while循環循環條件是函數返回值,函數返回False,while循環中止,會進入臨界區。函數的過程是一個原子操作,不允許中斷。這種方式不像軟件那樣麻煩,但是仍然存在不滿足讓權等待的問題,碰到資源忙的情況下,也會在While中一直循環,到時間片用完。
36、Swap指令和TS思想基本一致,也是通過while循環檢查資源的使用狀態,同樣不滿足讓權等待的原則。
37、軟件方法課本沒有提到,有單標志法(違背空閑讓進,如果一個進程一直不進入臨界區,另外一個進程永遠不會進入臨界區)、雙標志先檢查法(違反了忙則等待原則,有可能兩個進程同時進入臨界區)、雙標志后檢查法(違反了空閑讓進和有限等待原則,有可能兩個進程都不能進入臨界區)、peterson算法(解決了剛才的問題,但是不能遵守讓權等待,會消耗CPU的時間片檢查標志位)。