计算机如何知道'分配了什么内存?

时间:2014-03-23 17:21:13

标签: c++ memory

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

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

[0|0|0|0]

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

4 个答案:

答案 0 :(得分:5)

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

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

当您在堆上通过malloc()等分配内容时,情况类似,但更复杂:所有这些分配器都有一些内部数据结构,它们从不向调用应用程序公开,但允许它们选择哪个内存地址在分配请求上返回。例如,某些malloc()实现对固定大小的小对象使用多个内存池,并为它们跟踪的每个固定大小维护自由对象的链接列表。这样,他们可以快速弹出该列表的一个内存区域,只有在区域用完以满足特定请求大小时才进行更昂贵的计算。


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

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

答案 1 :(得分:0)

首先,我的印象是你相信有一些无人居住的记忆并没有任何价值。那是错的。你可以把内存想象成一个非常大的数组,当每个盒子包含一个值时,有人会把一些东西放进去。如果从未写入内存,则它包含随机值。

现在回答你的问题,它不是计算机(意思是硬件)而是操作系统。它在其内存中占有一些表,记录了使用内存的哪一部分。此外,任何字节的内存都可以被覆盖。

答案 2 :(得分:0)

通常,您无法通过查看某个位置的内存内容来判断是否使用了该部分内存。记忆价值' 0'并不意味着没有使用记忆。

要告诉你使用了哪些内存,你需要一些结构来告诉你。例如,您可以将内存分成块并跟踪使用哪些块以及哪些块不使用。

答案 3 :(得分:0)

有内存块,它们有占用或未占用。在堆上,有非常复杂的数据结构来组织它。但你问题的答案太宽泛了。

相关问题