c++ - 请问一台电脑 'know'是怎样分配的内存?

标签 c++ memory

计算机在分配内存时,如何知道哪些字节已经被占用,不能被覆盖?

因此,如果这些是一些未使用的内存字节:

[0|0|0|0]

计算机如何知道它们是否存在?它们可能只是一个等于零的整数。或者它可能是空的内存。它怎么知道的?

最佳答案

这取决于执行分配的方式,但它通常涉及对属于分配机制的数据的操作。

当您在函数中分配一些变量时,分配是通过递减堆栈指针来执行的。通过堆栈指针,您的程序知道堆栈指针以下的任何内容都不会分配给堆栈,而堆栈指针以上的任何内容都已分配。

当你通过 malloc() 等在堆上分配一些东西时,事情是相似的,但更复杂:所有这些分配器都有一些内部数据结构,它们永远不会暴露给调用应用程序,但是这允许他们选择在分配请求中返回哪些内存地址。例如,某些 malloc() 实现为固定大小的小对象使用多个内存池,并为它们跟踪的每个固定大小维护空闲对象的链表。这样一来,他们可以快速弹出该列表的一个内存区域,只有在用完区域以满足特定请求大小时才进行更昂贵的计算。


无论如何,每个分配器都必须不时地向系统内核申请内存。此机制始终适用于完整的内存页(通常为 4 kiB),并通过系统调用 brk()mmap() 起作用。同样,内核会跟踪哪些页面在哪些进程中可见,以及它们映射到哪些地址,因此内核内部为此分配了额外的内存。

这些映射通过页表提供给处理器,页表使用它们将虚拟内存地址解析为物理地址。所以在这里,最后,你在这个过程中涉及了一些硬件,但这在机制的核心中确实非常非常低,远低于用户空间进程能够看到的任何东西。尽管如此,即使页表是由内核的软件管理的,而不是由硬件管理的,硬件只解释软件写入页表的内容。

关于c++ - 请问一台电脑 'know'是怎样分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594268/

相关文章:

c++ - 删除带有数据指针的节点?

C++ std::forward<T> 与 static_cast<T>

用于检查内存完整性的 Linux 内核模块

c++ - 阻止访问 Windows 上的物理地址

c++ - 引用函数指针

c++ - 功能不保存到结构

c++ - 如何避免在 C++11 服务器程序中为多个客户端使用多线程

c - 适当的内存分配

二维字符串数组的 C 内存布局

c++ - 我可以为 C++11 std::tuple 预分配一 block 内存吗?