1. 程式人生 > 實用技巧 >《我是一個執行緒》閱讀筆記

《我是一個執行緒》閱讀筆記

《我是一個執行緒》閱讀筆記 | 總結

《我是一個執行緒》是一個經典的文章。

文章以小故事的方式來介紹執行緒,可以給讀者比較粗淺的認知,形成一個總體的概念,比較適合初學者。

文章地址:
https://blog.csdn.net/coderising/article/details/100021124

執行緒

執行緒被建立後處於就緒態,被選中執行後進入執行態,執行過程中誰是可能會被打斷,讓出CPU。執行緒一直處於就緒、執行兩個狀態,直到工作結束,進入終止態。有些執行緒終止後會被銷燬,有些會進入執行緒池。

文章中執行緒的宿命是處理包裹。也就是,執行緒封裝執行資訊,包括狀態資訊、暫存器、執行棧和區域性變數、過程呼叫引數、返回值等私有部分的管理。

多執行緒的實現分為三類:

  • 核心級執行緒(Kernel Level Thread, KTL)
  • 使用者級執行緒(User Level Thread, ULT)
  • 混合式執行緒

對於核心級執行緒,通常作業系統排程程式會選擇一個優先順序高的執行緒執行,不用考慮該執行緒屬於哪個程序。

對於使用者級執行緒,作業系統排程程式以程序為單位,以分配時間片的方式進行排程。

執行緒池

執行緒池採用預建立的技術,在應用程式啟動之後,將立即建立一定數量的執行緒,放入空閒佇列中。這些執行緒都是處於阻塞(Suspended)狀態,不消耗CPU,但佔用較小的記憶體空間。當任務到來後,緩衝池選擇一個空閒執行緒,把任務傳入此執行緒中執行。系統關閉時,執行緒池會被銷燬。

Memecached

memcached是一套分散式的快取記憶體系統, 在文章中相當於一個快取資料的執行緒。

快取執行緒通過分散式網路獲取使用者資料,其他執行緒再從快取中獲取資料,大大提高了資料的載入速度。

鎖線上程中作為一種安全機制,防止資料被多個執行緒處理時發生錯誤。

如果沒有加鎖,可能會出現以下情況:

加鎖後:

死鎖

在許多應用中,程序需要以獨佔方式訪問資源,當作業系統允許多個程序併發執行時,可能會出現程序永遠被堵塞現象。此現象稱為死鎖。執行緒也存在死鎖問題。

deadlock

解決死鎖的主要方法:

  • 死鎖防止(deadlock prevention)
  • 死鎖避免(deadlock avoidance)
  • 死鎖檢測和恢復(deadlock detection and recovery)

文章中根據演算法,用來計算資源的大小,計算出來以後,永遠按照從大到小的方式來獲得鎖。這種方法屬於 死鎖檢測和恢復(deadlock detection and recovery)中的程序撤銷法。

程序撤銷法有兩種:

  1. 撤銷陷於死鎖的所有程序,解除死鎖,繼續執行。
  2. 逐個撤銷陷於死鎖的程序,回收其資源並分配,直至死鎖解除。選擇符合下面條件之一的程序先撤銷:CPU消耗時間最小者、產生輸出量最小者、預計剩餘執行時間最長者、分得的資源數量最少者或優先順序最低者。

這裡屬於第二種。

多個資源加鎖要牢記,一定要按Boss的演算法比大小,然後從最大的開始加鎖。

優先順序最低者。

這裡屬於第二種。

多個資源加鎖要牢記,一定要按Boss的演算法比大小,然後從最大的開始加鎖。