ram linux 关系,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,内核保留)可能会阻止您直接使用所有内存.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值