1. 程式人生 > >程序、執行緒基礎知識點總結

程序、執行緒基礎知識點總結

總體的解釋:

轉自知乎:https://www.zhihu.com/question/25532384/answer/81152571

首先來一句概括的總論:程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述。
下面細說背景:
CPU+RAM+各種資源(比如顯示卡,光碟機,鍵盤,GPS, 等等外設)構成我們的電腦,但是電腦的執行,實際就是CPU和相關暫存器以及RAM之間的事情。
一個最最基礎的事實:CPU太快,太快,太快了,暫存器僅僅能夠追的上他的腳步,RAM和別的掛在各總線上的裝置完全是望其項背。那當多個任務要執行的時候怎麼辦呢?輪流著來?或者誰優先順序高誰來?不管怎麼樣的策略,一句話就是在CPU看來就是輪流著來。
一個必須知道的事實:執行一段程式程式碼,實現一個功能的過程介紹 ,當得到CPU的時候,相關的資源必須也已經就位,就是顯示卡啊,GPS啊什麼的必須就位,然後CPU開始執行。這裡除了CPU以外所有的就構成了這個程式的執行環境,也就是我們所定義的程式上下文。當這個程式執行完了,或者分配給他的CPU執行時間用完了,那它就要被切換出去,等待下一次CPU的臨幸。在被切換出去的最後一步工作就是儲存程式上下文,因為這個是下次他被CPU臨幸的執行環境,必須儲存。
串聯起來的事實:前面講過在CPU看來所有的任務都是一個一個的輪流執行的,具體的輪流方法就是:先載入程式A的上下文,然後開始執行A,儲存程式A的上下文,調入下一個要執行的程式B的程式上下文,然後開始執行B,儲存程式B的上下文。。。。

========= 重要的東西出現了========
程序和執行緒就是這樣的背景出來的,兩個名詞不過是對應的CPU時間段的描述,名詞就是這樣的功能。
程序就是包換上下文切換的程式執行時間總和 = CPU載入上下文+CPU執行+CPU儲存上下文
執行緒是什麼呢?
程序的顆粒度太大,每次都要有上下的調入,儲存,調出。如果我們把程序比喻為一個執行在電腦上的軟體,那麼一個軟體的執行不可能是一條邏輯執行的,必定有多個分支和多個程式段,就好比要實現程式A,實際分成 a,b,c等多個塊組合而成。那麼這裡具體的執行就可能變成:
程式A得到CPU =》CPU載入上下文,開始執行程式A的a小段,然後執行A的b小段,然後再執行A的c小段,最後CPU儲存A的上下文。
這裡a,b,c的執行是共享了A的上下文,CPU在執行的時候沒有進行上下文切換的。這裡的a,b,c就是執行緒,也就是說執行緒是共享了程序的上下文環境,的更為細小的CPU時間段。

到此全文結束,再一個總結:

程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述,不過是顆粒大小不同。

形象的解釋:

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

更多的概念:

程序(process)
廣義定義:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。
簡單的來講程序的概念主要有兩點:第一,程序是一個實體。每一個程序都有它自己的地址空間,一般情況下,包括文字區域(text region)、資料區域(data region)和堆疊(stack region)

文字區域儲存處理器執行的程式碼;資料區域儲存變數和程序執行期間使用的動態分配的記憶體;堆疊區域儲存著活動過程呼叫的指令和本地變數。第二,程序是一個“執行中的程式”。程式是一個沒有生命的實體,只有處理器賦予程式生命時,它才能成為一個活動的實體,我們稱其為程序。
程序狀態:程序有三個狀態,就緒、執行和阻塞就緒狀態其實就是獲取了出cpu外的所有資源,只要處理器分配資源就可以馬上執行。就緒狀態有排隊序列什麼的,排隊原則不再贅述。執行態就是獲得了處理器分配的資源,程式開始執行。阻塞態,當程式條件不夠時候,需要等待條件滿足時候才能執行,如等待i/o操作時候,此刻的狀態就叫阻塞態

程式
說起程序,就不得不說下程式。先看定義:程式是指令和資料的有序集合,其本身沒有任何執行的含義,是一個靜態的概念。而程序則是在處理機上的一次執行過程,它是一個動態的概念。這個不難理解,其實程序是包含程式的,程序的執行離不開程式,程序中的文字區域就是程式碼區,也就是程式。

執行緒
通常在一個程序中可以包含若干個執行緒,當然一個程序中至少有一個執行緒,不然沒有存在的意義。執行緒可以利用程序所擁有的資源,在引入執行緒的作業系統中,通常都是把程序作為分配資源的基本單位,而把執行緒作為獨立執行和獨立排程的基本單位,由於執行緒比程序更小,基本上不擁有系統資源,故對它的排程所付出的開銷就會小得多,能更高效的提高系統多個程式間併發執行的程度。

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

1) 簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.
2) 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。
3) 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。
4) 執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
5) 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

優缺點
執行緒和程序在使用上各有優缺點:執行緒執行開銷小,但不利於資源的管理和保護;而程序正相反。同時,執行緒適合於在SMP(多核處理機)機器上執行,而程序則可以跨機器遷移。

例項
多執行緒寫日誌

 

主執行緒和子執行緒的執行順序

https://www.cnblogs.com/Loonger/p/7638209.html

https://blog.csdn.net/u011519624/article/details/79039380

 

父程序和子程序的執行順序

https://blog.csdn.net/uzizi/article/details/80023296

 

並行和併發

說到多執行緒程式設計,那麼就不得不提並行和併發,多執行緒是實現併發(並行)的一種手段。並行是指兩個或多個獨立的操作同時進行。注意這裡是同時進行,區別於併發,在一個時間段內執行多個操作。在單核時代,多個執行緒是併發的,在一個時間段內輪流執行;在多核時代,多個執行緒可以實現真正的並行,在多核上真正獨立的並行執行。例如現在常見的4核4執行緒可以並行4個執行緒;4核8執行緒則使用了超執行緒技術,把一個物理核模擬為2個邏輯核心,可以並行8個執行緒。

併發程式設計

通常,要實現併發有兩種方法:多程序和多執行緒。

多程序併發
使用多程序併發是將一個應用程式劃分為多個獨立的程序(每個程序只有一個執行緒),這些獨立的程序間可以互相通訊,共同完成任務。由於作業系統對程序提供了大量的保護機制,以避免一個程序修改了另一個程序的資料,使用多程序比多執行緒更容易寫出安全的程式碼。但這也造就了多程序併發的兩個缺點:
1、在程序件的通訊,無論是使用訊號、套接字,還是檔案、管道等方式,其使用要麼比較複雜,要麼就是速度較慢或者兩者兼而有之。
2、執行多個執行緒的開銷很大,作業系統要分配很多的資源來對這些程序進行管理。
由於多個程序併發完成同一個任務時,不可避免的是:操作同一個資料和程序間的相互通訊,上述的兩個缺點也就決定了多程序的併發不是一個好的選擇。

多執行緒併發

多執行緒併發指的是在同一個程序中執行多個執行緒。有作業系統相關知識的應該知道,執行緒是輕量級的程序,每個執行緒可以獨立的執行不同的指令序列,但是執行緒不獨立的擁有資源,依賴於建立它的程序而存在。也就是說,同一程序中的多個執行緒共享相同的地址空間,可以訪問程序中的大部分資料,指標和引用可以線上程間進行傳遞。這樣,同一程序內的多個執行緒能夠很方便的進行資料共享以及通訊,也就比程序更適用於併發操作。由於缺少作業系統提供的保護機制,在多執行緒共享資料及通訊時,就需要程式設計師做更多的工作以保證對共享資料段的操作是以預想的操作順序進行的,並且要極力的避免死鎖(deadlock)。

https://www.cnblogs.com/wangguchangqing/p/6134635.html

http://www.runoob.com/cplusplus/cpp-multithreading.html

https://www.cnblogs.com/codingmengmeng/p/5913068.html

https://blog.csdn.net/dcrmg/article/details/53912941

https://blog.csdn.net/u011028345/article/details/73440873/

https://www.cnblogs.com/lpxblog/p/5190438.html