亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 實(shí)現(xiàn)了一個(gè)大小內(nèi)存管理程序 [打印本頁(yè)]

作者: baiyang0817    時(shí)間: 2011-08-25 21:06
標(biāo)題: 實(shí)現(xiàn)了一個(gè)大小內(nèi)存管理程序
最近閑來(lái)無(wú)事,做了一個(gè)內(nèi)存管理的程序,實(shí)現(xiàn)大小內(nèi)存的申請(qǐng)和批量釋放, 主要是為了解決小內(nèi)存申請(qǐng)時(shí)的產(chǎn)生內(nèi)存碎片的問(wèn)題。
    大體做法如下:申請(qǐng)一個(gè)內(nèi)存池,然后在該內(nèi)存池申請(qǐng)大內(nèi)存和小內(nèi)存;小內(nèi)存直接在內(nèi)存池的存儲(chǔ)區(qū)域存放;大內(nèi)存則要先自動(dòng)產(chǎn)生一個(gè)內(nèi)存頭,然后在其它地方分配內(nèi)存,內(nèi)存頭也存放在內(nèi)存池的存儲(chǔ)區(qū)域內(nèi)。
   
    參照以下資料做的:http://www.tbdata.org/archives/1390
作者: ydfgic    時(shí)間: 2011-08-26 11:24
不知道lz實(shí)現(xiàn)的內(nèi)存池的小對(duì)象的內(nèi)存大小界界限是多少?128字節(jié)嗎?

我讀過(guò)sgi stl 的內(nèi)存池,覺(jué)得非常短小精悍,lz可以看看參考一下。
作者: zylthinking    時(shí)間: 2011-08-26 12:02
不知道lz實(shí)現(xiàn)的內(nèi)存池的小對(duì)象的內(nèi)存大小界界限是多少?128字節(jié)嗎?

我讀過(guò)sgi stl 的內(nèi)存池,覺(jué)得非常短 ...
ydfgic 發(fā)表于 2011-08-26 11:24


現(xiàn)在覺(jué)得此類(lèi)普適性的內(nèi)存池簡(jiǎn)直一點(diǎn)用也沒(méi)有, sdi stl 的內(nèi)存池算法估計(jì)malloc/new 自己的實(shí)現(xiàn)就干了, 根本用不著再做一次。
覺(jué)得只有 slab 適用時(shí), 做自己的緩存才有點(diǎn)意義
作者: ydfgic    時(shí)間: 2011-08-26 13:09
現(xiàn)在覺(jué)得此類(lèi)普適性的內(nèi)存池簡(jiǎn)直一點(diǎn)用也沒(méi)有, sdi stl 的內(nèi)存池算法估計(jì)malloc/new 自己的實(shí)現(xiàn)就干了 ...
zylthinking 發(fā)表于 2011-08-26 12:02



    此言差矣,sgi stl對(duì)小于128字節(jié)的小內(nèi)存是有很高效的內(nèi)存池算法的。
malloc 的效率低是公認(rèn)了的,特別是多線(xiàn)程環(huán)境,要不哪用出那么多內(nèi)存池的。
我常用的內(nèi)存池是 sgi stl,boost::pool, TCMalloc,各有千秋。
對(duì)象內(nèi)存池上面三個(gè)也都有實(shí)現(xiàn)。
作者: 雨過(guò)白鷺洲    時(shí)間: 2011-08-26 13:12
我是一直沒(méi)覺(jué)得內(nèi)存分配效率不夠高的

估計(jì)咱做的都是小項(xiàng)目吧。。。
作者: blackuhlan    時(shí)間: 2011-08-26 13:54
順序存取速度永遠(yuǎn)是最快的。不知道樓主想解決什么問(wèn)題,不同的問(wèn)題有不同的解決辦法。例如,是想讀得快,還是想寫(xiě)得快,還是想純粹不產(chǎn)生內(nèi)存碎片?
作者: zylthinking    時(shí)間: 2011-08-26 15:03
此言差矣,sgi stl對(duì)小于128字節(jié)的小內(nèi)存是有很高效的內(nèi)存池算法的。
malloc 的效率低是公認(rèn)了的 ...
ydfgic 發(fā)表于 2011-08-26 13:09


malloc 的效率是誰(shuí)公認(rèn)低了?
sgi stl 內(nèi)存池自然有其優(yōu)點(diǎn), 但毛病也不小
1。 無(wú)法處理大塊內(nèi)存申請(qǐng)吧, 如果處理大塊內(nèi)存申請(qǐng), 要么內(nèi)存塊的跨度必須大, 就是浪費(fèi)內(nèi)存;  要么要求鏈表數(shù)量足夠多, 如果鏈表數(shù)量足夠多, 循環(huán)又要多了(分配2, 結(jié)果該鏈表沒(méi)有, 去4的里面找, 也沒(méi)有, 去6的鏈表找, 再?zèng)]有。。。。)
2。 無(wú)法內(nèi)存回收吧, 除非它再加上buddy 系統(tǒng), 可是至少sgi stl 沒(méi)有; 它就是一個(gè)動(dòng)態(tài)平衡算法, 適應(yīng)的峰值不高的應(yīng)用, 如果一瞬間要求2G的內(nèi)存, 然后剩下的1個(gè)月, 只要求1M的內(nèi)存, 它的表現(xiàn)不咋地

* Why use this malloc?
0042

0043
  This is not the fastest, most space-conserving, most portable, or
0044
  most tunable malloc ever written. However it is among the fastest
0045
  while also being among the most space-conserving, portable and tunable.
0046
  Consistent balance across these factors results in a good general-purpose
0047
  allocator for malloc-intensive programs.

0048

0049
  The main properties of the algorithms are:
0050
  * For large (>= 512 bytes) requests, it is a pure best-fit allocator,
0051
    with ties normally decided via FIFO (i.e. least recently used).
0052
  * For small (<= 64 bytes by default) requests, it is a caching
0053
    allocator, that maintains pools of quickly recycled chunks. 這個(gè)是不是sgi stl 的基本手法???

0054
  * In between, and for combinations of large and small requests, it does
0055
    the best it can trying to meet both goals at once.
0056
  * For very large requests (>= 128KB by default), it relies on system
0057
    memory mapping facilities, if supported.
0058
作者: ydfgic    時(shí)間: 2011-08-26 20:01
回復(fù) 7# zylthinking


    你說(shuō)得兩點(diǎn)只說(shuō)對(duì)了一半。
sgi stl 的分配是按照 8字節(jié)為單位,圓整到8的倍數(shù),當(dāng)申請(qǐng)字節(jié)數(shù)小于128時(shí),有這16個(gè)鏈表。
申請(qǐng)2,4,6,8都是在8字節(jié)的鏈表里找節(jié)點(diǎn)的。如果8字節(jié)的不夠,向16字節(jié)的鏈表要內(nèi)存,分割成兩個(gè)8字節(jié)。如果16也沒(méi)有再向24字節(jié)要,以此類(lèi)推到128字節(jié)。如果超過(guò)了128字節(jié)字節(jié)調(diào)用malloc 返回。
同理釋放也是大于128字節(jié)的直接free了。
那么會(huì)存在申請(qǐng)的內(nèi)存是不會(huì)釋放的,但是對(duì)大于128字節(jié)的是會(huì)free掉的。

malloc的問(wèn)題是分配還是比較快,但是它的回收算法包含了合并內(nèi)存塊,是比較慢的,所以才有那么多自己實(shí)現(xiàn)的內(nèi)存池。
另外多線(xiàn)程環(huán)境是很慢(因?yàn)闊o(wú)緩存,一個(gè)大鎖進(jìn)行保護(hù))。可以看TCMALLOC的測(cè)試結(jié)果。
作者: zylthinking    時(shí)間: 2011-08-27 00:12
回復(fù)  zylthinking


    你說(shuō)得兩點(diǎn)只說(shuō)對(duì)了一半。
sgi stl 的分配是按照 8字節(jié)為單位,圓整到8的倍數(shù) ...
ydfgic 發(fā)表于 2011-08-26 20:01


我走個(gè)大概意思, 你倒是斤斤計(jì)較是2還是8了
作者: zylthinking    時(shí)間: 2011-08-27 00:19
本帖最后由 zylthinking 于 2011-08-27 00:34 編輯
回復(fù)  zylthinking
malloc的問(wèn)題是分配還是比較快,但是它的回收算法包含了合并內(nèi)存塊,是比較慢的,所以才有那么多自己實(shí)現(xiàn)的內(nèi)存池。
另外多線(xiàn)程環(huán)境是很慢(因?yàn)闊o(wú)緩存,一個(gè)大鎖進(jìn)行保護(hù))。可以看TCMALLOC的測(cè)試結(jié)果。
ydfgic 發(fā)表于 2011-08-26 20:01


best fit 會(huì)合并內(nèi)存塊嗎? 有些拿不準(zhǔn)了。。。。。。如果那樣, 還best fit 什么啊, 直接挖chunk就行了
多線(xiàn)程問(wèn)題不是很清楚, 但很顯然, 無(wú)緩存和有鎖沒(méi)直接關(guān)系, sgi stl就沒(méi)有鎖了?
還有, 沒(méi)有緩存, 那合并內(nèi)存塊從何說(shuō)起?
作者: 雞絲拌面    時(shí)間: 2011-08-27 16:16
回復(fù)  zylthinking


    你說(shuō)得兩點(diǎn)只說(shuō)對(duì)了一半。
sgi stl 的分配是按照 8字節(jié)為單位,圓整到8的倍數(shù) ...
ydfgic 發(fā)表于 2011-08-26 20:01



    我記得malloc分出來(lái)的chunk帶一個(gè)8B的header,其他也是+8B移下一個(gè)slot,而且小快是插入其他鏈表的,還有必要另外搞個(gè)小于128B的特殊版本嗎?
作者: 雞絲拌面    時(shí)間: 2011-08-27 16:18
best fit 會(huì)合并內(nèi)存塊嗎? 有些拿不準(zhǔn)了。。。。。。如果那樣, 還best fit 什么啊, 直接挖chunk就行 ...
zylthinking 發(fā)表于 2011-08-27 00:19



    釋放chunk是會(huì)和前后合并成大塊的。
作者: ydfgic    時(shí)間: 2011-08-27 18:17
best fit 會(huì)合并內(nèi)存塊嗎? 有些拿不準(zhǔn)了。。。。。。如果那樣, 還best fit 什么啊, 直接挖chunk就行 ...
zylthinking 發(fā)表于 2011-08-27 00:19


2,4,6我以為你不清楚嘛,我后來(lái)也解釋清楚了sgi 是那樣做的。我知道的情況是malloc回收時(shí)候是會(huì)合并塊的,好像很多說(shuō)這個(gè)地方效率蠻低的。
sgi的allocator 可以提供有鎖版和無(wú)鎖版,在模板參數(shù)里實(shí)現(xiàn)。
當(dāng)然多線(xiàn)程的分配器 還是tcmalloc效率最高,還有個(gè)jemalloc效率好像也很高。tcmalloc 如其名字 thread cache malloc,對(duì)每個(gè)內(nèi)部線(xiàn)程都維護(hù)一個(gè)cache,達(dá)到了分配內(nèi)存時(shí)不產(chǎn)生鎖競(jìng)爭(zhēng)。
一般情況下我們當(dāng)然用malloc足夠了,但在追求效率的情景下使用合適的內(nèi)存池,我覺(jué)得還是很好的優(yōu)化




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2