变量分配和跟踪

问题描述 投票:0回答:1

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

所以怀疑的是,在为变量分配内存时,系统究竟知道哪个内存块可用且哪个是空闲的,类似地,当我们破坏对象或将变量设置为null或者当GC释放一些内存时,它究竟是如何处理该内存块的,因为我知道实际数据在删除时永远不会被擦除,该块在某些表中被标记为空闲,但是该表会跟踪内存中的每一位,如果是,那么它本身不会成为存储的大量数据吗?

举个例子,如果我声明一个链表,那么一个块将在堆中分配,它的下一个块具有空值,因为没有其他节点可供引用,现在我不断添加更多节点,系统将继续分配更多每个块包含对下一个的引用。现在,这些块可以存在于随机位置,具体取决于分配时内存的可用性,并且只能通过其前进节点访问。

所以现在,对于任何给定的内存块,系统将如何知道它是否是空闲的并且其中只有垃圾值,或者它实际上是某个链表的节点。

memory-management data-structures operating-system
1个回答
0
投票

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

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

页表定义:

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

操作系统只知道页面。

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

内存管理器的操作方式有很多种。有很多malloc / free实现,您可以链接到您的代码中以获得不同的行为。

© www.soinside.com 2019 - 2024. All rights reserved.