改进Page和Element控制块结构和周边接口

This commit is contained in:
codeboss 2025-09-11 20:06:00 +08:00
parent e83cf9b7ce
commit 54b8dc4b48
2 changed files with 54 additions and 41 deletions

View File

@ -26,23 +26,22 @@ std::pair<uint64_t, uint32_t> MemoryPage::getRecords() const {
return std::make_pair(pcb.curr_access_usec, pcb.acc_count_per_cycle); return std::make_pair(pcb.curr_access_usec, pcb.acc_count_per_cycle);
} }
char* MemoryPage::getElementPtr(int index) { ElementControlBlock* MemoryPage::getElementPtr(int index) {
auto member_cnt = elementCount(); auto member_cnt = elementCount();
auto element_size = elementSize(); auto element_size = elementSize();
char* element_ptr = nullptr; ElementControlBlock* element_ptr = nullptr;
if (index >= 0 && index < member_cnt) { if (index >= 0 && index < member_cnt) {
element_ptr = data_buffer + index * element_size; element_ptr = (ElementControlBlock*)(data_buffer + index * element_size);
} }
else if (index < 0 && index >= -member_cnt) { else if (index < 0 && index >= -member_cnt) {
element_ptr = data_buffer + (member_cnt + index) * element_size; element_ptr = (ElementControlBlock*)(data_buffer + (member_cnt + index) * element_size);
} }
lock(); lock();
if (element_ptr) { if (element_ptr) {
auto data_ptr = (ElementControlBlock*)element_ptr; element_ptr->page_refer = this;
data_ptr->page_refer = this; element_ptr->element_index = index;
data_ptr->element_index = index;
} }
release(); release();
return element_ptr; return element_ptr;
@ -78,11 +77,14 @@ uint16_t MemoryPage::elementCount() const {
return cnt / this->elementSize(); return cnt / this->elementSize();
} }
// element =================================================================
const uint32_t MemoryElement::buffer_offset = MemoryElement::validOffset();
uint32_t MemoryElement::validOffset() uint32_t MemoryElement::validOffset()
{ {
uint32_t remains = sizeof(ElementControlBlock) % 8; uint32_t remains = sizeof(ElementControlBlock) % 16;
uint32_t times = sizeof(ElementControlBlock) / 8; uint32_t times = sizeof(ElementControlBlock) / 16;
return (remains ? times + 1 : times) * 8; return (remains ? times + 1 : times) * 16;
} }
uint32_t MemoryElement::rawSize(uint32_t data_type_size) uint32_t MemoryElement::rawSize(uint32_t data_type_size)
@ -93,12 +95,16 @@ uint32_t MemoryElement::rawSize(uint32_t data_type_size)
return (remains ? times + 1 : times) * 16; return (remains ? times + 1 : times) * 16;
} }
MemoryElement::MemoryElement(char* access_bind) MemoryElement::MemoryElement(ElementControlBlock* access_bind)
: data_ptr((ElementControlBlock*)access_bind) { : data_ptr((ElementControlBlock*)access_bind) {}
buffer_offset = validOffset();
uint32_t MemoryElement::typeSize() const
{
auto page_ptr = data_ptr->page_refer;
return ((PageControlBlock*)page_ptr)->byte_count_per_element - buffer_offset;
} }
void MemoryElement::accessRecUpdate(uint64_t time_usec) void MemoryElement::accessUpdate(uint64_t time_usec)
{ {
data_ptr->page_refer->accessRecord(time_usec); data_ptr->page_refer->accessRecord(time_usec);
} }
@ -118,10 +124,10 @@ void MemoryElement::setActive(uint8_t ste)
data_ptr->page_refer->release(); data_ptr->page_refer->release();
} }
char* MemoryElement::dataLock() unsigned char* MemoryElement::dataLock()
{ {
data_ptr->page_refer->lock(); data_ptr->page_refer->lock();
return ((char*)data_ptr) + buffer_offset; return ((unsigned char*)data_ptr) + buffer_offset;
} }
void MemoryElement::release() void MemoryElement::release()

View File

@ -8,31 +8,47 @@ class MemoryPage;
/// </summary> /// </summary>
struct PageControlBlock { struct PageControlBlock {
uint16_t active_entities_count = 0; // 活跃element数量决定是否需要卸载 uint16_t active_entities_count = 0; // 活跃element数量决定是否需要卸载
uint16_t byte_count_per_element = 32; // 单个element大小16的倍数 uint16_t byte_count_per_element = 32; // 单个element大小16的倍数
uint32_t total_buffer_size = 0; // 可用数据缓冲区大小 uint32_t total_buffer_size = 0; // 可用数据缓冲区大小
uint64_t typecode_of_element = 0; // 元素类型标识码 uint64_t typecode_of_element = 0; // 元素类型标识码
uint64_t curr_access_usec = 0; // 最近访问时间点lsbus uint64_t curr_access_usec = 0; // 最近访问时间点lsbus
uint32_t acc_count_per_cycle = 0; // 单周期内累积访问次数 uint32_t acc_count_per_cycle = 0; // 单周期内累积访问次数
uint32_t un_used = 0; uint32_t backup = 0;
std::mutex access_protected; // 内存数据访问保护锁 std::mutex access_protected; // 内存数据访问保护锁
}; };
/// <summary>
/// 元素访问控制块
/// </summary>
struct ElementControlBlock {
uint8_t active_mark = 0; // 活跃标志
uint8_t backup_1 = 0;
uint16_t element_index = 0; // 本元素在Page中的索引
MemoryPage* page_refer = nullptr; // 页面关联指针
void* extend_bind = nullptr; // 绑定控制块内存指针
};
/// <summary> /// <summary>
/// 内存页面16K大小 /// 内存页面16K大小
/// </summary> /// </summary>
class MemoryPage { class MemoryPage {
private: private:
PageControlBlock pcb; PageControlBlock pcb;
char data_buffer[16 * 1024 - (sizeof(PageControlBlock) / 8 + 1) * 8] = {}; unsigned char data_buffer[16 * 1024 - (sizeof(PageControlBlock) / 8 + 1) * 8] = {};
public: public:
/// <summary> /// <summary>
/// 构建内存页 /// 构建内存页
/// </summary> /// </summary>
/// <param name="raw_element_size_16B">原始element尺寸</param> /// <param name="raw_esize_16B">原始element尺寸</param>
explicit MemoryPage(uint16_t raw_element_size_16B, uint64_t typecode); explicit MemoryPage(uint16_t raw_esize_16B, uint64_t typecode);
/// <summary> /// <summary>
/// 记录单次访问时间 /// 记录单次访问时间
@ -65,7 +81,7 @@ public:
/// <param name="index">元素索引</param> /// <param name="index">元素索引</param>
/// <param name="active_set">是否设置</param> /// <param name="active_set">是否设置</param>
/// <returns>数据指针</returns> /// <returns>数据指针</returns>
char* getElementPtr(int index); ElementControlBlock* getElementPtr(int index);
/// <summary> /// <summary>
/// 元素类型码 /// 元素类型码
/// </summary> /// </summary>
@ -83,28 +99,13 @@ public:
uint16_t elementCount() const; uint16_t elementCount() const;
}; };
/// <summary>
/// 元素访问控制块
/// </summary>
struct ElementControlBlock {
uint8_t active_mark = 0; // 活跃标志
uint8_t backup_1 = 0;
uint16_t byte_count = 16; // 该元素字节长度16的倍数
uint16_t element_index = 0; // 本元素在Page中的索引
uint16_t backup_2 = 0;
MemoryPage* page_refer = nullptr; // 页面关联指针
void* extend_bind = nullptr; // 绑定控制块内存指针
};
/// <summary> /// <summary>
/// 内存元素访问接口 /// 内存元素访问接口
/// </summary> /// </summary>
class MemoryElement { class MemoryElement {
private: private:
ElementControlBlock* const data_ptr; ElementControlBlock* const data_ptr;
uint32_t buffer_offset = 0; static const uint32_t buffer_offset;
public: public:
static uint32_t validOffset(); static uint32_t validOffset();
@ -114,13 +115,19 @@ public:
/// 构建内存元素访问接口 /// 构建内存元素访问接口
/// </summary> /// </summary>
/// <param name="access_bind"></param> /// <param name="access_bind"></param>
MemoryElement(char* access_bind); MemoryElement(ElementControlBlock* access_bind);
/// <summary>
/// 提取关联元素尺寸
/// </summary>
/// <returns></returns>
uint32_t typeSize() const;
/// <summary> /// <summary>
/// 更新最终访问时间 /// 更新最终访问时间
/// </summary> /// </summary>
/// <param name="time_usec"></param> /// <param name="time_usec"></param>
void accessRecUpdate(uint64_t time_usec); void accessUpdate(uint64_t time_usec);
/// <summary> /// <summary>
/// 数据活跃状态 /// 数据活跃状态
@ -137,7 +144,7 @@ public:
/// 锁定数据,返回数据存储内存指针 /// 锁定数据,返回数据存储内存指针
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
char* dataLock(); unsigned char* dataLock();
/// <summary> /// <summary>
/// 解锁数据 /// 解锁数据
/// </summary> /// </summary>