多線程、進程、並發、並行、同步、異步、偽並發、真並發


進程、線程

1、進程

一個程序,可以獨立運行的一段程序。系統對它進行資源分配和調度。

2、線程

進程的基本單位,對它進行cpu分配和調度。只擁有一點在運行中必不可少的資源(寄存器,棧,程序計數器)

3、線程與進程的聯系與區別

聯系:

(1)線程是指進程內的一個執行單元,一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程(通常說的主線程)。 但是存在 DOS 這樣的單進程(而且無線程概念)系統。

(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源,線程自己基本上不擁有系統資源。

(3)處理機分給線程,即真正在處理機上運行的是線程。

(4) 線程的改變只代表了 CPU 執行過程的改變,而沒有發生進程所擁有的資源變化。

區別:

(1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位。

(2)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進     

程的資源。

共有特性:

(3)並發性:進程之間可以並發執行,同一個進程的多個線程之間也可以並發執行。

4、同一進程下,線程與線程之間的聯系

(1)進程可創建多個線程來執行同一程序的不同部分。

(2) 一個線程可以創建和撤消另一個線程,同一個進程中的多線程之間可以並發執行

(3)線程在執行過程中,需要協作同步,不同進程的線程間要利用消息通信的辦法實現同步。 (為什么要同步:見同步舉例)

(4)充分發揮多處理器的功能。通過創建多線程進程,每個線程在一個處理器上運行,從而實現應用程序的並發性,使每個處理器都得到充分運行。

 

線程之間同步舉例:

假設有一個程序,其中一個線程用於把文件讀到內存,而另一個線程用於統計文件中的字符數。當然,在把整個文件調入內存之前,統計它的計數是沒有意義的。由於是不同進程里的線程,操作系統會把兩個線程當作是互不相干的任務分別執行,這樣就可能在沒有把整個文件裝入內存時統計字數。為解決此問題,你必須使兩個線程同步工作。

 

其它:

在網絡或多用戶環境下,一個服務器通常需要接收大量且不確定數量用戶的並發請求,為每一個請求都創建一個進程顯然是行不通的,——無論是從系統資源開銷方面或是響應用戶請求的效率方面來看。

 

線程可以有效地提高系統的執行效率,但並不是在所有計算機系統中都是適用的,如某些很少做進程調度和切換的實時系統。使用線程的好處是有多個任務需要處理機處理時,減少處理機的切換時間;而且,線程的創建和結束所需要的系統開銷也比進程的創建和結束要小得多。最適用使用線程的系統是多處理機系統和網絡系統或分布式系統。

 

並行、並發

解釋一:並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔發生。

解釋二:並行是在不同實體上的多個事件,並發是在同一實體上的多個事件。

解釋三:在一台處理器上"同時"處理多個任務,在多台處理器上同時處理多個任務。如hadoop分布式集群

進程的並發和並行與線程的並發和並行:

進程的並發:

並發的關鍵是你有處理多個任務的能力,不一定要同時執行。在操作系統中cpu只能並發處理進程(存在多個進行,但是是輪流執行的),不能並行。

並行的關鍵是能同時處理多個任務。

 

線程的並發和並行:(線程跟處理器聯系在一起)

在進程可以同時擁有兩個或者多個線程。如果程序在單核處理器上運行,那么這兩個線程將交替地換入或者換出內存。這些線程是並發的——每個線程都處於執行過程中的某個狀態。

如果程序能夠同時執行,那么就一定是運行在多核處理器上。此時,程序中的每個線程都將分配到一個獨立的處理器核上,此時他們是並行的。

 

"並行"概念是"並發"概念的一個子集。也就是說,你可以編寫一個擁有多個線程或者進程的並發程序,但如果沒有多核處理器來執行這個程序,那么就不能以並行方式來運行代碼。

 

同步、異步

僅針對js語言:

示例場景:同步請求與異步請求

同步請求:發起請求,然后等待,當執行完請的回調函數才繼續執行請求代碼塊之后的代碼,如果一直沒又響應,會阻塞請求代碼塊后面代碼的執行。

異步請求:發起請求,繼續執行請求代碼塊之后的代碼,不會阻塞請求代碼塊后面代碼的執行,當請求被響應時,系統會通知進程處理。這樣提高執行效率。

 

多線程和異步

比如js里是單線程的,里面用異步當時。所以在這里異步和線程不在一個層面的上。

異步和多線程兩者都可以達到避免調用線程阻塞的目的,從而提高軟件的可響應性。甚至有些時候就認為異步和多線程是等同的概念。但是,異步和多線程還是有一些區別的。而這些區別造成了使用異步和多線程的時機的區別。

cpu層面談區別:

CPU的異步處理:DMA——直 接內存訪問的意思,擁有DMA功能的硬件在和內存進行數據交換的時候可以不消耗CPU資源和時間。只要CPU在發起數據傳輸時發送一個指令,硬件就開 始自己和內存交換數據,在傳輸完成之后硬件會觸發一個中斷來通知操作完成。是等待執行的

 

多線程:線程本質上是進程中一段並發運行的代碼,線程需要操作系統投入CPU資源來運行和調度。

這個要多個處理器處理才能實現多線程,這些線程是同時執行的。

從執行時機來看,就不是同一個概念

 

在js里來談:

多線程即要同時處理多個事件,但是js是順序執行的,所以即使是對同一行為,也根據事件注冊的先后順序去觸發事件,這就不存在多線程。

異步是在處理一個事件的同時,等待的某個事件被觸發了,也會執行,是同時處理多個事件

比如頁面一直在倒計時,這時候某個數據回來,執行的函數是去渲染頁面的某個部分,這時是即在倒計時也在渲染。可以這樣舉例嗎?

 

適用范圍(不知道該從什么層面來講,感覺不同層面不同的優缺點)

當需要執行I/O操作時,使用異步操作比使用線程+同步 I/O操作更合適。I/O操作不僅包括了直接的文件、網絡的讀寫,還包括數據庫操作、Web Service、HttpRequest以及.net Remoting等跨進程的調用。

 

  而線程的適用范圍則是那種需要長時間CPU運算的場合,例如耗時較長的圖形處理和算法執行。但是往往由於使用線程編程的簡單和符合習慣,所以很多朋友往往會使用線程來執行耗時較長的I/O操作。這樣在只有少數幾個並發操作的時候還無傷大雅,如果需要處理大量的並發操作時就不合適了。

 

偽並發和真並發

偽並發是指單核處理器的並發。

真並發是指多核處理器的並發。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM