首頁 > 運維 > 安全 > 主體

執行緒和行程有哪些關係

王林
發布: 2023-05-22 22:35:13
轉載
1034 人瀏覽過

一個行程必須要有至少一個線程,但可以有多個執行緒。而一個執行緒只能在一個行程的位址空間內執行。 2.資源分配給行程,同一個行程的所有執行緒共享該行程所有資源。 3、CPU分配給線程,也就是真正在處理器運行的是線程。為了實現同步,執行中的執行緒需要相互協作,跨進程的執行緒應使用訊息通訊方式。

行程是資源分配的基本單位,執行緒是CPU調度和分派的基本單位

執行緒是行程的一部分,一個執行緒只能屬於一個行程,一個行程可以有多個線程,但至少有一個線程

每個進程都有獨立的程式碼和資料空間(程式上下文),程式間的切換開銷大,線程可看做輕量級的進程,同一類執行緒共享程式碼和資料空間,每個執行緒都有自己獨立的運行堆疊和程式計數器(PC),執行緒間切換開銷小

在作業系統中能同時執行多個行程(程式),在同一個進程(程式)中多個執行緒同時執行(透過CPU調度,在每個時間片中只有一個執行緒執行)

系統在運作的時候會為每個行程分配不同的記憶體空間,執行緒除了CPU外,系統不會為執行緒分配記憶體(執行緒所使用的資源來自其所屬行程的資源),執行緒組之間只能共享資源

沒有現成的行程可以看做單執行緒的,如果一個進程內有多個線程,則執行過程不是一條線的,維斯多條線(線程)共同完成
線程是進程的一部分,故線程被稱為輕權進程/輕量級進程

行程與執行緒的關係

1、一個行程可以有多個線程,但至少有一個執行緒;而一個執行緒只能在一個行程的地址空間內活動。

2、資源分配給行程,同一個行程的所有執行緒共享該行程所有資源。

3、CPU分配給線程,也就是真正在處理器運行的是線程。

4、執行緒在執行過程中需要協作同步,不同行程的執行緒間要利用訊息通訊的辦法實現同步。

哪些可以共享進程之間?

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

進程擁有這許多共通性的同時,也擁有自己的個性。有了這些個性,線程才能實現並發性。這些個性包括:

1.執行緒ID
      每個執行緒都有自己的執行緒ID,這個ID在這個行程中是唯一的。進程用此來標識執行緒。

2.暫存器群組的值
      由於執行緒間是並發運作的,每個執行緒有自己不同的運算線索,當從一個執行緒切換到另一個執行緒上時,必須將原有的線程的暫存器集合的狀態保存,以便將來該線程在被重新切換到時能得以恢復。

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

4.錯誤回傳碼
      由於同一個行程中有很多個執行緒在同時運行,可能某個執行緒進行系統呼叫後設定了errno值,而在該執行緒還沒有處理這個錯誤,另外一個執行緒就在此時被調度器投入執行,這樣錯誤值就有可能被修改。

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

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

6.執行緒的優先權
      由於執行緒需要像進程一樣能夠被調度,那麼就必須要有可供調度使用的參數,這個參數就是執行緒的優先權。

進程間通訊的五種方式

1.(無名)管道

半雙工,即不能同時在兩個方向上傳輸資料。有的系統可能支援全雙工。

只能在父子進程間。在經典的形式下,父進程創建管道,然後透過fork子進程,從而實現了父子進程之間的使用。

2.命名管道(FIFO)

不相關的進程也能夠進行資料交換。

3.訊息佇列

一個訊息佇列是一組保存在核心中訊息的列表,類似於一個訊息的鍊錶。使用者進程可以向訊息佇列新增訊息,也可以向訊息佇列讀取訊息。

訊息佇列與管道通訊相比,其優點是對每個訊息指定特定的訊息類型,接收的時候不需要按照佇列順序,而是可以根據自訂條件接收特定類型的訊息。

可以把訊息看做一個記錄,具有特定的格式以及特定的優先權。對訊息佇列有寫入權限的程序可以為訊息佇列中依照一定的規則新增訊息,對訊息佇列有讀取權限的進程可以從訊息佇列讀取訊息。

4.信號量

當多個進程需要存取共享資料時,信號量是一個計數器,主要用於此目的。如果需要確保相同資料不會被兩個進程同時訪問,可以透過信號量來實現。

它的主要流程如下:

檢查控制該資源的信號量

如果信號量值大於0,則資源可用,並且將其減1,表示當前已被使用

如果信號量值為0,則進程休眠直至信號量值大於0

#也就是說,它實際上是提供了一個不同進程或進程的不同執行緒之間訪問同步的手段。

5.共享記憶體

共享記憶體允許兩個或多個進程共享一個給定的儲存區,這一段儲存區可以被兩個或兩個以上的進程映射到自身的位址空間中,一個進程寫入共享記憶體的訊息,可以被其他使用這個共享記憶體的進程,透過一個簡單的記憶體讀取錯做讀出,從而實現了進程間的通訊。

採用共享內存進行通信的一個主要好處是效率高,因為進程可以直接讀寫內存,而不需要任何數據的拷貝,對於像管道和消息隊裡等通信方式,則需要再內核和使用者空間進行四次的資料拷貝,而共享記憶體則只拷貝兩次:一次從輸入檔案到共享記憶體區,另一次從共享記憶體到輸出檔案。

一般而言,進程之間在共享內存時,並不總是讀寫少量數據後就解除映射,有新的通信時在重新建立共享內存區域;而是保持共享區域,直到通信完畢為止,這樣,資料內容一直保存在共享記憶體中,並沒有寫回檔案。由於共享記憶體中的內容通常在解除映射時才寫回文件,因此採用共享記憶體進行通訊的方法具有極高的效率。

6.套接字Socket:

套解口也是一種進程間通訊機制,與其他通訊機制不同的是,它可用於不同電腦間的進程通訊。

7.訊號 ( sinal )

訊號是一種比較複雜的通訊方式,用來通知接收行程某個事件已經發生

以上是執行緒和行程有哪些關係的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!