!:進程的控制和描述
*進程的定義:進程是一個具有獨立功能的程序在一個數據集合上的一次動態運行過程(是操作系統進行調度和資源分配的基本單元,進程間的通信、同步及上下文切換的開銷略大)
*進程的特征(了解)
1.動態性:動態性是相對於程序本身來說的,程序僅僅是存放在硬盤上的代碼,而進程是程序在某一特定數據集上的動態運行,所以,動態性是程序的最基本特性
2.並發性:並發性是指在一段時間內,操作系統內有多個進程並發執行
3.獨立性:進程之間是相對獨立的,每個進程都有可用的內存空間
4.異步性:即進程之間的運行是按照異步的方式運行的,即每個進程都各自獨立的以不可預知的運行速度向前推進
*進程的狀態
1.三態:就緒態、阻塞態、運行態
2.五態:初始態、就緒態、阻塞態、運行態、終結態
3.七態:初始態、活動阻塞、靜止阻塞(掛起後)、活動就緒、靜止就緒(掛起後)、運行態、終結態
*進程的掛起
進程停止運行,並且從內存中換出到硬盤
進程的掛起可能的原因有:程序中內存的確不夠用了,要換出內存中的一些內容;操作系統負荷調節,如果操作系統不掛起一些程序的話,系統可能不能正常運行了;父進程請求的,可能是為了進行進程間同步;終端用戶請求的等等
*進程管理中的數據結構
1.PCB(Process Control Block)進程控制塊:用來描述進程狀態信息及運行過程的數據結構,是表示進程存在的唯一標識,進程管理也就變成了PCB管理
2.進程控制塊中主要有四方面的內容:進程標志符信息;處理機狀態(處理機上下文);進程調度信息(進程狀態及優先級信息等);進程控制信息(進程間同步和通信的信號量等)
*進程控制
1.Unix內部進程的組織是按照樹形結構組織的,但是在Windows內部不存在任何進程層次結構的概念,所有的進程都具有相同的地位。
2.可能引起進程創建的事件:用戶登錄、進程自己請求創建一個子進程等
3.可能引起進程終結的事件:正常結束、進程自己因為執行中發生了異常自己死了或者被操作系統殺死了、或者並沒有發生什麼被父進程或者操作系統給殺死了
*進程同步
1.利用信號量機制進行同步:進程中使用信號量和在Java並發編程中使用Semaphore類進行線程間同步類似,通過對信號量所持有的許可證的數量的操作實現進程間同步
2.利用管程進行同步:系統中各種硬件資源及軟件資源都可以用數據結構抽象的描述其資源特性,即用少量的信息和對該資源執行的操作來表征該資源,而忽略他們的內部實現細節,因此利用共享數據結構抽象的表示系統中的共享資源,並將對該數據結構實施的特定操作定義為一組過程。進程必須通過操作這組過程來間接地操作共享資源。
*進程通信
進程通信的類型:
*共享存儲器系統(Shared-Memory System):在共享存儲器系統中,相互通信的進程共享某些數據結構或者共享存儲區,進程之間能夠通過這些空間進行通信
*管道通信系統(Pipe):所謂管道是一個連接了寫進程和讀進程的一個共享文件,又叫管道文件,寫進程把數據寫進管道文件,讀進程從管道文件中讀數據出來以實現進程間通信
*消息傳遞系統(Message passing System):在該機制中,進程通信並不借助於任何的共享數據結構共享存儲區共享文件什麼的,而是以格式化的消息為單位,把要通信的數據封裝在消息中,並利用操作系統提供的一組進程間通信命令(原語)進行進程間通信
*客戶機-服務器系統(Client-Server System):通過套接字、遠程工程調用、遠程方法調用等實現遠程通信
!:線程
*線程的定義:線程是進程的一條執行路徑,是比進程更小的執行單元,是CPU調度的基本單位,同一進程的不同線程間共享同一地址空間,於是呢,線程間的通信同步及上下文切換的開銷要比進程小很多了,另外,創建一個線程比創建一個線程的開銷也小很多
*對於線程的創建、同步、通信,Java程序設計語言提供了一組詳細而功能強大的基礎類庫及高級工具類庫,可以方便的進行多線程並發編程(也可以使用Fork/Join框架利用多核處理機進行並行編程)
!:處理機調度與死鎖
*處理機(CPU)調度的層次
1.高級調度:又叫長程調度或者作業調度,是將程序從硬盤加載到內存並進行初始化,可能的話還要將初始化後的進程加入到就緒隊列中去
2.中級調度:又叫內存調度,由於使用了虛擬存儲器技術,很多進程由於可能的各種原因被掛起到了硬盤中,中級調度就是把這些掛起到硬盤中的進程重新調度到內存中去
3.低級調度:又叫短程調度或者進程調度,是利用某種調度算法,從處於就緒隊列中的進程中挑一個出來,並分配給其處理機資源
*處理機調度算法的目標
不同的操作系統由於其使用場景和要求不同,其處理機調度算法的目標也不同,但有一個共同的目標就是:盡可能提高處理機的利用率
*進程調度的任務
1.保存上一個進程處理的處理機現場
2.根據某種調度算法選擇下一個要處理的進程
3.分配處理機給這個選中的進程,開始處理
*進程調度的方式
1.非搶占式:當一個進程分配了處理機之後,該進程的執行就不能被打斷了,直到該進程主動放棄,要麼正常結束,要麼其他原因主動放棄了處理機。有很大的問題就是:處理機的利用率特別低,因為其他硬件資源的運行速度總是低於處理機,不免頻繁發生等待,導致處理機的利用率特別低
2.搶占式:這種方式允許進程間搶占處理機資源,當然搶占並不是亂搶,而是有一定原則的:優先權原則(允許優先級高的進程搶占優先級低的進程的處理機執行權)、短進程優先原則(允許新到的短進程可以搶占長進程的處理機執行權)、時間片原則(各就緒進程之間按照時間片輪詢的機制獲得處理器資源,當前進程運行的時間片到了便讓出處理機,並交由處理機重新調度)
*進程調度算法
0.進程調度調度算法主要是針對搶占式調度方式的,大致的就是根據搶占式的幾個原則實現的調度算法以及在這些算法的基礎上進行了升級
1.輪轉調度算法(Round Robin):該算法使用了非常公平的處理機分配方式,每個進程每次占用處理機的時間僅僅是一個時間片。在RR算法,系統將所有就緒進程按照FCFS(First Come,First Served:先來先服務)組成就緒隊列,然後按照RR進程時間片分配
2.優先級調度算法:一般用於要求實時性要求較高的系統中。當有較高優先級的進程新到時可以搶占優先級較低的進程的處理機。通常進程有兩個優先級:靜態優先級(進程本身就有的)、動態優先級(在進程運行的過程中,進程的優先級根據進程的推進不斷改變,以便獲得更好的調度性能)
3.多隊列調度算法:主要用於多處理器系統中。針對不同的處理機維護一個不同的就緒隊列,每個就緒隊列可以采用不同的調度算法,以適應系統的要求
4.多級反饋隊列調度算法(Multileved feedback queue):是目前認為的一種比較好的進程調度算法。基本描述為:使用多個就緒隊列,每個隊列被賦予不同的優先級。第一隊列優先級最高,第二次之,其余隊列優先級逐個降低。這是其一。其二,不同優先級隊列分配的時間片也不同,優先級越高時間片越長。隊列之間采用優先級調度算法,隊列之內采用FCFS先來先服務的調度算法。新的進程到來之後,首先放到第一隊列,如果在第一隊列中沒有執行完,OK,放到第二隊列末尾進程等待,依次下去,到了最後一個隊列之後,還沒有執行完,就使用RR輪轉調度算法進行調度了
*死鎖的處理
1.處理方法
1.1預防死鎖:大致是在代碼級別進行死鎖的預防
1.2避免死鎖:不同於預防死鎖,是在進程執行過程中,使用一定的算法避免死鎖的發生,因為即使進程內部沒有發生死鎖,也可能因為進程之間操作共享資源造成死鎖,這就要操作系統費心了。常見的有銀行家算法
1.3檢測死鎖:並不是采取措施避免死鎖的發生,而是允許死鎖的發生,但可通過檢測機構及時地檢測出來死鎖的發生,然後采取響應的措施,把進程從死鎖中解救出來
1.4解除死鎖:顯然死鎖已經發生了,不得不把相關進程從死鎖中解脫出來。常見的可以有:取消一些進程,回收他們的資源,解除死鎖。
2.避免死鎖:在進程運行過程中,OS要采取一定的措施(算法)避免死鎖
*銀行家算法:因為最初這個算法是為銀行貸款設計的,後來引用到操作系統中的,所以就交了銀行家算法
1.OK,首先有四個數據結構:
Max矩陣(表示每個進程所需的每個資源的最大數量),譬如下表:P0進程所需A類資源的最大數量是7個,B類5個,C類3個
Allocation矩陣(表示每個進程已經獲得的資源的數量),譬如下表:P0進程所需的A類資源已經獲得了0個,B類1個,C類0個
Need矩陣(表示每個進程現在還需要的資源的數量),值等於所需減去所得
Available矩陣(表示現在可用空閒資源的數量),每個階段都只有一個組值
2.銀行家算法的描述:
Step1(資源嘗試性分配):如果一個進程發出了資源請求,如果其請求的資源大於所需資源,OK,報錯,不改求這麼多呀,如果不多,OK,看空閒資源夠不夠,如果不夠,則讓他等待,如果夠了,則分配,響應的數據結構做響應的改變
Step2(安全性檢查):資源分配之後,要做安全性檢查,就是,我如果這麼分了,所有的進程能不能相安無事的執行完成呢?那就要看能不能找出一個資源分配的進程順序,而這個分配順序能夠使進程正常地完成。大致如下:譬如一個進程按照第一步分配了資源,接下來進行安全性檢查,具體是根據Available矩陣中還有多少可用的資源進行分配,找到一個能滿足分配的進程,把資源分配給他,然後回收他的資源,更新Available矩陣,接著往下找,直到所有的進程都能夠得到資源執行完,表示OK,這次資源分配是安全的,則把資源分配給這個進程的資源請求;否則,則表示當前進程請求的資源如果分配了,系統出於不安全狀態,不分配。