物理内存管理

页面内存管理

Linux把物理内存划分为若干个大小相同(通常是4k)的页面,每个页面使用struct page描述,在内核初始化时会根据物理内存大小和页面大小,初始化一个struct page数组mem_map[]对系统中所有的页面进行统一管理。

物理页面描述

使用Node,Zone,Page三级结构进行管理。

对于NUMA计算机,有多个Node,非NUMA计算机则只有一个Node。

每个Node中有3个Zone,分别为DMA,Normal和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 的 cache

tmpfs 文件系统使用的页。

回收时机

周期性的检查:这是由后台运行的守护进程 kswapd 完成的。该进程定期检查当前系统的内存使用情况,当发现系统内空闲的物理页面数目少于特定的阈值时,该进程就会发起页面回收的操作。

“内存严重不足”事件的触发:在某些情况下,比如,操作系统忽然需要通过伙伴系统为用户进程分配一大块内存,或者需要创建一个很大的缓冲区,而当时系统中 的内存没有办法提供足够多的物理内存以满足这种内存请求,这时候,操作系统就必须尽快进行页面回收操作,以便释放出一些内存空间从而满足上述的内存请求。 这种页面回收方式也被称作“直接页面回收”。

swap内存管理

在低速磁盘上选定一块空间,以页面大小(通常是4k)为单位划分空间(开头还有4k的swap分区描述结构),以页面为单位进行管理。

虚拟内存管理

内核态虚拟内存管理

内核态虚拟内存分配

使用slab分配器(嵌入式系统使用轻量级slub分配器,大型服务器使用支持大量大内存分配的slob分配器),主要解决外部碎片问题。

在此基础上创建一系列的页面缓存,比如task_struct,inode,file缓存。

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函数, 查看命名页面状态。

linux内存不足时缩减缓存,Linux内存及页面缓存管理概要总结相关推荐

  1. laravel缓存html,Laravel 静态页面缓存 JosephSilber/page-cache - 码农天地

    JosephSilber/page-cache Laravel 静态页面缓存2020-02-26 09:39:53 Laravel 页面缓存 这个包允许您轻松地将响应缓存为磁盘上的静态文件,以便更快速 ...

  2. vue切换路由页面数据缓存_Vue-Router实现前端页面缓存

    一.使用情景 在使用Vue开发单页面应用时,我们通常会使用Vue-Router进行页面导航,Vue-Router在进行路由切换的时候,页面是会重新加载,对应的生命周期函数也会再次执行一遍,但是在有些业 ...

  3. Linux系统运行时参数命令--Linux基础命令和工具

    目录 1 Linux基础命令和工具 1.1 grep搜索字符 1.2 find查找文件 1.3 ls显示文件 1.4 wc命令 1.5 ulimit用户资源 1.6 scp远程拷贝 1.7 dos2u ...

  4. linux程序崩溃时调用链,Linux 获取并分析程序崩溃时的调用堆栈

    下面是一个小例子,说明了程序出现段错误时,如何打印程序的堆栈信息. #include #include #include #include static void WidebrightSegvHand ...

  5. linux为系统分配内存,Linux操作系统知识讲解:走进Linux 内存分配算法

    Linux 内存分配算法 内存管理算法--对讨厌自己管理内存的人来说是天赐的礼物 1.内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配的这些小的内存生存周期又较长,反复申请后将产生内存碎片的 ...

  6. 【linux开发】IO端口和IO内存的区别及分别使用的函数接口

    IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把 ...

  7. 深入分析glibc内存释放时的死锁bug

    通常我们认为一旦内存写溢出,程序就很容易崩溃.所以服务器上通常会对一些重要进程做脚本保护,一旦崩溃立即重新拉起. 最近发现我们一个公共服务内存写溢出时程序没有崩溃,而是卡死了. 为了深入分析原因,我们 ...

  8. aep内存用法_一种AEP内存接口的压力检测方法及系统与流程

    本发明属于内存接口检测领域,具体涉及一种AEP内存接口的压力检测方法及系统. 背景技术: AEP内存简称Apache Pass DIMMs,为高性能和灵活性而设计的,The Intel® Optane ...

  9. java 导致内存泄露的情况_JConsole定位内存泄漏

    在本文中,我们将看到Java中内存泄漏的示例代码.之后,我们将把Java应用程序连接到JConsole,比较有无内存泄漏时应用程序的内存使用情况.深入研究JConsole的内存监控工具可以让我们看到堆 ...

最新文章

  1. Transformer应用到建筑行业,CAD设计起飞了
  2. Arduino处理STM32中的多个串口通讯问题
  3. Introduction to Mathematical Thinking - Week 3
  4. $.ajax()参数详解及标准写法
  5. c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为八进制字符串(char [])...
  6. batch spring 重复执行_可能是最漂亮的Spring事务管理详解
  7. 弄一个html的登录页面,如何制作一个简单的HTML登录页面(附代码)
  8. EWF在win7_x86_x64系统中配置
  9. 摩斯电碼中英文对照表
  10. 破解webstrom2017
  11. 2022年江西省建筑三类人员(企业主要负责人A证)练习题及答案
  12. 生信工作流框架搭建 | 02-nextflow 实战
  13. python zipfile压缩的文件用shell命令解压_Python学习第177课——bzip2、zip方式压缩文件和解压文件...
  14. 失去黄金时代的趣店,要走多久才能成功转型?
  15. c语言统计字母字符数字字符个数,C语言统计字符个数代码分享
  16. Basler相机QT代码vs
  17. 一款小巧精致的编辑和编译工具--TextPad
  18. 要嫁就嫁个37度男人
  19. Python3 基础学习笔记4-图形用户界面(easygui)
  20. 形式语言与自动机 复习知识点总结 CH2

热门文章

  1. Spring MVC3 Hibernate CRUD示例应用程序
  2. 设置 input元素placeholder的字体颜色
  3. Linux命令行中的特殊符号_特殊字符
  4. python 提升效率_@Python 程序员,如何最大化提升编码效率?
  5. python初学者代码示例_Selenium 快速入门笔记和代码示例(Python版)
  6. java底层机制_Java同步机制的底层实现
  7. js find的用法_React常用库Immutable.js常用API
  8. nginx配置vue项目500_一个Nginx部署多个vue前端项目总结
  9. 入门C语言10问10答
  10. C/C++打造《百万级人脸识别系统》