这篇文章主要介绍了Linux的虚拟内存怎么理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux的虚拟内存怎么理解文章都会有所收获,下面我们一起来看看吧。
为了正确的理解虚拟内存管理器的工作原理,磨刀不误砍柴工,我们先来了解一下虚拟内存的组成。虽然对于虚拟内存低层级组成概念很有益处,但是有必要更深入地了解虚拟内存如何工作以及怎样才能优化其性能。
图表1. 高级虚拟内存子系统组成图
Linux系统中的虚拟内存子系统复杂极其复杂,但是我们可以通过下面的组件更深入地了解虚拟内存:
内存管理单元(MMU, Memory Management Unit,下面简称MMU)是作为实现虚拟内存系统的物理硬件基础,MMU可以允许软件通过一个别名的地址跟物理地址建立映射,通常是多于一个。这是通过使用分页(pages)和分页表(分页表:分页表是一种数据结构,为使用电脑操作系统之虚拟内存技术,将内存空间切割成分页的形式,用于储存虚拟内存及实体内存间的对应). MMU再使用一部分内存,通过一系列的查找表(Table lookups)来翻译虚拟地址到物理地址的映射。
Zoned Buddy Allocator (暂译为:区域内存分配器 没有找到中文标准的翻译, Buddy Allocator暂译为友内存分配器)
区域内存分配器负责整个虚拟内存系统分页存储管理。 这部分代码管理连续物理内存分页的链表并且让他们映射到MMU的分页表(page tables),当其他系统和核心子系统请求分配物理地址的时候,由其提供有效的物理地址(物理地址到虚拟内存地址的映射是被虚拟内存系统较高层处理的)。通过友内存分配器的名字我们就可以推断出子系统用来维护空闲列表的算法。所有在内存中的物理分页是被友内存分配器分类和分组进入列表的。每一个列表代表了2n分页个的簇,这里的n会随着每个逐步自增。如果在请求列表中没有任何请求,下一个里诶包的请求将会被分在两个隔离的簇中并且在下一个请求到达的时候返回给请求者。当分配返回请求给到好友分配器友内存分配器的时候,反转处理便开始了;注意到友内存分配器也管理着定义不同用途的内存池的内存区域。目前友内存分配器能够管理进入一下三种内存池:
DMA-这个区域包含内存最开始的16MB空间,这部分是作为遗留设备(legacy devices)用作直接对内存进行操作的空间的。
NORMAL-这部分区域包括接下来的16MB到1GB的内存地址,被用作内核的内部数据结构以及系统和用户的空间来分配使用。
HIGHMEM-这部分区域包含1GB以上的地址,被专门留给操作系统分配使用(如文件系统缓冲,用户空间分配,等等)。
Slab分配器提供了一种可用性更高的前端实现来配合Buddy(伙伴算法)分配器,它主要用来应对内核中某些部分需求大小更加灵活内存(并非常用的4KB)的请求。Slab分配器允许内核组件创建给定大小的内存对象缓存。Slab分配器负责将尽可能多的缓存对象放在一页并且监控哪些对象已经释放,哪些内存已经被分配。当有内存分配请求但是页面中没有内存可用时,Slab分配器会向Buddy分配器请求更多的页来满足分配请求。这就使得内核组件用一种更简单的方法来使用内存。使用这种方法,很多只利用一小部分内存的组件就不需要各自独立实现内存管理的代码,从而不需要浪费很多的页。Slab分配器只可能从DMA和NORMAL区域分配内存。
最后一个虚拟内存子系统的组件是内核线程,包括:kscand, kswapd, kupdated, 和bdflush。这些线程负责正在使用的内存的恢复和管理。虚拟内存中的所有页面都有一个关联的状态(更多关于内存状态机的信息请参考"页面的生命周期"章节)一般来说,内核中虚拟内存相关的活跃线程负责尝试将页面移出RAM的操作。它们定期的检查RAM,尝试识别和释放非活跃的内存,从而使得这一部分内存可以在系统中另作他用。
所有由虚拟内存管理的内存都会被一个状态标记。这些状态帮助虚拟内存知道在各种各样的情形下对给定的页面该做些什么。依赖于当前系统的需要,虚拟内存可能依据状态机(图示2. "虚拟内存页面状态机")将页面从一种状态转移到下一个状态。利用这些状态, 虚拟内存可以决定操作系统在某个时间对某个页面做了什么,并且它还可以决定对这个页面做什么操作。这些有特殊意义的状态如下所示
1.FREE —— 所有可被分配的页面从这个状态开始。这个状态告诉虚拟内存本页面没有被用于任何目的,并且可分配。
2.ACTIVE —— 页面已经被Buddy分配器分配了之后进入ACTIVE状态。这个状态告诉虚拟内存本页面已经被分配,并且它已经被内存进程或者用户进程所使用。
3. INACTIVE DIRTY —— 这个状态预示着本页面已经被要求分配它的进程所抛弃,并且它成为将要从主存中被剔除的候选者。kscand任务会定期扫描内存中的页面,并记下页面自从最后一次访问的到当前呆在内存的总时间。如果kscand任务发现自从上次它扫面这个页面以来,这个页面有被访问,它会增加这个页面的年龄计数器的值,否则,它会减少这个页面的年龄计数器的值。当kscand任务发现这个页面的年龄计数器的值为0,它会将这个页面的状态置成INACTIVE DIRTY状态。在INACTIVE DIRTY状态下的页面被保存在将要被清除的页面列表里面。
4. INACTIVE LAUNDERED —— 这是一个临时的状态,在这个状态下的页面已经被选择出要从主存中剔除,与此同时这个页面的内容将被保存在磁盘上。只有在INACTIVE DIRTY状态下的页面才能进入这个状态。一旦磁盘I/O操作(写磁盘操作)完成,这个页面的状态转移到INACTIVE CLEAN,在INACTIVE CLEAN 状态下,这个页面可能会被释放或者由于其他目的而被重写。如果在(写)磁盘操作期间,这个页面被访问了, 它的状态将变成ACTIVE。
5. INACTIVE CLEAN —— 这个状态下的页面已经被从内存中清除了。这意味着此页面的内容已经同步到磁盘上。从而,此页面可能会被虚拟内存释放或者由于其他目的而被重写。
关于“Linux的虚拟内存怎么理解”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Linux的虚拟内存怎么理解”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。