進程與線程

1.進程
進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啓動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分爲系統進程和用戶進程。凡是用於完成操作系統的各種功能的進程就是系統進程,它們就是處於運行狀態下的操作系統本身;其它進程就是用戶進程。進程是操作系統進行資源分配的單位(比如文件句柄,虛擬地址空間等等)。

linux下創建子進程的調用是fork(),它功能就是產生子進程,其特別之處在於它會返回2次。


2.線程

線程是可執行代碼的可分派單元。這個名稱來源於“執行的線索”的概念。在基於線程的多任務的環境中,所有進程有至少一個線程,但是它們可以具有多個任務。這意味着單個程序可以併發執行兩個或者多個任務。
簡而言之,線程就是把一個進程分爲很多片,每一片都可以是一個獨立的流程。這已經明顯不同於多進程了,進程是一個拷貝的流程,而線程只是把一條河流截成很多條小溪。它沒有拷貝這些額外的開銷,但是僅僅是現存的一條河流,就被多線程技術幾乎無開銷地轉成很多條小流程,它的偉大就在於它少之又少的系統開銷。
多線程是爲了使得多個線程並行的工作以完成多項任務,以提高系統的效率。

3.使用線程的好處
使用線程的好處有以下幾點:

.提高應用程序的響應:可以對任何一個包含許多相互獨立的活動的程序進行重新設計,以便將每個活動定義爲一個線程。例如,多線程 GUI 的用戶不必等待一個活動完成即可啓動另一個活動。
更有效地使用多處理器:通常,要求併發線程的應用程序無需考慮可用處理器的數量。使用額外的處理器可以明顯提高應用程序的性能。具有高度並行性的數值算法和數值應用程序(如矩陣乘法)在多處理器上通過多個線程實現時,運行速度會快得多。
改進程序結構:許多應用程序都以更有效的方式構造爲多個獨立或半獨立的執行單元,而非整塊的單個線程。多線程程序比單線程程序更能適應用戶需求的變化。

佔用較少的系統資源:多進程與多線程相比,每個進程都有一個完整的地址空間和操作環境狀態。每個進程用於創建和維護大量狀態信息的成本,與一個線程相比,無論是在時間上還是空間上代價都更高。此外,進程間所固有的獨立性使得程序員需要花費很多精力來處理不同進程間的通信。


4.進程和線程中擁有的資源

1) 進程中的資源:進程是操作系統分配資源的基本單位,進程的資源主要包括
地址空間(涉及到同步互斥的地址段主要是數據段和堆棧段)
打開的文件句柄
2.)線程中的資源:一個進程中的所有線程共享進程的地址空間(數據段/堆),打開的文件句柄,由線程獨享的資源包括

線程專有數據區


5.總結

1)一個進程中的所有線程都必須運行相同的可執行程序(它們最多能做到的是運行相同可執行程序的不同部分)。而一個子進程可以運行一個完全不同的可執行程序。
2)進程是操作系統分配資源的基本單位,而線程則不是,線程獨立擁有的主要是棧和線程專用緩衝區
3)由於同一個進程內的多個線程共享同一塊虛擬內存和其它資源,因而一個線程出錯可能會影響到同一個進程中的其它線程。而多進程環境下,一個進程出錯並不會影響其它進程,因爲每一個進程都擁有自己獨立的資源。
4)創建新進程時的資源拷貝使得創建新的進程比創建新的線程效率底下很多。不過由於寫時拷貝機制的存在,因而如果子進程不產生寫請求,這個影響就會很小。
5)如果一個任務可以被分解爲多個幾乎完全相同的子任務,則多線程就可能是一個很好的選擇。
6)由於同一個進程內的多個線程共享進程的資源,因而多個線程共享資源非常簡單(當然,代價是必須防止出現競態)。而多進程之間共享資源則需要通過IPC機制。

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