首頁  >  文章  >  執行緒和行程有什麼關係

執行緒和行程有什麼關係

青灯夜游
青灯夜游原創
2023-01-31 14:18:1412500瀏覽

關係:1、一個行程可以有多個線程,但至少有一個執行緒;而一個執行緒只能在一個行程的位址空間內活動。 2.資源分配給行程,同一個行程的所有執行緒共享該行程所有資源。 3、CPU分配給線程,也就是真正在處理器運行的是線程。 4.執行緒在執行過程中需要協作同步,不同行程的執行緒間要利用訊息通訊的辦法實現同步。

執行緒和行程有什麼關係

本教學操作環境:windows7系統、Dell G3電腦。

行程是資源分配的基本單位,執行緒是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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn