cloudaice的专栏

个人博客网站已经转到www.cloudaice.com

ubuntu中swap分区的内存管理小观察

今天刚刚听老师将了,linux里面内存管理方式。于是晚上便是心血来潮,想着试试看。我的电脑目前是4G的内存,我的交换分区设为1.3G。是64位系统。在正常运行的情况下。系统占有物理内存大概是700多兆的样子。我现在写了一个C语言的小程序。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
int main()
{
    int i,j;
    char *p=malloc(1024*1024*1024);
    char *q=malloc(1024*1024*1024);
    char *o=malloc(1024*1024*1024);
    char *t=malloc(1024*1024*512);
    for (i=0;i<1024*1024*1024;i++)
    {
        p[i]='\0';
        q[i]='\0';
        o[i]='\0';
        if(i%(1024*1024)==0)
        {
        printf("%p\n",o+i);
        printf("%p\n",p+i);
        printf("%p\n",q+i);
        }
    }
    for (j=0;j<1024*1024*768;j++)
    {
        t[j]='\0';
        if(j%(1024*1024)==0)
         printf("%p\n",t+j);
    }
    sleep(15);
    free(o);
    free(t);
    free(q);
    free(p);
return 0;
}
如果这个程序真正地运行起来的话,将会要占用3G768M的内存,显然在我程序运行的尾声,非正常退出了,在此间我不断的观察我的系统监视器,看着它慢慢地变卡,直到假死。同时显示内存使用量的那条线也是逐渐上升,直到顶部。而此时,交换分区的使用量也是明显上升。增加到700多兆的样子。然后程序停止。程序停止后,系统恢复不卡的状态。但是我明显发现,目前交换分区的使用内存量是400多兆。而实际物理内存的使用量是300兆不到。而且我打开文件特别卡。显示硬盘在不断的读取数据。

因此,我分析,原因是在我跑那个小程序的时候,因为要占用很多的内存,因此,会把原来我在实际物理内存中存的东西都放到交换分区。而小程序结束以后。我的那些正常使用的内存的数据还是在交换分区。并不是因为我实际物理内存有空闲了,系统会自动将交换分区的内容复制到实际内存中,而是当我在继续读取数据时候,再会从交换分区把数据读回到实际物理内存当中。因此在我的不断使用当中,我发现swap中的内存使用量渐渐减少,而实际物理内存的使用量正在逐渐增加。截止到现在为止,交换分区中的使用量已经减少到300兆不到,而实际物理内存使用量增加回到500多兆。

PS:是否增加某种机制,能够让系统自动判断物理内存是否有空的区域,并且在物理内存有空的区域的时候,将交换分区的内容自动还原到实际物理内存。

阅读更多
文章标签: ubuntu linux 语言 c
个人分类: 小发现
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭