程序和執行緒

2022-04-01 05:02:10 字數 4252 閱讀 2872

程序,是併發執行的程式在執行過程中分配和管理資源的基本單位,是乙個動態概念,竟爭計算機系統資源的基本單位。每乙個程序都有乙個自己的位址空間,即程序空間或(虛空間)。程序空間的大小 只與處理機的位數有關,乙個 16 位長處理機的程序空間大小為 2^16 ,而 32 位處理機的程序空間大小為 2^32 。

程序至少有 5 種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。

執行緒,在網路或多使用者環境下,乙個伺服器通常需要接收大量且不確定數量使用者的併發請求,為每乙個請求都建立乙個程序顯然是行不通的,——無論是從系統資源開銷方面或是響應使用者請求的效率方面來看。因此,作業系統中線程的概念便被引進了。執行緒,是程序的一部分,乙個沒有執行緒的程序可以被看作是單執行緒的。執行緒有時又被稱為輕權程序或輕量級程序,也是 cpu 排程的乙個基本單位。

說到這裡,我們對程序與執行緒都有了乙個大體上的印象,現在開始說說二者大致的區別。

程序的執行過程是線狀的,儘管中間會發生中斷或暫停,但該程序所擁有的資源只為該線狀執行過程服務。一旦發生程序上下文切換,這些資源都是要被保護起來的。這是程序巨集觀上的執行過程。而程序又可有單執行緒程序與多執行緒程序兩種。我們知道,程序有 乙個程序控制塊 pcb ,相關程式段 和 該程式段對其進行操作的資料結構集 這三部分,單執行緒程序的執行過程在巨集觀上是線性的,微觀上也只有單一的執行過程;而多執行緒程序在巨集觀上的執行過程同樣為線性的,但微觀上卻可以有多個執行操作(執行緒),如不同**片段以及相關的資料結構集。執行緒的改變只代表了 cpu 執行過程的改變,而沒有發生程序所擁有的資源變化。出了 cpu 之外,計算機內的軟硬體資源的分配與執行緒無關,執行緒只能共享它所屬程序的資源。與程序控制表和 pcb 相似,每個執行緒也有自己的執行緒控制表 tcb ,而這個 tcb 中所儲存的執行緒狀態資訊則要比 pcb 表少得多,這些資訊主要是相關指標用堆疊(系統棧和使用者棧),暫存器中的狀態資料。程序擁有乙個完整的虛擬位址空間,不依賴於執行緒而獨立存在;反之,執行緒是程序的一部分,沒有自己的位址空間,與程序內的其他執行緒一起共享分配給該程序的所有資源

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

同乙個程序的執行緒可以共享哪些資源:

執行緒共享的環境包括:程序**段、程序的公有資料(利用這些共享的資料,執行緒很容易的實現相互之間的通訊)、程序開啟的檔案描述符、訊號的處理器、程序的當前目錄和程序使用者id與程序組id。

程序擁有這許多共性的同時,還擁有自己的個性。有了這些個性,執行緒才能實現併發性。這些個性包括:

1.執行緒id

每個執行緒都有自己的執行緒id,這個id在本程序中是唯一的。程序用此來標識執行緒。

2.暫存器組的值

由於執行緒間是併發執行的,每個執行緒有自己不同的執行線索,當從乙個執行緒切換到另乙個執行緒上時,必須將原有的執行緒的暫存器集合的狀態儲存,以便

將來該執行緒在被重新切換到時能得以恢復。

3.執行緒的堆疊

堆疊是保證執行緒獨立執行所必須的。執行緒函式可以呼叫函式,而被呼叫函式中又是可以層層巢狀的,所以執行緒 必須擁有自己的函式堆疊,使得函式呼叫可以正常執行,不受其他執行緒的影響。

4.錯誤返回碼

由於同乙個程序中有很多個執行緒在同時執行,可能某個執行緒進行系統呼叫後設定了errno值,而在該執行緒還沒有處理這個錯誤,另外乙個執行緒就在此時

被排程器投入執行,這樣錯誤值就有可能被修改。

所以,不同的執行緒應該擁有自己的錯誤返回碼變數。

5.執行緒的訊號遮蔽碼

由於每個執行緒所感興趣的訊號不同,所以執行緒的訊號遮蔽碼應該由執行緒自己管理。但所有的執行緒都共享同樣的訊號處理器。

6.執行緒的優先順序

由於執行緒需要像程序那樣能夠被排程,那麼就必須要有可供排程使用的參 數,這個引數就是執行緒的優先順序。

涉及多執行緒程式涉及的時候經常會出現一些令人難以思議的事情,用堆和棧分配乙個變數可能在以後的執行中產生意想不到的結果,而這個結果的表現就是記憶體的非法被訪問,導致記憶體的內容被更改。 

理解這個現象的兩個基本概念是:在乙個程序的執行緒共享堆區,而程序中的執行緒各自維持自己堆疊。 

另一執行機制就是如果宣告乙個成員變數如 char name[200],隨著這段**呼叫的結束,name在棧區的位址被釋放,而如果是 char * name = new char[200]; 情況則完全不同,除非顯示呼叫delete否則 name指向的位址不會被釋放。 

在b中如果用棧區 即採用臨時變數的機制分配宣告v和堆區,而者的結果是不同的。如果用棧區,如果變數位址為am1-am2這麼大,退出b呼叫時候這段位址被釋放,c函式可能將這段記憶體改寫;這樣當d執行的時候,從記憶體am1-am2中讀取的內容就是被改過的了。 

而如果用new(堆)分配,則不會出現那樣的情況,因為沒有顯示對用delete並且堆對於執行緒共享,即2執行緒可以看到1執行緒在堆裡分配的東西,所以不會發生誤寫。 

這個問題是筆者在公司實習的時候發現的,因為當時剛剛涉及多執行緒程式設計,作業系統中如此簡單的話題困擾筆者很久,希望可以對初涉c++多執行緒的讀者有所幫助! 2)如果兩個執行緒共享堆,而且都有可能執行記憶體分配和釋放操作,就必須進行同步保護,這個和c類,r類,t類沒有關係。你看到的例子兩個執行緒應該是使用各自的堆。 

在 windows 等平台上,不同執行緒預設使用同乙個堆,所以用 c 的 malloc (或者 windows 的 globalalloc)分配記憶體的時候是使用了同步保護的。如果沒有同步保護,在兩個執行緒同時執行記憶體操作的時候會產生競爭條件,可能導致堆內記憶體管理混亂。比如兩個執行緒分配了統一塊記憶體位址,空閒鍊錶指標錯誤等。 

symbian 的執行緒一般使用獨立的堆空間。這樣每個執行緒可以直接在自己的堆裡分配和釋放,可以減少同步所引入的開銷。當執行緒退出的時候,系統直接**執行緒的堆空間,執行緒內沒有釋放的記憶體空間也不會造成程序內的記憶體洩漏。 

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

1. 執行緒的執行特性。

執行緒只有 3 個基本狀態:就緒,執行,阻塞。

執行緒存在 5 種基本操作來切換執行緒的狀態:派生,阻塞,啟用,排程,結束。

2. 程序通訊。

單機系統中程序通訊有 4 種形式:主從式,會話式,訊息或郵箱機制,共享儲存區方式。

主從式典型例子:終端控制程序和終端程序。

會話式典型例子:使用者程序與磁碟管理程序之間的通訊。

簡而言之,乙個程式至少有乙個程序,乙個程序至少有乙個執行緒. 

執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有乙個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

從邏輯角度來看,多執行緒的意義在於乙個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的乙個獨立單位.

執行緒是程序的乙個實體,是cpu排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬乙個程序的其他的執行緒共享程序所擁有的全部資源.

乙個執行緒可以建立和撤銷另乙個執行緒;同乙個程序中的多個執行緒之間可以併發執行.

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

執行緒和程序

標準的定義是 程序是執行緒的容器,乙個程序可於乙個或者多個執行緒,它是系統分配資源的基本單位 同乙個程序下,執行緒共享位址空降 已經開啟的檔案 訊號處理函式 報警訊號和其他,執行緒自己只保留程式計數器和棧。但是很遺憾的,這個只是教科書上的定義,實際情況是每個作業系統實現的作業系統特性不同,實現的方法...

程序和執行緒

乙個程序就是當前正在執行的乙個程式,包括程式的暫存器 程式計數器和變數的當前值。不同的程序擁有不同的位址空間。而執行緒可以理解為是程序中的控制流。同乙個程序內也就是說在同乙個位址空間內可以有多個控制流。也就是可以有多個線 程,他們共享位址空間。我們通常將程序視為是資源的集合,程序中有程式的正文 資料...

執行緒和程序

對於求職者,在面試的時候大多都會被問到 你對多執行緒了解麼?給我講講執行緒和程序的區別吧。在unix中,乙個程序可以理解為執行緒 位址空間 檔案描述符 資料,道破現實,其實就相當於老闆和員工,老闆就是程序,員工就是執行緒。老闆需要僱傭若干員工 執行緒 還要有辦公樓 位址空間 還要有若干的辦公裝置 檔...