複習點:(1)頁面置換演算法 (2)linux鎖機制 (3)執行緒池 (4)記憶體溢位和記憶體洩漏
1、最佳(optimal)置換演算法
這是一種理論上的頁面置換演算法,它的思想是:所選擇淘汰的頁面是以後用不使用的,或是在未來最長時間內不會被再次訪問的頁面。採用最佳置換演算法可以保證獲得最低的缺頁率,但是由於不能確定哪乙個頁面在以後最長時間內不被訪問,所以該演算法只能存在於理論中。
2、先進先出(fifo)頁面置換演算法
fifo演算法的思想是:總是淘汰最先進入記憶體的頁面,即選擇在記憶體中駐留時間最長的頁面予以淘汰。該演算法思想簡單,最容易實現。
3、最近最久(lru)未使用置換演算法
由於無法**各個頁面將來的使用情況,只能利用「最近的過去」作為「最近的將來」作為近似,即雖然無法**以後那個頁面在最長時間內不被訪問,但知道那個頁面在當前最長時間沒有被適用,所以就使用「最近的過去」來代替「最近的將來」。lru(least recently used)演算法的思想是:該頁面在最近沒有被使用,所以就有可能在以後也不會被使用,所以就淘汰該頁面(選擇乙個最近最久未使用的頁面予以淘汰)。
4、最少使用置換演算法
lfu(least frequently used)演算法的思想:淘汰使用最少的頁面和lru演算法的思想差不多。
在請求分頁系統中會經常發生頁面置換的情況,但頁面的置換往往需要很大的系統開銷。
1、影響頁面置換的因素
(1)頁面置換演算法:這時最重要的因素,乙個好的頁面置換演算法,可以有效的將第缺頁率,減少抖動次數。
(2)寫回磁碟的速度:一般來說磁碟的寫入速度都是非常慢的,所以如果需要置換的頁面是被修改的頁面,那麼就回降低速度。
(3)訪問記憶體次數:這是和頁面置換演算法有關的,即可能會有乙個剛被置換出的頁面又被再次調回記憶體中。
所以基於以上的情況,作業系統提出了頁面緩衝演算法(pba):即在記憶體中建立鍊錶,一般為兩個(空閒頁面鍊錶和修改頁面鍊錶)。
空閒頁面鍊錶:在這個鍊錶中儲存著一系列的空閒物理塊,當乙個程序有頻繁的缺頁中斷時就給頁面在分配物理塊,以此來降低缺頁率。
修改頁面鍊錶:對於已修改需要換出的頁面,先不將它換出,而是將它存放在該鍊錶上,等到該鍊錶的頁面足夠多時,在一次將這些頁面寫入磁碟上,降低對磁碟的i/o速度。
linux中的鎖有:互斥鎖、讀寫鎖、自旋鎖、rcu鎖。
1、互斥鎖
mutex,用於保證在任何時刻,都只能有乙個執行緒訪問物件。當獲取鎖的操作失敗時,執行緒回進入睡眠狀態,等待鎖釋放時被喚醒。
2、讀寫鎖
rwmutex,分為讀鎖和寫鎖。處於讀操作時,可能執行多個執行緒同時獲得讀操作。但是同一時間只能有乙個執行緒可以獲得寫鎖。其他獲取寫鎖失敗的執行緒都會進入睡眠狀態,直到寫鎖釋放時被喚醒。這裡需要注意寫鎖會阻塞讀寫鎖,即在乙個執行緒獲得寫鎖時,其他的執行緒將不能再獲得寫鎖和讀鎖,適用於讀取資料的頻率高於寫資料頻率的場合。
3、自旋鎖
spinlock,保證在任何時刻只有乙個執行緒可以訪問物件,但是當獲取鎖失敗後,該執行緒不會進入睡眠狀態,而是會在原地旋轉(不停的詢問,占用cpu),直到鎖被釋放。這樣就節省了執行緒從睡眠狀態被喚醒的期間的消耗,在加鎖時間短暫的環境下會極大的提高效率。但如果加鎖時間時間過長就會非常浪費cpu。
4、rcu鎖
read-copy-update,在修改資料時,首先需要修改資料,然後生成乙個副本,對副本進行修改。修改完成後,再將舊資料更新成新的資料。使用rcu時,讀者幾乎不需要同步開銷,既不需要獲得鎖,也不需要原子操作,不會導致鎖競爭,因此就不用考慮死鎖問題了。而對於寫者的同步開銷比較大,它需要複製被修改的資料,還必須使用鎖機制同步其他寫者的修改操作。在大量讀操作,少量寫操作的情況的情況效率非常高。
執行緒池是一種多種執行緒處理形式,處理過程中將任務提交到執行緒池,任務的執行交由執行緒池來管理。
如果每個請求都建立乙個執行緒來處理,那麼伺服器的資源很快就會被耗盡,使用執行緒池可以減少建立和銷毀執行緒額度次數,每個工作執行緒都可以被重複的利用,可執行多個任務。
建立執行緒和銷毀執行緒的花銷是比較大,這些時間可能比處理業務的時間還要長。這樣頻繁的建立執行緒和銷毀執行緒,在加上業務工作執行緒,消耗系統資源的時間,可能導致系統的資源不足。(利用執行緒池可以省去執行緒建立和銷毀的時間)
(1)重用存在的執行緒,減少物件的建立、消亡的開銷,提公升效能。
(2)可有效的控制最大併發執行緒數,提高系統資源的使用率,同時避免過多的資源競爭,避免堵塞。
執行緒池適用於:任務數量大,且任務時間的情況。
(1)執行緒池管理器(threadpool):用於建立並管理執行緒池,包括建立執行緒池,銷毀執行緒池,新增新任務。
(2)工作執行緒(poolworker):執行緒池中線程,在沒有任務時處於等待狀態,可以迴圈的執行任務。
(3)任務介面(task):每個任務必須實現介面,在供工作執行緒排程任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行轉態等。
(4)任務佇列(tackqueue):用於存放沒有處理的任務,提供一種緩衝機制。
主線程和工作執行緒之間通過共享的工作佇列來同步,工作執行緒睡眠在工作對列上。當有新任務到來時,主線程將新的任務新增到工作佇列中。浙江喚醒正在等待任務的工作執行緒,不過只有乙個工作執行緒會獲得新任務的「接管權」,它可以從工作佇列中取任務並執行,而其他工作執行緒則繼續睡眠在工作佇列上。由於主線程和工作執行緒之間有工作佇列,所有主線程和工作執行緒之間沒有耦合性,主線程往工作佇列中插入任務,睡眠的工作執行緒通過競爭來取得任務並執行它。
指在程式申請記憶體時,沒有足夠的記憶體供給申請者使用。即使用的記憶體數量大於了系統分配的記憶體數量。此時系統相當於沒法滿足你的需求,就會包記憶體溢位錯誤。
記憶體溢位的原因:
(1)記憶體中載入的資料過於龐大,超過了記憶體的限制。
(2)使用了沒有申請的記憶體,比例申請了10個長度的陣列,使用了第11個長度。
記憶體洩露時指由於疏忽或錯誤而造成了程式未能釋放掉不能使用的記憶體的情況。記憶體洩漏並非指記憶體物理上消失,而是指記憶體子啊分配後,由於一些原因導致記憶體,沒有被**,因為而造成了記憶體了浪費。
記憶體洩漏的分類:
1、堆記憶體洩漏(heap leak):堆記憶體是指程式執行中根據需要分配的通過malloc、realloc、new等從堆中分配的一塊記憶體,再是完成後必須通過對應的free或delete釋放掉空間。如果由於某些原因導致這部分記憶體沒有釋放,那麼此後這塊的記憶體將不會被使用,就會產生堆記憶體洩漏。
2、系統資源洩漏(resource leak):主要是指程式使用系統分配的資源(socket)等沒有使用相應的函式釋放掉,導致系統資源浪費,嚴重可導致系統效率降低,系統執行不穩定。
3、沒有將基類的析構函式定義為虛析構函式,當基類的指標指向子類的物件時,如果基類的析構函式不是虛函式,那麼子類的析構函式將將不會被呼叫,子類的資源沒有被正確的釋放,因此造成記憶體洩漏。
linux基礎複習
pwd 顯示當前工作路徑 ls l d h i a args 許可權 基本許可權 修改許可權 每一組轉換為乙個八進位制數值 特殊許可權 g s dir 2 o t dir 1 umask 檔案遮蔽字 硬鏈結個數 軟鏈結 符號鏈結 快捷方式 ln s src newsoft 系統不允許為目錄建立硬鏈結...
Linux基礎命令學習複習
1.使用者以及檔案許可權管理 2.list item 3.list item 4.5.理解linux硬鏈結和軟鏈結 who 命令其它常用引數 引數 說明 a 列印能列印的全部 d 列印死掉的程序 m 同am i,mom likes q 列印當前登入使用者數及使用者名稱 u 列印當前登入使用者登入資訊...
Linux複習 基礎知識
1.linux 基礎 目錄結構 檔案型別 檔案許可權 命令 1 etc boot bin home lib proc usr dev mnt 2 普通檔案 d目錄檔案 p管道檔案 l鏈結檔案 c,b裝置檔案 s套接字檔案 3 許可權 chmod r 4 w 2 x 1 文字設定法 數字設定法 u 屬...