首先先討論內存的相關知識,當我在以上博文提到內存洩漏和頻繁的使用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個線程修改。在更深理解了信號量和互斥的區別後,我就把信號量用在性能測試的一個概念‘集合點’上。因為我需要讓很多分布式的客戶端同一時間起跑去壓一個資源,所以我需要服務器每個管理分布式客戶端的線程都要做到盡量小誤差的下發沖包命令,這樣我就能很准確的知道在每個集合點的並發數對服務器的壓力情況是多少了。