当在计算机中分配内存时,它如何知道哪些字节已经被占用并且不能被覆盖?
因此,如果这些是未被使用的内存的一些字节:
[0|0|0|0]计算机如何知道它们是不是呢?它们可能只是一个等于零的整数。也可能是空内存。它是怎么知道的?
发布于 2014-03-24 01:28:39
这取决于执行分配的方式,但它通常涉及对属于分配机制的数据的操作。
当你在函数中分配一些变量时,分配是通过递减堆栈指针来执行的。通过堆栈指针,您的程序知道堆栈指针以下的任何内容都不会分配给堆栈,而堆栈指针以上的任何内容都会分配给堆栈。
当您通过malloc()等在堆上分配一些东西时,事情是相似的,但更复杂:所有这些分配器都有一些内部数据结构,它们永远不会向调用应用程序公开,但允许它们选择在分配请求时返回哪些内存地址。例如,一些malloc()实现对固定大小小对象使用多个存储池,并为它们所跟踪的每个固定大小维护空闲对象的链表。这样,它们可以快速弹出列表中的一个内存区域,只有当它们耗尽满足特定请求大小的区域时,才会执行更昂贵的计算。
在任何情况下,每个分配器都必须不时地向系统内核请求内存。此机制始终在完整内存页面(通常为4 kiB)上工作,并通过系统调用brk()和mmap()工作。同样,内核跟踪哪些页面在哪些进程中可见,以及它们被映射到哪些地址,因此内核内部为此分配了额外的内存。
这些映射通过页表提供给处理器,处理器使用页表将虚拟内存地址解析为物理地址。所以在这里,最后,你有一些硬件参与到这个过程中,但这在机制的内部是很远很远的,远远低于用户空间进程所能看到的任何东西。尽管如此,即使页表是由内核的软件管理的,而不是由硬件管理的,硬件也只能解释软件写入页表的内容。
https://stackoverflow.com/questions/22594268
复制相似问题