首页 > 编程知识 正文

linux段页式内存管理(linux内存管理java实现)

时间:2023-05-06 11:25:28 阅读:73975 作者:3251

Linux发展至今,其内存管理机制十分成熟,内存条带大小的发展速度已经完全适应日常运行APP应用的要求。 但是,无论内存有多少可用,内存总是稀缺资源,合理的内存管理是软件正常运行的基础。 相反,关于Linux的内存分配,我们调查了在Linux自身有限的内存下,程序可以申请多少可用内存。

1 .可用内存Linux可以轻松打破MS-DOS内存型号的上限,但每个Linux系统都有自己的内存申请上限。 这个上限和系统内存大小有什么关系? 要进行测试,请执行以下操作:

首先做一些准备工作,了解自己系统的内存有多少,直接在终端上敲free或free -h,free 与 available的关系

free命令的输出包括free列和available列。 这两者到底有什么不同?

free是实际未使用的物理内存的数量。 关于available,有趣的是从APP应用程序中看到的可用内存数量。 Linux内核占用一部分内存来缓存磁盘数据,以提高磁盘操作的性能。 介绍buffer和cache。 因此,对于内核来说,buffer和cache属于已经使用的内存。 在APP应用程序需要内存时,如果没有足够的自由内存,内核将从buffer和cache回收内存以满足APP应用程序的要求。 所以从APP应用的角度来说,available=free buffer cache。 请注意,这是理想的计算方法,实际数据存在很大误差。

可以看到,我的系统内存总大小为12G左右,剩下的为1.5G,交换空间总大小为8G左右,剩下的为5.35G。 通过以下步骤继续申请内存,可以验证申请上限。

# include unistd.h # include stdlib.h # include stdio.h # defineone _ k (1024 ) int main ) { char *some_memory; int size_to_allocate=ONE_K; int megs_obtained=0; int ks_obtained=0; wile(1) for ) ks_obtained=0; ks_obtained 1024; ks_obtained(some_memory=(char* ) malloc ) size_to_allocate ); if(some_memory==null ) exit ) exit_failure; sprintf(some_memory,' Hello World '; } megs_obtained; 打印机(now allocated % dmegabytes (n ),megs_obtained ); }exit(exit_success; }输入的结果如下。

再次自由检查内存和交换空间的状况。

根据上面的实验,申请内存使用这个内存是有上限的,一旦达到这个上限,Linux操作系统为了保护自己的安全运行,就会杀死这个程序。 在此过程中,很明显,随着分配的存储器大小接近物理存储器,执行速度将明显变慢,硬盘操作(即,临时不访问的内容)将被交换区域替换,因此程序结束后,可用的存储器总之,申请内存并使用申请的内存(写入数据),可以申请的内存总大小接近可用内存空间和剩馀交换空间的总和,结果为7.6G。 您可能会感到好奇,以前可用内存空间和剩余交换空间的总和为6.9G左右。 运行程序后,为什么会变大?如果内存不足,Linux正在清理并使用其他程序使用的内存。 在我的系统上打开的网页将在此程序出厂时显示

因为是崩溃的现象,所以在运行程序进行实验时有一定的风险。

2 .申请或不使用大量内存的有趣之处在于,如果申请或不使用内存,可申请的内存将远远大于系统的实际可用内存空间和剩余交换空间的总和。 实验顺序如下。

# include unistd.h # include stdlib.h # include stdio.h # definea _ megabyte (1024 * 1024 ) define phy _ mem _ megs8* ddy int megs_obtained=0; while (megs _ obtained (phy _ mem _ megs *4) ) some_memory=(char* ) malloc ) size_to_allocate ); if(some_memory!=null}{megs_obtained; sprintf(some_memory,' Hello World '; printf (' % s-now allocated % dmegabytesn ',some_memory,megs_obtained ); }else{exit(exit_failure ); }exit(exit_success; }运行结果如下。

因此,系统的实际可用内存空间和剩余交换空间的总和为7.6G,但申请32G内存空间并未出错,整个程序只需一瞬间运行,未达到申请上限。 因为在malloc申请虚拟地址后,申请的空间不会立即与实际物理内存建立映射关系,而是在使用时通过页面不足的中断完成整个虚拟地址和物理地址映射过程,所以即使不使用物理内存,申请的空间也是物理的

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。