首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以在页面级别使用内存吗?

可以在页面级别使用内存吗?
EN

Stack Overflow用户
提问于 2021-07-02 20:11:15
回答 2查看 160关注 0票数 2

我是一个Go开发人员,正在读一本叫做数据库内部的书。作者广泛地谈到了如何在非常低的级别(特别是在页面级别)使用内存。

当我试图构建自己的数据库时,我查阅了Go文档和其他文章,讨论了在这个级别上使用内存的问题,但是似乎没有什么东西涉及到在特定内存页中处理数据。

我的问题是:

能去做吗?

如果Go不能这样做,这是C或C++可以做的事情吗?

如果Go、C或C++都不能做到这一点,也许我不理解作者在页面级别处理内存的含义,我应该怎么想呢?

如有需要,请告知我任何需要在问题中加入的更多细节。

摘录自一书

上下文是指在页面中实现B树和分组节点。这可在第2章题为“磁盘结构”的章节中找到。

分页的二叉树通过将节点分组为页面来布局二叉树,如图2-6所示,它改善了局部性的情况。要找到下一个节点,只需在已经获取的页面中跟踪一个指针即可。但是,节点和它们之间的指针仍然会产生一些开销。将结构放置在磁盘上及其进一步的维护是非常重要的工作,特别是如果键和值没有预先预置并按随机顺序添加。平衡需要页面重组,这反过来又会导致指针更新。

它还提供了以下图像:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-03 15:34:59

这本书是关于“磁盘上的结构”。这个上下文中的页面仅仅意味着一个数据块。磁盘访问可以在扇区或集群中工作,因此数据应该针对位置进行优化,以便尽可能地适应这些块。数据库文件设计面临的挑战是如何将数据的时间局部性转化为空间局部性。

但这一概念也适用于RAM。在用户空间虚拟内存中的页面级工作仅仅意味着了解底层内存体系结构,并对其进行优化。

在x86上,用户空间虚拟内存被组织在4KB*的页面中。

这意味着,在处理大量数据时,可以使用内存区域,这些内存区域是4KB的倍数,与4KB对齐。

在C语言中,有很多方法可以实现这一点,例如aligned_alloc

但是要更进一步,它已经对齐了大数组,至少在页面大小上是这样的(在Mac、BSD、Linux和Windows上)。

代码语言:javascript
运行
复制
func main() {
    buf := make([]byte, 1024*1024)
    fmt.Printf("%p\n", unsafe.Pointer(&buf[0]))
}

将打印以下内容:

代码语言:javascript
运行
复制
0xc000180000

如果遇到没有实现的实现,则可以使用对齐公式“手动”对齐byte片,方法是分配页面大小--额外的一个字节,然后在开始时跳过不以PageSize的倍数开始的字节:

偏移=(对齐-基)和(对齐- 1)

代码语言:javascript
运行
复制
func main() {
    buf := make([]byte, 1024*1024 + 4096 - 1)
    base := unsafe.Pointer(&buf[0])
    offset := (4096 - uintptr(base)) & (4096 - 1)
    aligned := buf[offset:]
    fmt.Printf("base   : %p\n", unsafe.Pointer(&buf[0]))
    fmt.Printf("aligned: %p\n", unsafe.Pointer(&aligned[0]))
}

(无法想象上面的平台会打印不同的值)

*有些平台对2MB和1GB页面有较大的页面支持。在可用时,Go会自动使用这些。

票数 3
EN

Stack Overflow用户

发布于 2021-07-02 21:47:04

我可能遗漏了一些东西,但是使用物理内存(与虚拟内存相反)不是语言特性,而是操作系统的特性。

所以你的问题的答案是:是的,去也能做到这一点。

每个操作系统都提供了处理实际地址空间的方法,这些服务需要提升权限,并以驱动/内核模块的形式出现,并使用这种访问进行内存映射IO或物理内存预分配块的工作(在MMI将其用作分页内存之前)。

我想在系统负载(通过驱动程序)上预先分配内存块,并且使用它是您想要做的。

如果你打算访问“物理内存”上的“虚拟内存”,我会劝阻你,说它是一种极其微妙和脆弱的机制,除非你找到这样做的巨大优势,否则我看不出有任何理由走这条路。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68230802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档