ACE記憶體對映技術

2021-08-22 18:31:25 字數 1850 閱讀 3149

多個作業系統平台都提供了記憶體對映檔案,這是乙個簡單的將資料結構儲存到檔案中的機制。同時由於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含有兩組不同的類用於記憶體管理。...