目錄算法
進程管理多線程
進程間有哪些通訊方式?ide
同步、異步與互斥函數
併發與並行操作系統
調度線程
進程調度策略設計
用戶級線程(user level thread):對於這類線程,有關線程管理的全部工做都由應用程序完成,內核意識不到線程的存在。在應用程序啓動後,操做系統分配給該程序一個進程號,以及其對應的內存空間等資源。應用程序一般先在一個線程中運行,該線程被成爲主線程。在其運行的某個時刻,能夠經過調用線程庫中的函數建立一個在相同進程中運行的新線程。用戶級線程的好處是很是高效,不須要進入內核空間,但併發效率不高。
內核級線程(kernel level thread):對於這類線程,有關線程管理的全部工做由內核完成,應用程序沒有進行線程管理的代碼,只能調用內核線程的接口。內核維護進程及其內部的每一個線程,調度也由內核基於線程架構完成。內核級線程的好處是,內核能夠將不一樣線程更好地分配到不一樣的CPU,以實現真正的並行計算。
事實上,在現代操做系統中,每每使用組合方式實現多線程,即線程建立徹底在用戶空間中完成,而且一個應用程序中的多個用戶級線程被映射到一些內核級線程上,至關因而一種折中方案。
管道是一種半雙工的通訊方式,單向的、先進先出的、無結構的、固定大小的字節流。數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。
命名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生
消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步和通訊。
信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段;課本里面的PV操做就是對信號量的增減。
與其餘通訊機制不一樣的是,它可用於不一樣機器間的進程通訊。
併發:在一個時間段中同時有多個程序在運行,但其實任一時刻,只有一個程序在CPU上運行,宏觀上的併發是經過微觀的不斷切換實現的;
多線程:併發運行的一段代碼。是實現異步的手段。
並行(和串行相比):在多CPU系統中,多個程序不管宏觀仍是微觀上都是同時執行的。
批處理系統
先來先服務 first-come first-serverd(FCFS)
最短做業優先 shortest job first(SJF)
最短剩餘時間優先 shortest remaining time next(SRTN)
最高響應比優先 Highest Response Ratio Next(HRRN)
交互式系統
交互式系統有大量的用戶交互操做,在該系統中調度算法的目標是快速地進行響應。
時間片輪轉 Round Robin
優先級調度算法
多級反饋隊列調度算法 Multilevel Feedback Queue
高優先級的進程等待被一個低優先級進程佔用的資源時,就會出現優先級反轉,即優先級較低的進程比優先級較高的進程先執行。
解決方法:
一個子進程結束後,它的父進程並無等待它(調用wait或者waitpid),那麼這個子進程將成爲一個殭屍進程。殭屍進程是一個已經死亡的進程,可是並無真正被銷燬。它已經放棄了幾乎全部內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程表中保留一個位置,記載該進程的進程ID、終止狀態以及資源利用信息(CPU時間,內存使用量等等)供父進程收集,除此以外,殭屍進程再也不佔有任何內存空間。這個殭屍進程可能會一直留在系統中直到系統重啓。
危害:佔用進程號,而系統所能使用的進程號是有限的;佔用內存。
如下狀況不會產生殭屍進程:
WNOHANG
(wait-no-hang)選項,若是沒有發現結束的子進程,就會當即返回,不會將調用waitpid的進程阻塞。同時,waitpid還能夠選擇是等待任一子進程(同wait),仍是等待指定pid的子進程,仍是等待同一進程組下的任一子進程,仍是等待組ID等於pid的任一子進程;SIGCHLD
(signal-child)信號,能夠註冊一個信號處理函數,在該函數中調用waitpid,等待全部結束的子進程(注意:通常都須要循環調用waitpid,由於在信號處理函數開始執行以前,可能已經有多個子進程結束了,而信號處理函數只執行一次,因此要循環調用將全部結束的子進程回收);signal(SIGCLD, SIG_IGN)
(signal-ignore)通知內核,表示忽略SIGCHLD
信號,那麼子進程結束後,內核會進行回收。一個父進程已經結束了,可是它的子進程還在運行,那麼這些子進程將成爲孤兒進程。孤兒進程會被Init(進程ID爲1)接管,當這些孤兒進程結束時由Init完成狀態收集工做。
陷阱是有意形成的「異常」,是執行一條指令的結果。陷阱是同步的。陷阱的主要做用是實現系統調用。好比,進程能夠執行 syscall n
指令向內核請求服務。當進程執行這條指令後,會中斷當前的控制流,陷入到內核態,執行相應的系統調用。內核的處理程序在執行結束後,會將結果返回給進程,同時退回到用戶態。進程此時繼續執行下一條指令。
中斷由處理器外部的硬件產生,不是執行某條指令的結果,也沒法預測發生時機。因爲中斷獨立於當前執行的程序,所以中斷是異步事件。中斷包括 I/O 設備發出的 I/O 中斷、各類定時器引發的時鐘中斷、調試程序中設置的斷點等引發的調試中斷等。
異常是一種錯誤狀況,是執行當前指令的結果,可能被錯誤處理程序修正,也可能直接終止應用程序。異常是同步的。這裏特指由於執行當前指令而產生的錯誤狀況,好比除法異常、缺頁異常等。有些書上爲了區分,也將這類「異常」稱爲**「故障」**。
信號是一種更高層的軟件形式的異常,一樣會中斷進程的控制流,能夠由進程進行處理。一個信號表明了一個消息。信號的做用是用來通知進程發生了某種系統事件。
1)互斥。一次只有一個進程可使用一個資源。其餘進程不能訪問已分配給其餘進程的資源。
2)佔有並等待。當一個進程等待其餘進程時,繼續佔有已經分配的資源。
3)不可搶佔。不能強行搶佔進程已佔有的資源。
4)循環等待。存在一個封閉的進程鏈,使得每一個進程至少佔有此鏈中下一個進程所須要的一個資源。
內存管理 參考