不同程序之間切換,系統開銷很大,為了提高效率很多作業系統(windows和linux)都引入了輕量級程序lwp,即執行緒。
因為同一程序下的執行緒共享相同的位址空間,所以(同一程序下的)執行緒之間切換系統開銷小效率高。
在linux下程式設計,不嚴格區分程序與執行緒,將它們都視為任務,用結構體task_struct描述。
共享相同位址空間(可理解為在同一程序下)的多個任務,我們稱每個任務為乙個執行緒。
1、提高任務切換的效率;
2、避免額外的tlb和cache(快取記憶體)的重新整理。
1、可執行的指令;
2、靜態資料;
3、程序中開啟的檔案描述符;
4、當前的工作目錄;
5、使用者id;
6、使用者組id。
1、執行緒id(tid)
2、pc(程式計數器)和相關暫存器;
3、堆疊;
4、錯誤號(errno);
5、優先順序;
6、執行狀態和屬性。
當乙個程序結束時,其下的所有執行緒都將結束。執行緒也是程序,是特殊的程序。pthread執行緒庫提供如下執行緒重點函式。
因為同一程序下的執行緒共享相同的位址空間,所以執行緒間通訊很容易,通過全域性變數就可以交換資料。但是多個執行緒訪問共享資料時有可能引起混亂,為了使執行緒間通訊有序高效,引出了執行緒間通訊同步和互斥機制。
同步(synchronization)指的是多個任務按照約定的先後次序相互配合完成一件事情。
同步機制是2023年edsgar dijkstra基於訊號量的概念提出的。同步機制即可用於執行緒也可用於程序。
同步機制的實現過程是由訊號量來決定執行緒是繼續執行還是阻塞等待。
訊號量代表某一類資源,其值表示系統中該資源的數量。訊號量是非負整數。
1、無名訊號量:主要用於程序內部的執行緒間通訊(本節講解重點);
2、有名訊號量:可用於程序之間,也可用於執行緒之間通訊。
訊號量是乙個受保護的變數,只能通過三種操作來訪問:初始化;p操作(申請資源);v操作(釋放資源)。
1、訊號量初始化
訊號量定義後,必須初始化,函式如下:
2、p操作(申請資源)和v操作(釋放資源)。
p操作(申請資源)可能引起程式的阻塞,v操作(釋放資源)肯定不會引起程式的阻塞。
1、臨界資源:一次只允許乙個任務(程序或執行緒)訪問的共享資源。
2、臨界區:訪問臨界資源的**。
3、互斥機制的引出:要實現臨界資源的保護,就必須實現訪問同一臨界資源的每個任務的臨界區的互斥。互斥機制裡最常用的就是互斥(mutex)。
4、互斥鎖實現互斥的原理:互斥鎖只要兩種狀態,要不空閒,要不被乙個任務持有。任務在訪問臨界資源前要先申請鎖:如果互斥鎖空閒,申請就可以成功,任務就可以訪問臨界資源,但這個任務訪問完臨界資源後一定要釋放互斥鎖;如果任務申請互斥鎖時,互斥鎖被其它任務持有,該任務就得阻塞等待,直到其他任務訪問完臨界資源釋放互斥鎖,互斥鎖空閒時訪問臨界資源。
3.2.2.1初始化互斥鎖
3.2.2.2申請互斥鎖
3.2.2.3 釋放互斥鎖
Linux之執行緒
一 執行緒標識 每個執行緒有乙個執行緒id。程序id在整個系統中是唯一的,但執行緒id不同,執行緒id只有在它所屬的程序環境中有效。執行緒id用pthread t資料型別來表示,可以用乙個結構來代表pthread t資料型別。include int pthread equal pthread t t...
Linux之執行緒小議
說到執行緒概念,必須先說明程序。程序是乙個執行中的程式,在作業系統中,乙個程式執行起來後就會被載入到記憶體中。作業系統建立了乙個程序描述符 pcb 對程式的執行進行描述控制。因此程序就是pcb,在linux下用task struct結構體來描述。linux系統下,用程序pcb來模擬線程,因此linu...
Linux之執行緒(1)
今天講下linux執行緒這塊的知識,我想很多人應該都知道多執行緒的重要性,現在多執行緒被運用在專案中的次數越來越多,而且面試中多執行緒也是必問的,所以要引起我們足夠的重視將這塊的知識學紮實。在說執行緒之前我們不得不提到程序,從使用者角度來說 程序是執行中的程式 作業系統角度來說 程序是作業系統對執行...