变量分配和跟踪

时间:2019-03-01 14:57:20

标签: memory-management data-structures operating-system

在对内存分配有疑问之后,我最近开始搜索和阅读有关ALDS和内存管理的信息,经过几天的研究,我学到了很多有关内存管理的知识,但实际的疑问仍未解决。

因此,问题在于,在将内存分配给变量时,系统如何确切地知道哪个内存块可用和哪个空闲,以及类似的,当我们销毁对象或将变量设置为null或GC释放时一些内存,它与该内存块的作用是什么,因为我知道删除时永远不会擦除实际数据,该内存块只是在某张表的某处被标记为空闲,但是该表是否跟踪每个如果是的话,那会不会变成很多数据要存储?

例如,如果我声明一个链表,那么将在堆中分配一个块,下一个块的值为null,因为没有其他节点可引用,现在随着我不断向其中添加更多节点,系统将继续分配更多的块,每个块都包含对下一个块的引用。现在,根据分配时内存的可用性,这些块可以出现在随机的位置,并且只能通过其前进的节点进行访问。

因此,现在,对于任何给定的内存块,系统将如何知道其空闲空间是否仅有垃圾值,或者实际上是某个链表的节点。

1 个答案:

答案 0 :(得分:0)

在现代操作系统上,该过程具有逻辑的线性地址空间。该地址空间的一部分为系统保留,并且对于所有进程都是公用的。某些地址空间可能会保留,但其余大部分可用于该进程。

地址空间由PAGE TABLES定义。页表的结构由处理器定义,但是操作系统会为每个进程维护一个表。内存分配给PAGES中的进程。我知道的最小字节数是512字节,但在某些处理器和某些处理器配置中,其大小可以达到兆字节甚至更大。该大小始终为2的幂。

页表定义:

  1. 页面是否实际上已映射到流程
  2. 页面是否具有相应的物理内存位置
  3. 如果是,则映射到该物理位置。

那里的操作系统只知道页面。

在下一级,有内存管理器。这些不是操作系统的一部分。内存管理器管理由操作系统分配的页面组成的堆。内存管理器必须跟踪堆大小以及在其中分配了哪些内存。

内存管理器的操作方式非常多种。您可以将malloc / free实现的丰富性链接到您的代码中以获得不同的行为。