gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:41 26 4
gpt4 key购买 nike

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

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

[0|0|0|0]

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

最佳答案

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

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

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


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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com