操做系統之進程與線程
進程和線程
(1)線程是進程的一個實體,一個進程能夠擁有多個線程,多個線程也能夠併發執行。一個沒有線程的進程也能夠看作是單線程的,一樣線程也常常被看作是一種輕量級的進程。而且進程能夠不依賴於線程而單獨存在,而線程則否則。
(2)進程是併發程序在一個數據集合上的一次執行過程,進程是系統進行資源分配和調度的獨立單位,線程是進程的實體,它是比進程更小的可以獨立執行的基本單元,線程本身不擁有任何系統資源,可是它能夠訪問其隸屬進程的所有資源。
(3) 與進程的控制表PCB類似,線程也有本身的控制表TCB,可是TCB中所保存的線程狀態比PCB表少得多。
進程的做用與定義:是爲了提升CPU的執行效率,爲了不因等待而形成CPU空轉以及其餘計算機硬件資源的浪費而提出來的。
線 程的引入:例如,有一個Web服務器要進程的方式併發地處理來自不一樣用戶的網頁訪問請求的話,能夠建立父進程和多個子進 程的方式來進行處理,可是建立一個進程要花費較大的系統開銷和佔用較多的資源。除外,這些不一樣的用戶子進程在執行的時候涉及到進程上下文切換,上下文切換 是一個複雜的過程。因此,爲了減小進程切換和建立的開銷,提升執行效率和節省資源,人們在操做系統中引入了"線程(thread)"的概念。
進程和線程的區別
主要從調度、併發性、系統開銷、擁有資源等方面對進程和線程進行比較。
調度
在傳統的操做系統中,擁有資源的基本單位和獨立調度、分派的基本單位都是進程。而引入線程的操做系統,則把線程做爲調度和分派的基本單位,而進程做爲資源擁有的基本單位。
併發性
引入線程的操做系統中,不只進程之間能夠併發執行,並且在一個進程中的多個線程之間也能夠併發執行,於是使操做系統具備更好的併發性,有效的使用系統資源和提升系統吞吐量。
系統開銷
進程是擁有系統資源的一個獨立單位,擁有本身的資源。線程本身不擁有系統資源,可是能夠訪問隸屬進程的資源。一和進程的代碼段、數據段以及系統資源能夠供同一進程的其餘全部線程共享。
擁有資源
在建立或撤銷進程時,系統要爲之分配或回收資源,如內存空間、I/O設備等。
操做系統所付出的開銷顯著大於建立、撤銷進程開銷。
進程切換涉及到當前進程CPU環境的保存環境的設置以及被調度運行的進程的CPU環境的設置。
線程切換隻須要保存和設置少許的寄存器的內容。
進程切換開銷遠大於線程切換開銷。
同一進程中多個線程具備相同的地址和空間,使線程之間的同步和通訊實現變得簡單。
進程的通信方式
所謂進程通訊,是指正在運行的進程之間相互交換信息。
-
管道中還有命名管道和非命名管道之分,非命名管道只能用於父子進程通信,命名管道科用於非父子進程,命名管道就是FIFO,管道就是先進先出的通信方式。FIFO是一種先進先出的隊列,它相似於一個管道,只容許數據單向流動。每一個FIFO都有一個名字,容許不相關的進程訪問同一個FIFO,所以也成爲命名管道。
-
消息隊列:是用於兩個進程之間的通信,首先在一個進程中建立一個消息隊列,而後往消息隊列中寫數據,而另外一個進程則從那個消息隊列中取數據。須要注意的是,消息隊列是用建立文件的方式進行創建的,若是說一個進程向某個消息隊列中寫入數據以後,另外一個進程沒有取出數據,即便向消息隊列中寫數據已經結束,保存在消息隊列中的數據沒有丟失,也就是說下次再從消息隊列中取數據時仍是上次的數據。
-
信號量:不能傳遞複雜消息,只能用來同步。
-
共享內存:只要首先建立一個共享內存區,其餘線程按照必定的步驟就能訪問到這個共享內存區的數據,固然可讀科寫。
通信方式比較
-
管道:速度慢,容量有限
-
消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題。
-
信號量:不能傳遞複雜消息,只能用來同步
-
共享內存區:可以很容易控制容量,速度快,但要保持同步,好比一個進程在寫的時候,另外一個進程要注意讀寫的問題,至關於線程中的線程安全,固然,共享內存區一樣能夠用做線程間通信,不過沒這個必要,線程間原本就已經共享了一塊內存的。
歡迎關注本站公眾號,獲取更多信息