應用層記憶體管理及除錯的學習 (3)

2021-09-27 21:17:05 字數 1909 閱讀 5938

既然我們想做比較靠譜的效能測試,首先要知道如何準確測量一段**的執行時間

#include #include #include "celapsedmicroseconds.h"

static bool g_binitfrequncy = queryperformancefrequency(&celapsedmicroseconds::m_frequency);

celapsedmicroseconds::celapsedmicroseconds()

large_integer celapsedmicroseconds::getelapsedmicroseconds()

; large_integer elapsedmicroseconds = {};

assert(queryperformancecounter(&endingtime));

elapsedmicroseconds.quadpart = endingtime.quadpart - m_startingtime.quadpart;

elapsedmicroseconds.quadpart *= 1000000;

elapsedmicroseconds.quadpart /= m_frequency.quadpart;

m_startingtime = endingtime; // 更新最後的執行時間

return elapsedmicroseconds;

}celapsedmicroseconds::~celapsedmicroseconds()

這個文章,嘗試梳理一下定製記憶體管理器的必要性以及測試記憶體allocator 的方法

當我們無腦的呼叫new 和 delete,或者malloc free 的時候,通過之前的**看到,顯然使用的是系統預設堆.

而多執行緒環境下,如果全部程式都使用這種無腦的方法,乙個是需求種類複雜,大小導致,長時間執行必然導致記憶體碎片,記憶體申請和釋放都將消耗很長的時間

另一方面,多執行緒環境下,對於同乙個堆的同步訪問將導致大量的時間

長時間執行的系統,分配模式需要保持低碎片,否則時間越久,碎片將導致系統無法繼續執行。

系統呼叫,進核心、出核心,將消耗大量時間

heap blocks

全新塊的申請是new 從process heap 中申請的,free 的時候,放入了free-list,再次申請的時候悠閒從free-list 申請,沒有再去new(後進先出,提高重複利用率)

heap pool

通過 new 從process heap 申請乙個單獨的池,之後通過這個pool 申請記憶體

static pool

使用乙個靜態的記憶體池,通常是一塊比較大的靜態記憶體,來儲存所有的記憶體塊。該靜態記憶體池後續被用來申請記憶體。

heap pool 和 static pool 模式提供了固定申請執行時間。heap blocks可能有額外的查詢和new 操作。

union
通過上面的這種方式,實現了memory pool的概念,再加上一些鎖,優化的最佳的實現也就是鎖的實現。

優化的具體方法,放在下一屆,下面先想一下測試方法和用例,否則寫出來也不知道好壞介面設計的要求:

支援多執行緒環境測試

支援測試原生的malloc free,new delete 測試

支援記憶體碎片型別的申請釋放操作的測試

支援固定大小記憶體塊的頻繁申請釋放(可能特定場景就會是這種,看哪種實現效率高)

單程序測試單獨的小功能, 避免初始位址空間不同帶來的影響

測試程序都以最高優先順序執行,保證測試的可信度

申請和釋放分別計時

陣列型別的申請、釋放操作計時

多次執行取平均

對比boost 的實現

是否需要在非必要的時候,釋放空閒的整塊的大塊的記憶體

下乙個開始寫**了

ns3學習筆記 3 應用層

ns3中有兩類套接字介面 另一種是 根據資訊交流物件不同 應用測協議實際上就是制定分組手法規則和呼叫套接字api兩部分操作組成 架構概述 p95 一共分成兩類 無論哪個內建類,其助手類的使用大同小異 應用層helper的使用 分組產生和接收 p100 for one hand 分組接收器 for a...

應用層上的同步問題(3)

由於,現在的程式多執行在多執行緒的環境中,資料的處理的順序一下子就變得重要了起來,我們知道,在核心中,我們可以使用 事件,自選鎖,或者互斥體等方式來達到同步的處理,防止操作被搶占,他們的幾乎都是使用提高中斷級的方式來達到的,也就是 windows 是乙個基於 可搶占模式的系統,只要你的 或者中斷級足...

應用層的一些知識 3

案四 應用層相關 1 網域名稱系統dns 用來將ip對映到網域名稱,網域名稱分多級,以點分開,便於全球統一管理及分類查詢,當訪問乙個網域名稱時,首先要到配置的網域名稱伺服器上找到網域名稱對應的ip位址,然後通過ip位址再訪問.計算機名字 只是ip位址與名稱的影射,作用可模擬網域名稱,工作方式可模擬d...