線程和進程區別和聯繫與線程安全

對於線程,進程的概念一直都是比較模糊,最近整理了一下。總結起來就是,線程是進程的一部分,進程是程序的一部分。這個說法不許確,可是能夠指出期間的差異;安全

 

進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源.

一個線程能夠建立和撤銷另外一個線程;同一個進程中的多個線程之間能夠併發執行。線程的引入:例如,有一個Web服務器要進程的方式併發地處理來自不一樣用戶的網頁訪問請求的話,能夠建立父進程和多個子進程的方式來進行處理,可是建立一個進程要花費較大的系統開銷和佔用較多的資源。除外,這些不一樣的用戶子進程在執行的時候涉及到進程上下文切換,上下文切換是一個複雜的過程。因此,爲了減小進程切換和建立的開銷,提升執行效率和節省資源,人們在操做系統中引入了"線程(thread)"的概念。

進程的做用和定義:進程是爲了提升CPU的執行效率,減小由於程序等待帶來的CPU空轉以及其餘計算機軟硬件資源的浪費而提出來的。進程是爲了完成用戶任務所須要的程序的一次執行過程和爲其分配資源的一個基本單位,是一個具備獨立功能的程序段對某個數據集的一次執行活動。

線程和進程的區別:
一、 線程是進程的一部分,因此線程有的時候被稱爲是輕權進程或者輕量級進程。
二、 一個沒有線程的進程是能夠被看做單線程的,若是一個進程內擁有多個進程,進程的執行過程不是一條線(線程)的,而是多條線(線程)共同完成的。
三、 系統在運行的時候會爲每一個進程分配不一樣的內存區域,可是不會爲線程分配內存(線程所使用的資源是它所屬的進程的資源),線程組只能共享資源。那就是說,出了CPU以外(線程在運行的時候要佔用CPU資源),計算機內部的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。
四、 與進程的控制表PCB類似,線程也有本身的控制表TCB,可是TCB中所保存的線程狀態比PCB表中少多了。
五、 進程是系統全部資源分配時候的一個基本單位,擁有一個完整的虛擬空間地址,並不依賴線程而獨立存在。
 
進程與程序的區別:
程序是一組指令的集合,它是靜態的實體,沒有執行的含義。而進程是一個動態的實體,有本身的生命週期。通常說來,一個進程確定與一個程序相對應,而且只有一個,可是一個程序能夠有多個進程,或者一個進程都沒有也能夠只有一個進程。除此以外,進程還有併發性和交往性。簡單地說,進程是程序的一部分,程序運行的時候會產生進程。總結:線程是進程的一部分,進程是程序的一部分。

前一句說的不太準確,線程也有本身的資源,好比棧,私有數據等等。說他使用而不擁有資源指的是使用的是進程的打開文件句柄,進程的全局數據,進程的地址空間等等,這些都屬於進程,而不屬於線程,進程內個線程共享。

進程切換比線程切換開銷大是由於進程切換時要切頁表,並且每每伴隨着頁調度,由於進程的數據段代碼段要換出去,以便把將要執行的進程的內容換進來。原本進程的內容就是線程的超集。並且線程只須要保存線程的上下文(相關寄存器狀態和棧的信息)就行了,動做很小。服務器

線程安全: 若是你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。若是每次運行結果和單線程運行的結果是同樣的,並且其餘的變量的值也和預期的是同樣的,就是線程安全的。併發

相關文章
相關標籤/搜索