《我是一個執行緒》閱讀筆記
《我是一個執行緒》閱讀筆記 | 總結
《我是一個執行緒》是一個經典的文章。
文章以小故事的方式來介紹執行緒,可以給讀者比較粗淺的認知,形成一個總體的概念,比較適合初學者。
文章地址:
https://blog.csdn.net/coderising/article/details/100021124
執行緒
執行緒被建立後處於就緒態,被選中執行後進入執行態,執行過程中誰是可能會被打斷,讓出CPU。執行緒一直處於就緒、執行兩個狀態,直到工作結束,進入終止態。有些執行緒終止後會被銷燬,有些會進入執行緒池。
文章中執行緒的宿命是處理包裹。也就是,執行緒封裝執行資訊,包括狀態資訊、暫存器、執行棧和區域性變數、過程呼叫引數、返回值等私有部分的管理。
多執行緒的實現分為三類:
- 核心級執行緒(Kernel Level Thread, KTL)
- 使用者級執行緒(User Level Thread, ULT)
- 混合式執行緒
對於核心級執行緒,通常作業系統排程程式會選擇一個優先順序高的執行緒執行,不用考慮該執行緒屬於哪個程序。
對於使用者級執行緒,作業系統排程程式以程序為單位,以分配時間片的方式進行排程。
執行緒池
執行緒池採用預建立的技術,在應用程式啟動之後,將立即建立一定數量的執行緒,放入空閒佇列中。這些執行緒都是處於阻塞(Suspended)狀態,不消耗CPU,但佔用較小的記憶體空間。當任務到來後,緩衝池選擇一個空閒執行緒,把任務傳入此執行緒中執行。系統關閉時,執行緒池會被銷燬。
Memecached
memcached是一套分散式的快取記憶體系統, 在文章中相當於一個快取資料的執行緒。
快取執行緒通過分散式網路獲取使用者資料,其他執行緒再從快取中獲取資料,大大提高了資料的載入速度。
鎖
鎖線上程中作為一種安全機制,防止資料被多個執行緒處理時發生錯誤。
如果沒有加鎖,可能會出現以下情況:
加鎖後:
死鎖
在許多應用中,程序需要以獨佔方式訪問資源,當作業系統允許多個程序併發執行時,可能會出現程序永遠被堵塞現象。此現象稱為死鎖。執行緒也存在死鎖問題。
解決死鎖的主要方法:
- 死鎖防止(deadlock prevention)
- 死鎖避免(deadlock avoidance)
- 死鎖檢測和恢復(deadlock detection and recovery)
文章中根據演算法,用來計算資源的大小,計算出來以後,永遠按照從大到小的方式來獲得鎖。這種方法屬於 死鎖檢測和恢復(deadlock detection and recovery)中的程序撤銷法。
程序撤銷法有兩種:
- 撤銷陷於死鎖的所有程序,解除死鎖,繼續執行。
- 逐個撤銷陷於死鎖的程序,回收其資源並分配,直至死鎖解除。選擇符合下面條件之一的程序先撤銷:CPU消耗時間最小者、產生輸出量最小者、預計剩餘執行時間最長者、分得的資源數量最少者或優先順序最低者。
這裡屬於第二種。
“多個資源加鎖要牢記,一定要按Boss的演算法比大小,然後從最大的開始加鎖。”
優先順序最低者。
這裡屬於第二種。
“多個資源加鎖要牢記,一定要按Boss的演算法比大小,然後從最大的開始加鎖。”