進程與線程

一,什麼是進程,什麼是線程

進程:進程是計算機中程序關於某數據集合上的一次活動,是系統資源分配和調度的基本單位,是操作系統結構的基礎。進程既是基本的分配單元,也是基本的執行單元。(可理解爲:進程是正在運行的程序的實例)

進程是一個實體,每個進程都有自己的地址空間,一般包括文筆區域、數據區域、和堆棧。

線程:線程是程序執行流的最小單位,線程是進程中的一個實體。

一個程序至少有一個進程,一個進程至少有一個線程。

二、進程與線程的關係

每一個進程都有自己的地址空間,每啓動一個進程系統會爲他分配地址空間,建立數據表來維護代碼段、堆棧段和數據段。這種操作非常昂貴。而線程是共享進程中的數據的,使用相同的地址空間。因此切換一次線程的花費比切換進程小的多。同時創建一個線程也比創建一個進程的開銷小很多。

並且線程之間的通訊更方便,同一進程下的線程共享全局變量,靜態變量和數據。而進程的通信需要以ipc方式進行。如何處理好線程的同步以及互斥問題是編寫多線程程序的難點。

多線程程序更加健壯,多線程中只有有一個線程掛掉的話,整個進程也會掛掉,而一個進程掛掉並不會對其他的進程產生影響,因爲每個進程都有自己的獨立的地址空間。

一個線程可以創建或者撤銷另一個線程。

任何線程都具備5種狀態:新生、就緒、運行、阻塞、終止。

1、新生狀態:在程序中用構造方法(new操作符)創建一個新線程時,如new Thread(r),該線程就是創建狀態,

此時它已經有了相應的內存空間和其它資源,但是還沒有開始執行。

2、就緒狀態:新建線程對象後,調用該線程的 start()方法就可以啓動線程。當線程啓動時,線程進入就緒狀態(runnable)。

3、運行狀態:當就緒狀態的線程被調用並獲得處理器資源的時候,線程就進入了運行狀態,自動調用該線程的run()方法。run()方法定義了該線程的操作以及功能。運行狀態中的線程執行自己run()方法中的代碼。直到調用其他方法或者發送阻塞而終止。

4、阻塞狀態:一個正在運行的線程在某些特定情況下讓出cpu並暫時中止自己的執行,即進入阻塞狀態。在可執行下,如果調用sleep()、suspend()、wait()等方法,線程都將進入阻塞狀態。阻塞時線程不能進入排隊隊列。只有當阻塞原因被消除後,線程轉爲就緒狀態。重新到就緒隊列中排隊等待。注意:阻塞被消除後進入的是就緒狀態,而不是運行狀態。

5、終止狀態:線程調用stop()、destory()方法或者run()方法執行結束的時候,線程即處於終止狀態。處於終止狀態的線程不具備繼續運行的能力。

三、什麼是死鎖?

死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章