Linux程序與執行緒

2022-08-05 14:30:22 字數 917 閱讀 7051

每個程序都有一個地址空間和一個控制執行緒。如果一個程序中有多個控制執行緒,那麼就是多執行緒的情況。程序是資源分配的最小單位,執行緒是cpu排程的最小單位。

程序與執行緒的區別(或者說在已經有程序的情況下,為什麼還需要執行緒):

1.多執行緒可以表達為在相同地址空間下的程式並行執行,多程序可以表達為在不同地址空間下的程式並行執行。

2.執行緒比程序要更加輕量級,執行緒的建立、銷燬、切換都快於程序。執行緒用於做正事的時間多,cpu利用率高。具體在上下文切換方面,執行緒的排程需要切換上下文,程序的排程在切換上下文之前,需要切換到新的地址空間(對於linux,執行緒和程序的最大區別就在於地址空間)。

3.執行緒之間的資料共享較簡單,程序之間的資料共享較複雜。

每個執行緒所私有的東西:程式計數器、堆疊、暫存器(結合“執行緒是cpu排程的最小單位”就很好理解了,切換執行緒時,以上三樣都需要儲存起來以便下次恢復現場)。同個程序下執行緒之間共享的東西:地址空間、全域性變數、開啟檔案。

每個程序都有一個程序id,用非負整數pid_t來表示。比如程序0代表排程程序,程序1代表init程序。

pid_t fork(void);

我們可以使用fork()函式建立一個新的程序,fork()函式比較特殊,一次呼叫兩次返回。在父程序中,它會返回子程序id(非負整數);在子程序中,它會返回0。我們可以通過fork()的返回值來判斷當前環境在父程序還是子程序。

在fork()之後,子程序獲得父程序資料空間和堆疊的拷貝,他們只是值一樣,儲存空間並不共享。在父程序中開啟的檔案描述符,在子程序中也是開啟的,而且父子程序操作的是同一個檔案。所以fork()函式之後,檔案是共享的,資料是拷貝的

一個程序內的所有資訊對同一個程序內的執行緒都是共享的,包括可執行**的程式、程式的全域性記憶體、堆記憶體、棧以及檔案描述符。

管道、fifo、訊息佇列、訊號量、共享儲存