1
0
mirror of https://github.com/fumiama/fumidb.git synced 2026-06-09 12:40:39 +08:00

优化内存分配

This commit is contained in:
源文雨
2022-05-02 12:36:56 +08:00
parent 0196070fe0
commit e24f761f34
9 changed files with 129 additions and 105 deletions

View File

@@ -7,20 +7,23 @@
#define PAGESZ 4096
#endif
// 获取文件中的第一个空闲页,并将其读到内存
// 获取文件中的第一个空闲页,并将其读到 buf
// buf 的大小为 PAGESZ+8 = 4104
// 如果现有空闲均无整页,则新分配一页
// 返回指针的 -8 字节记录了本页在文件的偏移
// 因此实际上分配了 PAGESZ+8 的空间
// 返回指针 page = buf+8
// 其 -8 字节记录了本页在文件的偏移
// 以备释放之用
// 返回:
// NULL 错误,参见 errno
// page 指针
void* alloc_page(int fd);
void* alloc_page(int fd, void* buf);
// 获取 ptr 处的页
// buf 的大小为 PAGESZ+8 = 4104
// 返回:
// NULL 错误,参见 errno
// page 指针
void* get_page(int fd, uint64_t ptr);
void* get_page(int fd, uint64_t ptr, void* buf);
// 刷新一页
// 返回:
@@ -28,12 +31,6 @@ void* get_page(int fd, uint64_t ptr);
// 0/1 write size != PAGESZ
int sync_page(int fd, void* page);
// 刷新并释放 page
// 返回:
// EOF lseek 错误,参见 errno
// 0/1 write size != PAGESZ
int unmount_page(int fd, void* page);
// 释放分配的页,将其标记为空闲以备使用
// 同时将数据刷新到文件
// 返回:
@@ -42,32 +39,29 @@ int unmount_page(int fd, void* page);
int free_page(int fd, void* page);
// 获取文件中的第一个满足 size 大小的块的位置
// 返回的块大小一定是 size实际上为 size + 8 + 2
// 返回的块 blk = buf + 10
// len(buf) >= size + 8 + 2
// 开头的 8+2 字节记录了真正的块位置与大小以备释放
// 返回的 ptr 已经跳过这 10 个字节
// 返回:
// NULL 错误,参见 errno
// blk 指针
void* alloc_block(int fd, uint16_t size);
void* alloc_block(int fd, uint16_t size, void* buf);
// 获取 ptr 处的块
// 返回的块 blk = buf + 10
// len(buf) >= size + 8 + 2
// 返回:
// NULL 错误,参见 errno
// blk 指针
void* get_block(int fd, uint16_t size, uint64_t ptr);
void* get_block(int fd, uint16_t size, uint64_t ptr, void* buf);
// 刷新 block 到文件
// 返回:
// EOF lseek 错误或 size 过大,参见 errno
// 0/1 write size != PAGESZ
// 0/1 write size != real size
int sync_block(int fd, void* blk);
// 刷新 block 到文件并释放
// 返回:
// EOF lseek 错误或 size 过大,参见 errno
// 0/1 write size != PAGESZ
int unmount_block(int fd, void* blk);
// 释放块,并将其标记为空闲以备使用
// 如果该块前后也有空闲且不跨过4096
// 将会被合并
@@ -76,4 +70,10 @@ int unmount_block(int fd, void* blk);
// 0 成功
int free_block(int fd, void* blk);
// 将 ptr 处的块纳入空闲块链表
// 返回:
// EOF lseek 错误或 size 过大,参见 errno
// 0/1 write size != real size
int add_block(int fd, uint16_t size, uint64_t ptr);
#endif

View File

@@ -23,11 +23,11 @@ typedef uint64_t key_t;
// 为类型 type 创建索引
// 返回:索引头节点的指针 index
void* create_index(int fd, type_t t);
void* create_index(int fd, type_t t, void* buf);
// 加载类型 type 的索引
// 返回:索引头节点的指针 index
void* load_index(int fd, type_t t, uint64_t ptr);
void* load_index(int fd, type_t t, uint64_t ptr, void* buf);
// 插入一条索引
int insert_item(int fd, type_t t, void* index, key_t k, uint64_t ptr);

View File

@@ -1,13 +1,16 @@
#ifndef _TYPE_INT8_H_
#define _TYPE_INT8_H_
#include <stdint.h>
#include "../types.h"
#define INT8_INDEX_SZ (256*8)
void* create_int8_index(int fd);
// len(buf) >= INT8_INDEX_SZ+10
void* create_int8_index(int fd, void* buf);
void* load_int8_index(int fd, uint64_t ptr);
// len(buf) >= INT8_INDEX_SZ+10
void* load_int8_index(int fd, uint64_t ptr, void* buf);
int insert_int8_item(int fd, void* index, key_t k, uint64_t ptr);