我們先來看看什麼是執行緒?
舉個例子:乙個工廠,工廠裡有很多的生產線。此時程序就是這個工廠,而執行緒就是就是工廠中的一條生產線。
執行緒與程序:
1.執行緒就是乙個執行流,建立乙個執行緒就是在核心中建立乙個pcb,這個pcb指向了程序的虛擬位址空間。所以真正去執行**的是每乙個程序內部的執行流,也就是執行緒。
2.執行緒其實在當前核心中是沒有這個概念的,我們所認為的執行緒是乙個輕量級程序(lwp)。
3.建立出來的執行緒的pcb也是需要放在核心中雙向鍊錶上的,也就意味著作業系統可以通過鍊錶來獲取到執行緒的pcb,從而排程執行緒獲取cpu資源。
4.執行緒是作業系統排程的最小單位。
5.程序是作業系統分配資源的最小單位。
通過乙個圖來理解一下執行緒與程序:
知道了是上述概念,大家也許會有個疑問:乙個程序中的所有執行緒都是和程序共享資源的,那麼他們共享部分資源?還是共享全部資源?共享哪一部分資源?
執行緒與程序的共享:
1.共享了程序虛擬位址空間,**段和資料段,函式和全域性變數都可以被執行緒訪問到。
2.檔案描述符表。
3.當前程序的工作路徑。
4.使用者id和組id。
執行緒獨有的
1.tid。
2.訊號遮蔽字。
3.優先順序排程。
4.一組暫存器(程式計數器、上下文資訊)。
5.errno。
6.執行緒私有的棧(如果都用程序虛擬位址空間的棧,有可能會造成呼叫棧混亂的問題)。
用一幅圖來理解一下執行緒獨有的內容在程序虛擬位址空間中的位置
那麼執行緒id在核心中是如何標識的?
核心級的執行緒id,和程序id一樣,執行緒id是pid_t型別的變數,而且能夠用來唯一標識執行緒的乙個整形變數。
那麼我們為什麼要學習多執行緒呢?
因為多執行緒可以提高程式的效率。縮減程式的執行時間。
執行緒的優點:
1.建立乙個執行緒的開銷要比建立乙個程序的開銷小。
2.建立乙個執行緒所用的資源要比建立乙個程序小。
3.程序當中的不同執行緒可以並行的去執行。
執行緒的缺點:
1.健壯性(魯棒性)低。也就是其他執行緒正常執行,只要某乙個執行緒崩潰了,就會導致整個程序崩潰掉。
2.**的編寫難度變高了。
3.缺乏訪問控制,不同的執行流的執行先後問題。
這裡說一些關於執行緒的指令:多執行緒與多程序的區別
1.多程序:每乙個程序都有自己的虛擬位址空間,所以乙個程序的異常不會導致其他程序異常退出。多程序也會提高程式的執行效率或者程式的穩定性,帶來了程序間通訊的問題。
2.多執行緒:由於執行緒都是用同乙個程序的虛擬位址空間,所以乙個執行緒異常有可能導致整個程序退出。所以多執行緒的健壯性(魯棒性)低。多執行緒也會提高程式的執行效率。
Linux下的多執行緒概念
執行緒是程序內部的執行單位,乙個執行緒即使程序內的乙個執行流。對於執行緒,每個系統的實現可能不一樣,在linux中,執行緒也叫輕量級程序,作業系統沒有把執行緒與程序明顯的區分開,它們的資料結構是一樣的,都是task struct。在程序資源分配時,以程序為單位程序分配 而在排程時,則以執行緒為單位。...
Linux之執行緒概念(pthread)
執行緒概念 1 輕量級的程序,乙個程序內部可以有多個執行緒,預設情況下乙個程序只有乙個執行緒。2 執行緒是最小的執行單元,程序是最小的系統資源分配單位。3 核心實現都是通過clone函式實現,執行緒也有自己的pcb。檢視pthread庫版本命令 getconf gnu libpthread vers...
執行緒的概念
多工 作業系統執行多個程序,cpu有分時機制,讓所有的都能迴圈獲得自己的cpu時間片,但是輪轉快,所以使得程式像是同時運轉 執行緒 乙個程序內部單一的乙個順序控制流,是乙個程序同時執行多個執行緒 為了建立執行緒可以從thread中進行繼承,這個類裡包含建立和執行的所有執行緒的東西,thread最重要...