C 記憶體和程序,執行緒學習補充(記憶體洩漏,訊號量)

2022-09-24 01:33:09 字數 1645 閱讀 4999

首先先討論記憶體的相關知識,當我在以上博文提到記憶體洩漏和頻繁的使用new和delete的時候,在同事間討論了下,實際運用中能夠很好的規避方法。

我首先我研究了同事使用的lookaside list(旁視列表):

旁視列表是一組事先分配的相同尺寸的記憶體塊。當有記憶體分配請求的時候,系統會遍歷這個列表尋找最近的未分配的塊。如果未分配的塊找到了,分配請求就很快被滿足。否則系統必須從分頁或不分頁記憶體池去分配。根據列表中分配行為發生的頻率,系統會自動調整未分配塊的數量來滿足分配請求,分配的頻率越高,會有越多的塊被儲存在旁視列表中。當開始從旁視列表分配記憶體的時候,將獲得這些預分配記憶體塊的指標。 儲存記憶體位置的方法,首先我們每次

可以將旁視列表想象成乙個記憶體容器,在初始時,向windows申請了一塊比較大的記憶體,以後每次申請記憶體時,不是向windows申請記憶體,而是向lookaside物件申請記憶體.lookaside會智慧型的避免產生記憶體漏洞,當其內部有大量未使用的記憶體時,會自動釋放記憶體給windows

一般在如下兩種情況下使用:1、每次申請固定大小的記憶體;2、申請和**操作十分頻繁

而我是這麼理解,new的時候,把new的位址存進宣告為未使用的列表中,當我們用到記憶體的時候,首先去此列表裡面找到沒有用到的記憶體位址,假如有空閒的位址,就把其調來使用,同時把它從未使用的列表中刪除,把他加入進宣告為已使用的列表。如果未使用煉表裡為空,就再new一部分記憶體出來。這樣就是乙個鍊錶是使用中的,另乙個鍊錶是未使用的 。同時我們需要注意的就是跟蹤這個記憶體的走向,在那個地方delete。這樣管理的時候需要注意當你用了列表的元素後,不改它的標識位或者不把他移動到別的列表時,就會出現野指標了。

針對記憶體洩漏,大多的情況就是就是new的沒有delete,還有容易洩露的地方是new的乙個陣列,但是用delete去刪除。  

然後是關於我寫第乙個博文時候,說到的訊號量的部分,因為工作中訊號量用的實在很少,一般用互斥就能夠完成大部分的工作。

互斥量用於執行緒的互斥,訊號量用於執行緒的同步。

這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。

互斥:是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。 www.2cto.com

互斥量值只能為0/1,訊號量值可以為非負整數。

也就是說,乙個互斥量只能用於乙個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。訊號量可以實現多個同類資源的多執行緒互斥和同步。當訊號量為單值訊號量是,也可以完成乙個資源的互斥訪問。

互斥量的加鎖和解鎖必須由同一執行緒分別對應使用,訊號量可以由乙個執行緒釋放,另乙個執行緒得到。

不知道別的業務,在寫效能測試指令碼的時候由於很多時候會產生做同樣事情的上百個執行緒,然後幾個管理性質的執行緒的情況,這時候基本上除了管理執行緒,每個執行緒都是獨立的,只有出現寫檔案,修改同一變數和訪問資料庫的時候會出現同時訪問資源的現象,使用互斥的鎖就能夠讓資源不會同時被2個執行緒修改。在更深理解了訊號量和互斥的區別後,我就把訊號量用在效能測試的乙個概念『集合點』上。因為我需要讓很多分布式的客戶端同一時間起跑去壓乙個資源,所以我需要伺服器每個管理分布式客戶端的執行緒都要做到盡量小誤差的下發沖包命令,這樣我就能很準確的知道在每個集合點的併發數對伺服器的壓力情況是多少了。

C 反射呼叫WebService引起記憶體洩漏

最近寫了乙個小工具,用來定時檢測公司各台伺服器上的webservice是否工作正常.如果無法訪問則報警.開發思路也很簡單,設定乙個timer,定時啟動多個執行緒 每個執行緒負責n臺伺服器訪問任務 去動態訪問各伺服器上的webservice的指定方法.然後對異常資訊進行報警.動態訪問webservic...

程序 執行緒及共享記憶體學習筆記

理論基礎 wait system exec函式族 exit 多執行緒相關 pthread create 如果呼叫該函式成功建立了乙個執行緒,那麼該執行緒的id會儲存在thread引數中。這個標誌會在其他的函式中用到。pthread join pthread detach pthread self p...

C語言記憶體知識補充

對於乙個c語言 程式而言,記憶體空間主要由五個部分組成 段 text 資料段 data bss段 bss 堆和棧組成,其中 段,資料段和bss段是編譯的時候由編譯器分配的,而堆和棧是程式執行的時候由系統分配的。bss中包括我篇部落格中的唯讀資料段 ro data 和已初始化讀寫資料段 rw data...