多個作業系統平台都提供了記憶體對映檔案,這是乙個簡單的將資料結構儲存到檔案中的機制。同時由於32位作業系統的程序虛擬記憶體最大只能4gb,用記憶體對映檔案的方式就可以突破這個限制,可以用來開啟超過4gb的大檔案。
而且,記憶體對映檔案其實就是一種共享記憶體機制,程序間可以通過共享記憶體直接訪問資料。
ace提供了ace_mmap_memory_pool類,該類代表了為記憶體對映檔案分配記憶體的記憶體池。和ace_malloc模板類配合,我們就可以以平台無關的方式操縱記憶體對映檔案了。比如:ace_malloc。第二個引數是併發鎖的策略類。
下面的例子實現了write函式,該函式負責將結構shmrecord的資料寫到記憶體對映檔案snapshot中,並且以hashmap的方式儲存。key是offset的字串表示,value是結構的指標。
注意,結構中的pdata_成員指向的記憶體也應該由ace_malloc在記憶體對映檔案中分配。這種模式下,千萬用常規思路管理記憶體**,比如智慧型指標,有時候記憶體不需要**。
#include
#include
using namespace std;
#include "ace/mmap_memory_pool.h"
#include "ace/malloc_t.h"
class shmrecord
ace_uint16 type_;
ace_uint32 offset_;
void* pdata_;
ace_uint32 datalength_;
size_t size() const
};typedef
ace_mallocmallocator;
void write()
shmrecord* precord=new(pmemory) shmrecord();
precord->type_=9;
precord->offset_=2;
precord->datalength_=4;
precord->pdata_=allocator.malloc(4);
ace_os::strcpy(static_cast(precord->pdata_),"hel");
stringstream stream;
streamif(allocator.bind(stream.str().c_str(),precord)==-1)
allocator.sync();
}void read()
int main(void)
ace_malloc模板類的malloc成員負責分配記憶體,free負責釋放記憶體,bind負責將資料新增到hashmap中,sync負責將資料從記憶體寫到檔案中。建構函式接收檔名作為引數。
現在我們來完成read函式,該函式將負責從記憶體對映檔案中讀取資料,並且顯示出來。
void read()
}這裡使用了乙個後進先出的迭代器,可以遍歷hashmap中的資料。當然也可以使用find方法查詢指定的資料。
多個程序因而可以使用同一塊共享記憶體,但是問題是這些內存在每個程序中的基位址可能不同。雖然大多數作業系統能夠保證,但是萬一遇到意外情況怎麼辦?在這種情況下直接儲存的指標將毫無意義。
ace提供了解決方案:
1)使用ace_malloc_tace_null_mutex,ace_pi_control_block>代替前面的分配器。關鍵在於ace_pi_control_block類,該類使我們獲得了於位置無關的分配記憶體功能。
2)在我們的結構中使用了普通的c++指標,現在要替換成ace_based_pointer_basic型別。 該類會針對不同的基位址重新計算指標。
3)迭代器也應該使用父類:
ace_malloc_lifo_iterator_titer(allocator);
ACE記憶體對映技術
多個作業系統平台都提供了記憶體對映檔案,這是乙個簡單的將資料結構儲存到檔案中的機制。同時由於32位作業系統的程序虛擬記憶體最大只能4gb,用記憶體對映檔案的方式就可以突破這個限制,可以用來開啟超過4gb的大檔案。而且,記憶體對映檔案其實就是一種共享記憶體機制,程序間可以通過共享記憶體直接訪問資料。a...
ACE的記憶體管理
ace構架含有一組非常豐富的記憶體管理類。這些類使得你能夠很容易和有效地管理動態記憶體 從堆中申請的記憶體 和共享記憶體 在程序間共享的記憶體 你可以使用若干不同的方案來管理記憶體。你需要決定何種方案最適合你正在開發的應用,然後採用恰當的 ace類來實現此方案。ace含有兩組不同的類用於記憶體管理。...
ACE的記憶體管理
ace構架含有一組非常豐富的記憶體管理類。這些類使得你能夠很容易和有效地管理動態記憶體 從堆中申請的記憶體 和共享記憶體 在程序間共享的記憶體 你可以使用若干不同的方案來管理記憶體。你需要決定何種方案最適合你正在開發的應用,然後採用恰當的 ace類來實現此方案。ace含有兩組不同的類用於記憶體管理。...