加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 如何分配RAM?

发布时间:2020-12-13 23:10:09 所属栏目:Linux 来源:网络整理
导读:这是关于计算机科学的一个小道问题:ram是如何分配的? 例如,我使用Windows.我可以知道程序使用哪些地址吗? Windows如何分配内存?连续还是非连续? 在Linux操作系统上它是一回事吗? 而且,我可以使用程序访问整个ram吗? (我不相信,但……) 你知道这方面有
这是关于计算机科学的一个小道问题:ram是如何分配的?

例如,我使用Windows.我可以知道程序使用哪些地址吗? Windows如何分配内存?连续还是非连续?
在Linux操作系统上它是一回事吗?

而且,我可以使用程序访问整个ram吗? (我不相信,但……)

你知道这方面有什么好的讲座/文件吗?

解决方法

首先,当你认为你正在分配RAM时,你真的不是.我知道这很令人困惑,但一旦你理解了它的工作方式,它就真的不复杂了.继续阅读.

RAM由操作系统以称为“页面”的单元分配.通常,这意味着4kiB的连续区域,但是其他大小是可能的(为了进一步复杂化,在现代处理器上存在对“大页面”(通常大约1-4MiB)的支持,并且操作系统可能具有分配粒度与页面大小不同,例如Windows的页面大小为4kiB,粒度为64kiB.
让我们忽略那些额外的细节,只考虑具有一个特定大小(4KiB)的“页面”.

如果您分配和使用大于系统页面大小的区域,您通常不会有连续的内存,但您仍然会将其视为连续的,因为您的程序只能在虚拟地址中“思考”.实际上,您可能正在使用两个(或更多)完全不连续的页面,但它们似乎是.这些虚拟地址由MMU透明地转换为实际地址.
此外,并非所有您认为已分配的内存必须始终存在于RAM中,并且相同的虚拟地址可能在不同时间对应于完全不同的RAM(例如,当页面被换出并稍后再次交换时) – 你的程序会在同一地址看到它,但实际上它很可能在不同的RAM中.

虚拟内存是一种非常强大的工具.虽然程序中的一个地址只能引用RAM中的[最多]一个物理地址(在特定页面中),但RAM的一个物理页面可以映射到程序中的几个不同地址,甚至可以映射到多个独立程序中.
例如,可以创建“循环”存储区域,并且来自共享库的代码通常被加载到一个存储器位置,但是许多程序同时使用它(并且它将在那些不同的程序中具有不同的地址).或者,您可以使用该技术在程序之间共享内存,因此当一个程序写入某个地址时,另一个程序的内存位置中的值会发生变化(因为它是完全相同的内存!).

在高层次上,您向标准库询问内存(例如malloc),标准库管理一个或多或少未指定方式保留的区域池(有许多不同的分配器实现,它们都有共同之处)您可以向他们询问内存,然后他们会回复一个地址 – 这就是您认为自己在没有时分配RAM的地方.
当分配器需要更多内存时,它会要求操作系统保留另一个块.在Linux下,这可能是sbrk和mmap,在Windows下,这可能是VirtualAlloc.

通常,您可以使用内存执行3项操作,并且它通常在Linux和Windows(以及其他所有现代操作系统)下的工作方式相同,尽管使用的API函数不同,并且存在一些较小的差异.

您可以保留它,这或多或少都没有,除了逻辑上划分您的地址空间(只有您的过程关心这一点).
接下来,您可以提交它,这也不会做太多,但它会在某种程度上影响其他进程.系统总共限制了它可以为所有进程提交的内存量(物理RAM加上页面文件大小),并且它会跟踪它.这意味着您提交的内存与另一个进程可以提交的限制相同.否则,再一次,没有多少事情发生.
最后,您可以访问内存.最后,这具有明显的效果.首次访问页面时,会发生故障(因为页面根本不存在!),操作系统要么从文件中提取一些数据(如果页面属于映射),要么清除某些页面(可能在第一次之后)将其保存到磁盘).然后操作系统调整虚拟内存系统中的结构,以便在您访问的地址中看到RAM的物理页面.

从您的角度来看,这些都不可见.它只是像魔法一样工作.

可以检查其地址空间中使用哪些区域的过程,并且可以(但有点无意义)将其转换为物理地址.注意,在不同时间运行的相同程序可以存储例如不同地址的一个特定变量.在Windows下,您可以使用VMMap工具检查进程内存分配.

如果您编写自己的操作系统,则只能使用所有RAM,因为操作系统保留的内存总是很少,用户进程无法使用.否则你原则上可以使用[几乎]所有内存.但是,您是否可以直接使用那么多取决于您的进程是32位还是64位.现在的计算机通常具有比使用32位的地址更多的RAM,因此您需要使用地址窗口扩展或者您的进程必须是64位.此外,即使给定一定数量的RAM原则上可使用32位寻址,一些地址空间因素(例如fragentation,内核保留)可能会阻止您直接使用所有内存.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读