- 論壇徽章:
- 2
|
回復(fù) 13# xyfree
>> 問(wèn)題就是在于mmap 之類的東西,你不能假設(shè)整個(gè)地址空間都?xì)w你管理……
>> 所以只要存在其他可能影響內(nèi)存空間分布的東西,你就無(wú)法保證內(nèi)存塊的地址一定符合條件。
先說(shuō) VirtualAlloc。 媽逼VirtualAlloc又兩個(gè)粒度…… 這里只說(shuō)提交粒度。。。
不管用戶如何用 VirtualAlloc/CreateFileMapping或者其他更高層的分配接口。
但只要你是用 VirtualAlloc 獲得的內(nèi)存, 那肯定是在頁(yè)邊界上的, 大小肯定是頁(yè)的整數(shù)倍。
總共就2^32/2^12=2^20個(gè)頁(yè)(且按4G算,實(shí)際只有2-3G)。
用一個(gè)1M元素的指針數(shù)組管理就完了……
比如你從 VirtualAlloc 得到了 [x*2^12, x*2^12+4k), 就把管理這4k內(nèi)存的數(shù)據(jù)的地址放到那個(gè)數(shù)組的 x 項(xiàng)里……
如果是 [y*2^12, y*2^12+8k) 那就把管理這8k內(nèi)存的數(shù)據(jù)的地址放到 y, y+1 項(xiàng)目里……
查詢時(shí)直接右移12位得到index……
用戶不是通過(guò)你的接口分配的話, 對(duì)應(yīng)的元素就等它空著……
tcmalloc 一啟動(dòng)就占用4M地址空間就是這么來(lái)的……
而mmap, 它是個(gè)規(guī)范, 而且對(duì)起始地址的邊界說(shuō)得很含糊……
但說(shuō)到具體實(shí)現(xiàn), 比如linux+glibc經(jīng)過(guò)測(cè)試就是在頁(yè)邊界的, 也可以這么搞……
雖然很占內(nèi)存, 但這是最快(常數(shù)時(shí)間)的方法了…… |
|