本文地址: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