内存,大页内存学习理解总结

为什么要研究,学习,理解内存,大页内存?

马上下个项目需要用到dpdk。搭建dpdk需要配置大页内存。如果不是从本质上理解大页内存,会有很多疑惑的地方。例如:

(1)如果配置大页内存了,会不会影响当前内存的使用。

(2)对于地址翻译那块一直一知半解的正好更清楚一些。

在解答上面答案和整体弄明白流程前有一些概念顺带提一下吧。

虚拟内存:这个你顺便在网上可以搜到很多答案,我在这里还是顺带提一下,现在都是多任务操作系统,为了实现不同进程之间相互不干扰,操作系统为每个进程维护一个虚拟内存。每个虚拟内存大小等同于物理内存大小,不过每个进程的虚拟内存中需要扣除一部分内核占用空间,不同的操作系统占用不同,一般windows操作系统占2G。linux操作系统占1G 。这样就形成了多个虚拟内存对应一个物理内存。

物理内存:内存条。

内存分页:cpu当要执行当前进程的指令时其实读到的是虚拟内存地址,他不存在的。需要把虚拟内存转化成物理内存,虚拟内存的大小不一定与物理内存大小正好相等。如果做1比1的转化的话,那么维护这种映射关系的表就占满内存。所以一般以4k为一块区域大小,这样存储映射关系的表就缩小到原来的1/4000了。这样就能让人接受。

页表机制:存储虚拟内存到物理内存映射关系的表,叫页表。他里面会有虚拟页和物理页之间的映射关系。他存在的位置是内存中,每一个进程都有自己的页表,当前执行的进程,他的页表会加载到物理内存中,如果该进程没有执行,那么他只是在虚拟内存中,有很多文档上说实现虚拟内存到物理内存转化的叫MMU。这些文档说的没有问题,当cpu实现不同进程之间切换的时候。会把页表的地址更新到MMU中。就是很多文档中所说的实现地址翻译需要软硬件结合。硬件就是一个MMU的东西,软件就是页表。

mmap:  在介绍大页内存之前带一下它吧。linux操作系统中,实现将一个文件映射到进程中的一个系统调用。

大页内存:进程的虚拟内存页表中其实是有两部分的,一部分是常规页表,一部分是大页内存页表,只是默认情况下是不开启的。所以默认情况下只有常规页表了。我们通过sysctl或者动态的方式或者numa的方式去设置操作系统是否开启大页内存,以及一些配置。不过这只是配置大页内存,我们还需要通过hugetlbfs这种特殊的文件系统来使用大页内存。所以我们仍然在配置中需要去挂载hugetlbfs。

hugetlbfs:是一个特殊文件系统(本质是内存文件系统)。hugetlbfs主要的作用是使得应用程序可以根据需要灵活的选择虚拟存储器页面的大小,而不会全局性的强制使用某个大小的页面。

你可能感兴趣的:(内存,大页内存学习理解总结)