linux – 如何分配RAM?
这是关于计算机科学的一个小道问题:ram是如何分配的?
例如,我使用Windows.我可以知道程序使用哪些地址吗? Windows如何分配内存?连续还是非连续? 而且,我可以使用程序访问整个ram吗? (我不相信,但……) 你知道这方面有什么好的讲座/文件吗? 解决方法
首先,当你认为你正在分配RAM时,你真的不是.我知道这很令人困惑,但一旦你理解了它的工作方式,它就真的不复杂了.继续阅读.
RAM由操作系统以称为“页面”的单元分配.通常,这意味着4kiB的连续区域,但是其他大小是可能的(为了进一步复杂化,在现代处理器上存在对“大页面”(通常大约1-4MiB)的支持,并且操作系统可能具有分配粒度与页面大小不同,例如Windows的页面大小为4kiB,粒度为64kiB. 如果您分配和使用大于系统页面大小的区域,您通常不会有连续的内存,但您仍然会将其视为连续的,因为您的程序只能在虚拟地址中“思考”.实际上,您可能正在使用两个(或更多)完全不连续的页面,但它们似乎是.这些虚拟地址由MMU透明地转换为实际地址. 虚拟内存是一种非常强大的工具.虽然程序中的一个地址只能引用RAM中的[最多]一个物理地址(在特定页面中),但RAM的一个物理页面可以映射到程序中的几个不同地址,甚至可以映射到多个独立程序中. 在高层次上,您向标准库询问内存(例如malloc),标准库管理一个或多或少未指定方式保留的区域池(有许多不同的分配器实现,它们都有共同之处)您可以向他们询问内存,然后他们会回复一个地址 – 这就是您认为自己在没有时分配RAM的地方. 通常,您可以使用内存执行3项操作,并且它通常在Linux和Windows(以及其他所有现代操作系统)下的工作方式相同,尽管使用的API函数不同,并且存在一些较小的差异. 您可以保留它,这或多或少都没有,除了逻辑上划分您的地址空间(只有您的过程关心这一点). 从您的角度来看,这些都不可见.它只是像魔法一样工作. 可以检查其地址空间中使用哪些区域的过程,并且可以(但有点无意义)将其转换为物理地址.注意,在不同时间运行的相同程序可以存储例如不同地址的一个特定变量.在Windows下,您可以使用VMMap工具检查进程内存分配. 如果您编写自己的操作系统,则只能使用所有RAM,因为操作系统保留的内存总是很少,用户进程无法使用.否则你原则上可以使用[几乎]所有内存.但是,您是否可以直接使用那么多取决于您的进程是32位还是64位.现在的计算机通常具有比使用32位的地址更多的RAM,因此您需要使用地址窗口扩展或者您的进程必须是64位.此外,即使给定一定数量的RAM原则上可使用32位寻址,一些地址空间因素(例如fragentation,内核保留)可能会阻止您直接使用所有内存. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |