linux内存基础知识

要理解内存在程序中是如何分配的,首先需要理解如何将内存从操作系统分配给程序。计算机上的每一个进程都认为自己可以访问所有的物理内存。显然,由于同时在运行多个程序,所以每个进程不可能拥有全部的内存。实际上,这些进程使用的是虚拟内存。

    举个例子,让我们假定您的程序正在访问地址为629RAM中,如果物理RAM中,那么操作系统将暂时停止您的进程,将其他内存转存到硬盘中,从硬盘上加载被请求的内存,然后再重新启动您的进程。这样,每个进程都获得了自己可以使用的地址空间,可以访问比您物理上安装的内存更多的内存。


    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用内存(一个连续完整的地址空间),而实际上,它通常是被分割成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(RAM)的使用也更有效率。虚拟内存技术使得系统中有限的物理内存竞争进程中所需内存空间得到满足。虚拟内存通过在各个进程之间共享内存,而使系统看起来有多于实际内存的内存容量。

虚拟内存技术提供下面这些功能:

1.       巨大的寻址空间

操作系统让系统看上去有比实际内存大得多的内存空间。虚拟内存可以是系统中实际物理空间的许多倍。每个进程运行在其独立的虚拟地址空间中,这些虚拟空间相互之间都完全隔离开来,所以进程之间不会互相影响。同时,硬件虚拟内存机构可以将内存的某些区域设置成不可写,这样可以保护代码与数据不受恶意程序的干扰。

2.       公平的物理内存分配

内存管理子系统允许系统中每个运行的进程公平地共享系统中的物理内存。

3.       共享虚拟内存

尽管虚拟内存允许进程有其独立的虚拟地址空间,但有时也需要在进程之间共享内存。动态库就是一种进程间共享执行代码的方式。

4.       进程的保护

系统中的每一个进程都有自己的虚拟地址空间。这些虚拟地址空间是完全分开的。这样一个进程的运行不会影响其他进程,并且硬件上的虚拟内存机制是被保护的,内存不能被写入,这样可以防止迷失的应用程序覆盖代码的数据。

5.       Linux虚拟内存实现机制

Linux虚拟内存的实现需要6种机制的支持:地址映射机制、内存分配回收机制、缓存和刷新机制、请求页机制、交换机制和内存共享机制。

 

    heapmmap映射区域是可以提供给用户程序使用的虚拟内存空间。操作系统提供了相关的系统调用来获取该区域的内存。对heap的操作,操作系统提供了brk()函数,C运行时库提供了sbrk()函数;对mmap映射区域的操作,操作系统提供了mmap()munmap()函数。sbrk(), brk()mmap()都可以用来向我们的进程添加额外的虚拟内存。

    这里要提到一个很重要的概念,内存的延迟分配,只有在真正访问一个地址的时候建立这个地址的物理映射,这是 Linux 内核在用户申请内存的时候,只是给它分配了一个线性区(也就是虚拟内存),并没有分配实际物理内存;只有当用户使用这块内存的时候,内核才会分配具体的物理页面给用户,这时候才占用宝贵的物理内存。内核释放物理页面是通过释放线性区,找到其对应的物理页面,将其全部释放的过程。



下图是32位linux系统的内存经典布局图:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值