小議記憶體池 資源池

2021-08-30 18:58:26 字數 1660 閱讀 4872

比較簡單的一篇文章。本來是有些地方沒想明白,想分析一下。結果寫著寫著就明白了,才發現如此簡單。留之 ~

簡單的定義

我對一些專業的名詞不怎麼熟悉,沒有很系統的學習過,所以先稍微解釋下我的一點概念上的認識:

看見過很多類似的詞,比如 快取記憶體分配、記憶體物件池、物件池、連線池等等。

我覺得乙個池已經帶有高速的意義了,所以很少加上高速的稱呼;

而記憶體物件池和物件池,物件的意義太廣,包括了資源和記憶體,更適用一種字尾符的修飾。而資源更傾向乙個抽象層的分配性,記憶體是一種本質上的空間申請。可以稱執行緒物件池,連線物件池,而直接稱物件池有點不明所指;

資源池是乙個抽象的概念,比如執行緒池,連線池,檔案io池等等。更傾向一種高層資源符號的占用。比如乙個檔案io,你用乙個指標儲存即可,不涉及到對記憶體的太敏感性。

也就是說,在我的認識裡,分配分兩種,一種是空間上的,一種是高層資源符號的占用,在對他們的稱呼上可能大家不是很贊同,但沒關係,只是在文章頭起到乙個定義作用,以免下文的混淆。

(注意:以下都是討論行為特點,不對效率上的寫法討論。效率的東西可以考慮我的上文「快取的力量」)

記憶體池的行為特點

比如以下乙個簡單的物件:

class cplay

private:

char name[24];

int age;

char buffer1[100];

};class ckmem

;t t;

void *p = ckmem.getmem();

cplay *pplay = new (p)cplay;

//...

pplap->~cplay();

ckmem.freemem(pplay);

假設這是乙個遊戲人物中的物件資料,在每回申請的時候,必須呼叫建構函式來進行初始化。因為它占有的資源符號就是記憶體,並沒有什麼可繼承性的東西。

資源池的行為特點

我們按照記憶體池的思維方式來一遍,檔案io的:

class cfile

~cfile()

int write(const char *pbuffer, int size);

file *p;

};t t;

void *p = ckmem.getmem();

cfile *pfile = new (p)cfile;

//...

pfile->~cfile();

ckmem.freemem(pfile);

好像沒什麼問題。等等,當你第二次再次getmem()的時候,發生了什麼? p又被重新建立了一次。於是file *p就一直往返於建立和刪除之間。

這符合池的原則嗎?池的原則就是重複的快速利用,減少申請的開銷。也就是說根本不考慮是怎麼釋放的。加上乙個釋放,不是多次一舉嗎?所以不能用物件池的思想來編寫資源池。資源池的特點是,對抽象資源符號的占有,瓶頸在申請的過程上。所以它本身(符號)對記憶體的要求幾乎沒有,比如乙個event,只是個int型在記錄。在儲存上,你想用物件池的方法來寫也行。就比如linux下的slub,是利用記憶體片頭4個位元組來記錄位址。如果你熟悉這種技巧,就可以申請乙個8位元組的大小來存放。這個slub也已經由我仿寫成windows下的版本

記憶體池 C 記憶體池

c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...

記憶體池,程序池,執行緒池

在使用new malloc在堆區申請一塊記憶體的時候,由於每次申請的記憶體大小不一樣就會產生很多記憶體碎片,不好管理和浪費。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠用再 繼續申請新的記憶...

記憶體池 執行緒池 程序池

由於伺服器的硬體資源 充裕 那麼提高伺服器效能的乙個很直接的方法就是以空間換時間,即 浪費 伺服器的硬體資源,以換取其執行效率。這就是池的概念。池是一組資源的集合,這組資源在伺服器啟動之初就完全被建立並初始化,這稱為靜態資源分配。當伺服器進入正式執行階段,即開始處理客戶請求的時候,如果它需要相關的資...