Questions tagged «memory-management»


7
为什么在垃圾收集语言中普遍缺少对象析构函数范式?
寻找有关垃圾收集语言设计决策的见解。也许语言专家可以启发我?我来自C ++背景,所以这个领域令我感到困惑。 似乎几乎所有具有OOPy对象支持的现代垃圾收集语言(如Ruby,Javascript / ES6 / ES7,Actionscript,Lua等)都完全省略了析构函数/定型化范例。Python似乎是唯一使用它的class __del__()方法。为什么是这样?在具有自动垃圾收集的语言中,语言是否存在功能/理论上的限制,从而无法在对象上有效实现析构函数/完成方法? 我发现非常缺乏这些语言将内存视为唯一值得管理的资源。套接字,文件句柄,应用程序状态如何?由于无法实现自定义逻辑以清除对象最终确定中的非内存资源和状态,因此我需要使用自定义myObject.destroy()样式调用来填充我的应用程序,将清除逻辑置于“类”之外,破坏尝试的封装,并降级我的应用程序由于人为错误而导致资源泄漏,而不是由gc自动处理。 什么是语言设计决策,这些决策导致这些语言无法对对象处理执行任何自定义逻辑?我必须想象有一个很好的理由。我想更好地理解导致这些语言不支持对象销毁/完成的技术和理论决策。 更新: 也许更好的方式表达我的问题: 为什么一种语言会具有带有类或类结构以及自定义实例化(构造函数)的对象实例的内置概念,却完全省略了销毁/最终确定功能?提供自动垃圾收集的语言似乎是支持对象销毁/完成的主要候选方法,因为他们知道当不再使用某个对象时会100%确定。但是,其中大多数语言都不支持它。 我认为在这种情况下可能永远不会调用析构函数,因为那将是核心内存泄漏,gcs旨在避免这种情况。我可以看到一个可能的论点是,直到将来某个不确定的时间,析构函数/ finalizer才会被调用,但这并没有阻止Java或Python支持该功能。 不支持任何形式的对象完成的核心语言设计原因是什么?


4
垃圾收集器如何避免堆栈溢出?
因此,我在考虑垃圾收集器的工作方式,并想到了一个有趣的问题。大概垃圾收集器必须以相同的方式遍历所有结构。他们不知道正在遍历链表或平衡树之类的天气。他们也不会在搜索中消耗过多的内存。我想到遍历所有结构的一种可能方法,也是唯一的方法,可能就是像使用二叉树那样递归遍历所有结构。但是,这会在链表甚至平衡差的二叉树上产生堆栈溢出。但是我曾经使用过的所有垃圾收集语言似乎都没有问题的处理能力。 在龙书中,它使用各种“未扫描”队列。基本上,而不是递归遍历结构,它只是将需要标记的内容添加到队列中,然后针对未标记的所有内容将其删除。但是这个队列不会很大吗? 那么,垃圾收集器如何遍历任意结构?这种遍历技术如何避免溢出?

7
一台没有RAM但有磁盘的计算机等同于有RAM的计算机吗?
据我了解,内存用于很多事情。它充当磁盘缓存,并包含程序的指令及其堆栈和堆。这是一个思想实验。如果人们不关心计算机处理数据的速度或时间,那么假设计算机的磁盘容量很大,那么它可以拥有的最小内存量是多少?可以只拥有一个磁盘就可以消除内存吗? 显然不需要磁盘缓存。如果我们在磁盘上设置交换空间,则程序堆栈和堆也不需要内存。是否有需要记忆的东西?


1
如果虚拟地址空间可以大于物理地址空间,那么地址映射如何存储在内存中?
假设我们正在使用具有40个物理地址位的系统。物理地址总空间(假定字节可寻址内存)为字节,即1 TiB。而且,如果虚拟地址的长度为48位,则意味着虚拟内存可用的地址比物理内存中的地址要多。2402402^{40} 这对我来说很有意义,因为“多余”地址也可能指向硬盘位置。但是,我不了解虚拟地址和物理地址之间的转换是如何发生的。我假设有一个映射存储在某处,该映射将VAS位置链接到物理位置。如果虚拟地址位置多于物理地址,那么如何将所有这些映射存储在内存中?至少需要48位来存储每个虚拟地址,然后再需要40位来存储其映射到的物理位置。因此,显然,您不能仅存储每个虚拟地址与其物理对应物的1:1映射,因为映射每个位置将比物理内存本身占用更多的内存。 我在这里到底想念什么?

1
操作系统中的内存膨胀
一些虚拟机管理程序使用一种称为“膨胀”的方法(至少是KVM所谓的“膨胀”)来优化内存使用,该方法对VM之间的内存进行重复数据删除,并将普通页面设置为只读,并在写入时进行复制。 这与fork调用相反。 在操作系统级别上实现流程是否可行(我主要想到的是在同一站点上使用带有多个选项卡的Chromium浏览时重复存储),是否已经实现?

2
是否有任何考虑分页的垃圾收集器?
垃圾回收必须访问所有存在的对象,以便找到可以回收的内存。(有很多世代只是延迟了一下) 在所有条件都相同的情况下,最好先访问已分页到RAM中的对象,然后再分页其他块并分页出某些对象。 另一种可能是,当OS希望从进程中删除一整页的内存时,首先会询问GC是否具有可以放弃而无需分页的页面。GC通常可以通过从页面移动对象来完成,因此可以在OS需要页面的限期内清除该页面。 但是,我想不起任何与OS分页系统集成的垃圾收集器,这些垃圾收集器会驱动GC的工作顺序。

1
在纯需求分页期间交换空间管理
以下是我在进行OS家庭作业时遇到的一个疑问-但是,它似乎比基于概念的问题要多于简单的编码问题,因此恕我直言,我认为作业标签不适合这样做。 在给定固定数量的RAM和交换内存的情况下,针对同时运行的多个进程的纯需求分页方案中,在以下两种情况下,交换空间会发生什么情况: 进程遇到页面错误,RAM中没有可用的空闲帧,因此需要将进程的内核帧块中的一个页面写出以进行交换(为简单起见,我不考虑复制-on-write case)。明确地说,将在交换空间中的哪个位置写入此帧,并且为此需要更新哪些数据结构? 当某个进程需要进入特定页面时,它在交换内存中的位置如何?如何知道该特定页面是否全部存在于交换中? 如您所料,我很难理解在纯需求管理方案中以何种方式管理交换空间,以及什么数据结构必不可少。如果您可以在答案中引用任何链接,那就太好了(我在“操作系统概念-Silberschatz的第8版,我找不到我的问题的明确答案”中进行了搜索)。

3
“地图”是什么意思?
我在各种CS教育材料中已经多次遇到过这个术语: L2 CS162(加州大学伯克利分校): 内存映射的I / O L4 CS162(加州大学伯克利分校): 内存映射文件 L24 CS61(加州大学伯克利分校): “内存映射的I / O”:映射到CPU地址空间的设备控制/数据寄存器 甚至在谷歌搜索“映射”之后,我得到了文章 Map_(higher-order_function),但是对我来说还不是很清楚。 更甚者,尝试bitmap通过阅读Wikipedia文章来理解上下文中的含义: 位数组是从某个域(几乎总是整数范围)到集合{0,1}中的值的映射 我不确定,但是在上面的上下文中,这对我来说是关于数据转换的。 后来,在阅读了CS书籍之后,我只找到了这一段,但没有为我解释“映射”的含义: 内存映射Linux(以及其他形式的Unix)通过将虚拟内存区域与磁盘上的对象相关联来初始化虚拟内存区域的内容,此过程称为内存映射。 我还得到了MapReduce作为搜索结果:where map被解释为“并行计算中的一种习语,其中对序列的所有元素(可能是并行的)应用简单的操作”。 我对这个词仍然感到困惑。在我提到的环境中,谁能解释“地图”的含义?

1
为没有MMU的处理器编写多任务操作系统
我一直在考虑为某些ARM处理器编写一个业余操作系统。有很多流行的带有ARM MPU的单板计算机,所以我只想购买其中一台(选择一本带有更开放的文档)。当我发现即使内存确实足够的板卡也没有带有内存管理单元的MPU时,我感到很惊讶。 由于我一直在使用i386 +处理器,除其他一些Microchip PIC之外,什么都没有,所以我现在很困惑,不确定是否可以编写一个工作正常的操作系统,与编写的OS相比,其功能不会受到限制。用于带有MMU的MPU。 我可以想到一些“替换”或“模拟” MMU的解决方案,但我有几个问题: 在16位和32位模式的Intel处理器上,存在一种使用段和段选择器通过不同任务使用不同内存块的方法。这意味着在x86上执行任务切换时,可以通过更改段寄存器的内容来更改内存空间。是否有可用于ARM体系结构的内存分段的一般概念? 通过加载链接的目标文件而不是可执行文件,我可以使用重定位(修复程序)或与位置无关的代码来将任务指向存储器中的任务,就像使用分页结构映射存储器一样。这足够有效吗? 我还阅读了有关ARM处理器上的内存保护单元的内容。这些对您有帮助吗? 在没有MMU的系统上是否有任何“常规”方式来管理任务?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.