Solaris的内存管理

本文地址:http://blog.csdn.net/SerenityMoon/archive/2010/11/18/6019466.aspx

 

solaris的内存管理使用的虚拟内存系统,虚拟内存系统的主要任务就是保持RAM中的数据是目前CPU最常用的数据。如果RAM不够用了,那么就把RAM中的不常用的部分放到后背存储器-也就是硬盘。

在UNIX中,慢速的存储介质--也就是硬盘叫做swap space。 有两个基本的虚拟内存管理模型。一个是交换(swapping) ,一个是按需索页(demand paged)。swaping以进程为单位,一次要将进程所需的数据全部读到RAM中。RAM不足,整个进程被swap out。solaris使用了两种方式,通常使用demand paged,当内存严重不足时,使用swaping。

到此,可以看出为什么MASS系统占用了大量交换空间而不是物理内存,原因就是系统运行时并不需要预申请的所有空间,大量不常使用的空间被交换到了系统的交换空间。

 

一个进程至少有4各段

1.可执行正文段-----存放二进制可执行指令

2.可执行的数据段----存放执行时所需的初始化变量

3.堆空间------临时存储器,或由malloc分配的内存

4.进程栈------由匿名内存分配 可执行部分在虚拟地址的低端,堆与栈相邻,栈在高端,在堆与栈之间是空白区域。

solaris内核支持共享内存、文件、库和可执行代码。程序启动时,solaris内核将库文件动态映像到地址空间实现共享库。库被映像到堆、栈之间的地址空间,具体位置随着平台不同而不同。当一个库文件被映像到一个进程的地址空间时,它能映像为“共享”,因此所有的进程均能共享这一物理内存页。可执行正文和数据也能通过该方式共享。

 

进程的内存分配

进程的用户自定义数据结构所需的虚拟内存,是有堆进行分配,堆开始时很小,可以通过调用sbrk()来增加堆的大小,通常用户不会直接调用这个系统调用,malloc()库函数调用的就是sbrk()。因为堆只是虚拟内存,所以只用第一次调用以后,该数据才会被调到物理内存中。 这里,可以看出,我们每次malloc分配的空间,如果进程不使用该数据,这块数据是放在swap space中的。 free的时候,只是对空间的区域标记为空间,并不能发上将物理内存还给空闲内存池。只有该进程结束或者被页面扫描程序替换走,这块物理内存才被释放。这就是为什么,有时候即使调用了free,查看物理内存使用时,仍然没有下降的原因。

 

solaris中的堆最大值

solaris2.7 32位,3.75G(非sun4u平台) 3.9G(sun4u平台)

solaris2.7 64位,16T

 

栈初始化是只有一页空间,当请求时可以增加。栈和堆的区别在于,没有库函数可以增加栈空间。当引用超过栈空间时,内核会发现页错误,这时会增加栈空间。

 

查看内存管理的相关命令

1.查看物理内存配置 prtconf

2.查看虚拟内存状态 vmstat

3.查看交换空间使用情况 swap -s

4.查看内存使用情况 pmap -x PID

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值