-
在Linux系統中,有六種方式可以實現執行緒同步,包括:互斥鎖、自旋鎖、訊號量、條件變數、讀寫鎖和屏障。 最常用的執行緒同步方法是互斥鎖、旋轉鎖和訊號量。
1. 相互排斥
互斥鎖本質上是乙個特殊的全域性變數,具有鎖定和解鎖兩種狀態,解鎖互斥鎖可以通過乙個執行緒獲得,當互斥鎖被乙個執行緒持有時,互斥鎖會被鎖定為鎖定狀態,然後只有執行緒才有開啟鎖的電源,其他想要獲取互斥鎖的執行緒將被阻止,直到互斥鎖解鎖。
互斥鎖的型別:
普通鎖:預設的互斥鎖型別。 當乙個執行緒鎖定乙個普通鎖時,其餘請求鎖的執行緒會形成等待佇列,並在鎖解鎖後按照優先順序獲取,保證了資源分配的公平性。
如果執行緒重新鎖定已經鎖定的普通鎖,則會導致死鎖; 解鎖已經被另乙個執行緒鎖定的普通鎖,或重新解鎖已經解鎖的普通鎖,將導致不可預見的後果。
錯誤檢測鎖:如果執行緒再次鎖定鎖定的錯誤檢測鎖,則鎖定操作返回 edeadlk; 如果解鎖已被其他執行緒鎖定的故障檢測鎖,或者重新解鎖已解鎖並製作襪子的故障檢測鎖,則解鎖操作將返回 eperm。
巢狀鎖:這種鎖允許執行緒在釋放鎖之前多次鎖定鎖,而不會出現死的純鎖; 要使其他執行緒獲取此鎖,當前鎖的所有者必須執行多個解鎖操作; 如果解鎖已被其他執行緒鎖定的巢狀鎖,或解鎖已解鎖的巢狀鎖,則解鎖操作將返回 eperm。
預設鎖:如果乙個執行緒解鎖了再次解鎖的預設鎖,或者解鎖了被另乙個執行緒鎖定的預設鎖,或者解鎖了解鎖的預設鎖,將導致不可預測的後果; 此鎖可以對映到上述三種型別的鎖之一。
2.旋轉鎖
自旋鎖,顧名思義,就是乙個無限迴圈,不停的輪詢,當乙個執行緒沒有得到自旋鎖時,它不會像互斥鎖一樣進入阻塞休眠狀態,而是不斷輪詢得到鎖,如果自旋鎖能快速釋放,那麼效能會非常高,如果旋轉鎖長時間不能釋放, 甚至裡面有大量的IO阻塞,也會導致其他得到鎖的執行緒被空輪詢,導致CPU使用率達到100%,尤其是CPU時間。
3. 訊號量
訊號量是乙個計數器,用於控制訪問有限共享資源的執行緒數。
-
這個東西真的不火,還是有很多區別的,而且每個都能說大半天。。。讓我們從聯絡人開始。 首先,Linux包含核心執行緒、程序、使用者執行緒三個概念,核心執行緒是Linux核心中的概念,程序通常是使用者空間中的概念,但是因為在核心中為使用者空間建立程序時,基本上和建立核心執行緒是一樣的,所以可以說或者可以看作是核心執行緒對應的程序, 但是有些核心執行緒不用於為程序提供服務。
使用者執行緒不是乙個核心概念,換句話說,使用者執行緒對核心一無所知,所以從這個角度來看,這個過程與使用者執行緒無關。 由於執行緒通常由執行緒庫提供,比如POSIX執行緒庫、cthread執行緒庫等,這些執行緒庫都是使用者空間動態鏈結庫,所以哪個程序呼叫這個庫,執行緒、執行緒管理、排程程式在哪個程序中,不同程序呼叫的庫帶來的執行緒和執行緒管理是無關緊要的。 這就是聯絡。
現在說到區別,區別應該分類一下,首先是排程:程序排程是由核心排程的,程序是由核心中的核心執行緒支撐的,乙個核心執行緒自然包含一組資料結構來儲存相關資訊; 當然,為了提高使用者執行緒被排程和實時的優勢,一些執行緒庫通過一些方式讓核心知道了使用者執行緒的存在,這是進一步的話題。 再看記憶:
最常見的一句話是程序有獨立的記憶體空間,執行緒沒有,這意味著每個程序都有自己的一組頁表,而一組頁表意味著乙個完整的記憶體空間,例如在32位作業系統中,它是2G或3G的空間(取決於不同的CPU和作業系統核心的實現), 因為程序在核心中有自己的狀態,所以替換程序可以替換整個頁表;執行緒在核心中沒有位置,所以只要程序不變,執行緒變了,頁表還是不變的,所以大家的空間都是一樣的,這個時候,我們只能依靠程式設計師自己來保護每個執行緒和執行緒庫的能力,比如: 我換了乙個程式又換了乙個程式,這樣在 b 的原始碼裡就有乙個叫 abc() 的函式,在 a 的原始碼中,我不能直接呼叫 abc(),因為編譯已經完成,即使我告訴編譯器 A 原始碼中 abc() 函式的位址,執行時程序空間中的位址肯定不是 B 中的 abc() 函式, 所以你只能使用遠端呼叫,而遠端呼叫的過程基本上類似於網路上兩台機器同時傳輸乙個資料包,這說明對於作業系統來說,事情在處理這兩種型別的差異也導致了許多細節上的差異,但它們都歸結為這兩點。
希望對你有所幫助。
-
區別和聯絡:
1.流程是獨立執行並具有獨立資源分配的實體;
2、在同一程序的執行緒之間共享程序的資源;
3. 所有程序至少有乙個執行執行緒;
4、建立和切換執行緒的成本小於程序的成本;
執行緒之間的通訊方法:
1.同一程序的執行緒之間相互通訊的最簡單方法是使用全域性變數;
2、不同程序的執行緒之間的通訊,需要通過以下程序之間的通訊來實現;
程序間通訊的方法:
1.管道。 2.訊號量。
3.共享記憶體。
4. 訊息佇列。
5.套接字。
-
今天的技術是執行緒只能在乙個 CPU 上執行。 多核,必須在多執行緒程序中執行才能最大化。 當然,您可以在所有 CPU 上保持單個執行緒來回彈跳。 但效率會很低,很低。
因為 CPU 的暫存器和快取有問題。 如果切換 CPU 執行,則所有資料都會傳遞一次。 這是對時鐘的浪費(在 CPU 上,程式執行不是可以隨意執行指令的時鐘,而是流水線作業,一條指令需要很多時鐘來處理,資料訪問必須等待)。
這也是因為程式本質上是順序的。 您不能使程式的後續結果跳過上乙個結果。
當然,現在的CPU確實有這種技術,這被稱為無序執行。 也就是說,當尚未計算出前表面的工藝時,首先計算以下指令。 但這種事情是猜測,這只是乙個分支,還不可能是某種計算的結果。
無論你的猜測多麼準確,有時你都會弄錯。 最老的Pentium 4版本有這個問題,裝配線太長。 經過計算,發現是錯誤的。
整個管道需要清理和重新計算。 存在嚴重效能問題的奔騰 4 CPU 的管道長度為 31 個級別。 也就是說,乙個程式至少需要 31 個時鐘週期才能從被推到管道的後面到實際執行。
直接浪費了 31 個時鐘週期。
因此,就目前的技術而言,在技術上不可能實現新的單執行緒多核協同計算。
為了提高效能,就是組織資料處理的演算法,把重複計算的過程拆分成多個執行緒分別計算。 這確保了CPU多核的新效率最大化。 每個執行緒可以共享相同的資料,並讀取自己的資料來計算它能做什麼。
但是,此時還存在另乙個問題,即資料定址和交付的效能。
-
這個問題太專業了,但是我有一種感覺,有了這個程式,有的程式支援多核,有的不支援,所以程式的任務,任務中有很多小任務,如果程式支援多核,程式可以把乙個小任務分配給不同的核心或執行緒來處理。
所以有人會說,很多遊戲,尤其是大型單人遊戲,執行好壞,都與CPU的頻率密切相關,雙核和多核之間沒有明顯的區別。 這是因為這些大型單人遊戲不支援多核多程序。
而且,實際使用的作業系統程式是乙個大程式,所以不可能有乙個完整的單程序狀態。 在許多情況下,多核多程序的開放性將明顯強於單核CPU。 這款網路遊戲是最明顯、更開放的。
1 個 CPU,6 個核心和 12 個執行緒。
這裡的執行緒是硬體執行緒,可以百科全書“硬體執行緒軟體執行緒”。 >>>More
1.父子過程之間的關係。
關於資源:子程序獲取父程序的副本,除了與父程序共享的**段外,子程序的所有資源都繼承自父程序,並獲取父程序資源的副本,因為它是副本,即兩者不共享位址空間。 ,兩者是獨立的程序,繼承後兩者不相關,子程序單獨執行。 >>>More