線程與進程之間的關係和區別

線程共享的環境包括:進程代碼段,進程的公有數據(利用這些數據,線程很容易實現相互間的通訊),進程打開的文件描述符,信號的處理器進程的當前目錄和進程用戶ID與進程組ID。


進程擁有這許多共性的同時,還擁有自己的個性。有了這些個性,線程才能實現併發性。這些個性包括:
1.線程ID。2.寄存器組的值。3.線程的堆棧(堆棧是保證線程獨立運行所必需的)。4.錯誤碼的返回值。5.線程的信號屏蔽碼(但所有的線程都共享同樣的信號處理器)。6.線程的優先級

在一個進程的線程共享堆區,而進程中的線程各自維持自己堆棧。
在 windows 等平臺上,不同線程缺省使用同一個堆,所以用 C 的 malloc (或者 windows 的 GlobalAlloc)分配內存的時候是使用了同步保護的。如果沒有同步保護,在兩個線程同時執行內存操作的時候會產生競爭條件,可能導致堆內內存管理 混亂。比如兩個線程分配了統一塊內存地址,空閒鏈表指針錯誤等。 

  Symbian 的線程一般使用獨立的堆空間。這樣每個線程可以直接在自己的堆裏分配和釋放,可以減少同步所引入的開銷。當線程退出的時候,系統直接回收線程的堆空間,線程內沒有釋放的內存空間也不會造成進程內的內存泄漏。 

  但是兩個線程使用共用堆的時候,就必須用 critical section 或者 mutex 進行同步保護。否則程序崩潰時早晚的事。如果你的線程需要在共用堆上無規則的分配和釋放任何數量和類型的對象,可以定製一個自己的 allcator,在 allocator 內部使用同步保護。線程直接使用這個 allocator 分配內存就可以了。這相當於實現自己的 malloc,free。但是更建議你重新審查一下自己的系統,因爲這種情況大多數是不必要的。經過良好的設計,線程的本地堆應該能夠滿足大多數對象的需 求。如果有某一類對象需要在共享堆上創建和共享,這種需求是比較合理的,可以在這個類的 new 和 delete 上實現共享保護。 

進程是資源分配的基本單位,線程是系統調度的基本單位。
平時我們寫的程序都是作爲線程運行的;進程可以看做是包括一系列線程和資源的統稱;一個進程至少包括一個
線程(主線程,進入main函數時產生的);在其中可以創建其它線程,也可以不創建。
同一進程間的線程究竟共享哪些資源呢,而又各自獨享哪些資源呢?
共享的資源有
a. 堆  由於堆是在進程空間中開闢出來的,所以它是理所當然地被共享的;因此new出來的都是共享的(16位平臺上分全局堆和局部堆,局部堆是獨享的)
b. 全局變量 它是與具體某一函數無關的,所以也與特定線程無關;因此也是共享的
c. 靜態變量 雖然對於局部變量來說,它在代碼中是“放”在某一函數中的,但是其存放位置和全局變量一樣,存於堆中開闢的.bss和.data段,是共享的
d. 文件等公用資源  這個是共享的,使用這些公共資源的線程必須同步。Win32 提供了幾種同步資源的方式,包括信號、臨界區、事件和互斥體。
獨享的資源有
a. 棧 棧是獨享的
b. 寄存器  這個可能會誤解,因爲電腦的寄存器是物理的,每個線程去取值難道不一樣嗎?其實線程裏存放的是副本,包括程序計數器PC

進程的三種狀態及轉換

    進程在運行中不斷地改變其運行狀態。通常,一個運行進程必須具有以下三種基本狀態。

 就緒(Ready)狀態

    當進程已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的進程狀態稱爲就緒狀態。

 執行(Running)狀態
當進程已獲得處理機,其程序正在處理機上執行,此時的進程狀態稱爲執行狀態。

 阻塞(Blocked)狀態
正在執行的進程,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。
引起進程阻塞的事件可有多種,例如,等待I/O完成、申請緩衝區不能滿足、等待信件(信號)等

                                                  
1:就緒->執行, 當前運行進程阻塞,調度程序選一個優先權最高的進程佔有處理機;
2:執行->就緒, 當前運行進程時間片用完;
3:執行->阻塞,當前運行進程等待鍵盤輸入,進入了睡眠狀態。
4:阻塞->就緒,I/O操作完成,被中斷處理程序喚醒。


進程的執行狀態分爲:核心態和用戶態,兩者的主要區別就是在於進程能否獲取計算機的所有資源(核心態可以,用戶態則受到限制)。凡是涉及到計算機根本運行的事情都應該在內核態下執行,而中斷、時鐘日期、存儲映象圖都屬於系統級的資源,對這些資源的修改則都必須在覈心態,但是讀取則沒有強制要求。

進程的組成:進程有PCB(進程控制塊)、有關程序段、和該程序段對其進行操作的數據結構集組成。

創建進程的必須步驟:
1.申請空白PCB(進程控制塊)
2.爲新進程分派資源
3.初始化PCB
4.將新進程插入就緒隊列


進程於線程的主要區別:
進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一 個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程 序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程。

線程和進程的區別聯繫:
1,進程:子進程是父進程的複製品。子進程獲得父進程數據空間、堆和棧的複製品。
2,線程:相對與進程而言,線程是一個更加接近與執行體的概念,它可以與同進程的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
兩者都可以提高程序的併發度,提高程序運行效率和響應時間。
線程和進程在使用上各有優缺點:線程執行開銷小,但不利於資源管理和保護;而進程正相反。同時,線程適合於在SMP機器上運行,而進程則可以跨機器遷移。
根本區別就一點:用多進程每個進程有自己的地址空間(address space),線程則共享地址空間。所有其它區別都是由此而來的:
1、速度:線程產生的速度快,線程間的通訊快、切換快等,因爲他們在同一個地址空間內。
2、資源利用率:線程的資源利用率比較好也是因爲他們在同一個地址空間內。
3、同步問題:線程使用公共變量/內存時需要使用同步機制還是因爲他們在同一個地址空間內
發佈了24 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章