可以做代销的网站,wordpress安装centos,最新新闻事件今天,厦门网站设计开发网页公司物理内存管理页面内存管理Linux把物理内存划分为若干个大小相同(通常是4k)的页面#xff0c;每个页面使用struct page描述#xff0c;在内核初始化时会根据物理内存大小和页面大小#xff0c;初始化一个struct page数组mem_map[]对系统中所有的页面进行统一管理。物理页面描…物理内存管理页面内存管理Linux把物理内存划分为若干个大小相同(通常是4k)的页面每个页面使用struct page描述在内核初始化时会根据物理内存大小和页面大小初始化一个struct page数组mem_map[]对系统中所有的页面进行统一管理。物理页面描述使用NodeZonePage三级结构进行管理。对于NUMA计算机有多个Node非NUMA计算机则只有一个Node。每个Node中有3个Zone分别为DMANormal和HighMem(有的还有DMA32等其他Zone不是必须有的有特殊用途此处忽略)。在32位CPU中DMA为从3G开始的16M地址空间Normal为接下来的880M地址空间HighMem为最后的128M地址空间。在64位CPU中由于目前只用了48位地址共256T地址空间内核态占用高128T地址空间所有物理内存都可以被映射到内核所以没有HighMem Zone(其实也是有的只是跟32位的有区别)。Page是内核物理内存管理的最小单位包含各种该页面内存的状态信息分配状况等。物理页面分配使用Buddy以2的N次方个页面为单位进行内存分配主要解决外部碎片问题。物理页面回收回收类型内存中并非所有物理页面都是可以进行回收的内核占用的页不会被换出只有与用户空间建立了映射关系的物理页面才会被换出。总的来说以下这些种物理页面可以被 Linux 操作系统回收进程映射所占的页面包括代码段数据段堆栈以及动态分配的“存储堆”( malloc 分配的)。用户空间中通过 mmap()把文件内容映射到内存所占的页面。匿名页面(没有映射到文件的都是匿名映射用户空间的堆和栈)进程用户模式下的堆栈以及是使用 mmap 匿名映射的内存区(共享内存 区)。注堆栈所占页面一般不被换出。特殊的用于 slab 分配器的缓存比如用于缓存文件目录结构 dentry 的 cache以及用于缓存索引节点 inode 的 cachetmpfs 文件系统使用的页。回收时机周期性的检查这是由后台运行的守护进程 kswapd 完成的。该进程定期检查当前系统的内存使用情况当发现系统内空闲的物理页面数目少于特定的阈值时该进程就会发起页面回收的操作。“内存严重不足”事件的触发在某些情况下比如操作系统忽然需要通过伙伴系统为用户进程分配一大块内存或者需要创建一个很大的缓冲区而当时系统中 的内存没有办法提供足够多的物理内存以满足这种内存请求这时候操作系统就必须尽快进行页面回收操作以便释放出一些内存空间从而满足上述的内存请求。 这种页面回收方式也被称作“直接页面回收”。swap内存管理在低速磁盘上选定一块空间以页面大小(通常是4k)为单位划分空间(开头还有4k的swap分区描述结构)以页面为单位进行管理。虚拟内存管理内核态虚拟内存管理内核态虚拟内存分配使用slab分配器(嵌入式系统使用轻量级slub分配器大型服务器使用支持大量大内存分配的slob分配器)主要解决外部碎片问题。在此基础上创建一系列的页面缓存比如task_structinodefile缓存。kmalloc使用slab创建一系列以2的N次方大小为单位的页面缓存进行内存分配所以分配的内存的物理连续的且地址空间位于Normal Zone。vmalloc与vmalloc使用的分配方法稍有不同分配的内存可能是屋里不连续的且映射空间在HighMem Zone。用户态虚拟内存分配malloc进行内存分配实际上是通过brk和mmap函数实现的brk和mmap函数仅仅是在进程的task_struc中创建新的vma以及为进程创建新的页表并未进行实际内存分配。实际内存分配发生在当用户初次访问内存引起的缺页中断中使用buddy分配器以页面为单位进行分配。页面缓存管理命名页面比如所有的文件或者块设备所对应的页面缓冲也就是有后备存储的缓冲。在Linux的所有文件或者块设备的IO过程中除了使用DirectIO方式之外全部会使用内存进行缓冲。如果使用read/write方式则会有块缓冲如果使用mmap方式则会使用页缓冲。在新版的Linux内核中这二者已经融为一体使用相同的不同的数据结构描述相同的数据页面且对于inode相同的文件或块设备其缓冲在整个内核中只有唯一的一份。匿名页面比如用户态分配的内存无论是brk还是mmap分配也就是没有后备存储的页面。在页面回收时对于命名页面如果为脏则陷入后备存储后丢弃对于匿名页面如果为脏则写入swap存储。页面缓存回收使用LRU2Q算法将不常用的页面释放掉。用户态可以对命名页面进行控制的函数fadvise系列函数控制缓存页面的加载丢弃。mlock系列函数锁定或解锁缓存页面。mincore函数 查看命名页面状态。