![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux 内存管理
文章平均质量分 94
wh8_2011
这个作者很懒,什么都没留下…
展开
-
Linux Swap机制概述
识别需交换的页1. 页框回收算法(PFRA)将页分为不可回收页、可交换页、可同步页、可丢弃页四种类型。其中,可交换页包括:I.属于进程匿名线性区(如用户态堆、栈)的页;II.属于进程私有内存映射的脏页;III.属于IPC共享内存区的页;对于内存中的每一页,内核利用页表项中的Present标志来判断该页是否被换出。2. 映射页是指映转载 2017-01-26 09:24:10 · 3181 阅读 · 1 评论 -
linux内存源码分析 - 内存压缩(同步关系)
概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也那么复杂吧,带着好奇心就把页面迁移的源码都大致看了一遍,还好,不复杂,也容易理解,这里我们就说说在页面迁移过程中是如何进行同步的。不过首先可能没看过的朋友需要先看看linux内存源码分析 - 内存压缩(一),因为会涉及里面的一些知识。 其实一句话可以概括页面迁移转载 2016-08-23 07:29:15 · 1146 阅读 · 0 评论 -
linux内存源码分析 - 内存回收(lru链表)
概述 对于整个内存回收来说,lru链表是关键中的关键,实际上整个内存回收,做的事情就是处理lru链表的收缩,所以这篇文章就先说说系统的lru链表。 内存回收的核心思想,就是如果一些数据能够保存到磁盘,在内存不足时就把这些数据写到磁盘中,这样这些数据占用的内存页就可以作为空闲内存页给予系统使用了。 当内存不足时,系统就必须要将一些页框回收,而哪些页框可以回收呢,之前我们转载 2016-08-23 07:28:25 · 1014 阅读 · 0 评论 -
linux内存源码分析 - 内存回收(整体流程)
概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文件页进行的。对于匿名页,内存回收过程中会筛选出一些不经常使用的匿名页,将它们写入到swap分区中,然后作为空闲页框释放到伙伴系统。而对于文件页,内存回收过程中也会筛选出一些不经常使用的文件页,如果此文件页中保存的内容与磁盘中文件对应内容一致,说明此文件页是一个干净的文件页,就不转载 2016-08-23 06:57:48 · 1938 阅读 · 0 评论 -
linux内存源码分析 - 伙伴系统(初始化和申请页框)
之前的文章已经介绍了伙伴系统,这篇我们主要看看源码中是如何初始化伙伴系统、从伙伴系统中分配页框,返回页框于伙伴系统中的。 我们知道,每个管理区都有自己的伙伴系统管理属于这个管理区的页框,这也说明了,在伙伴系统初始化时,管理区必须要已经存在(初始化完成)了。在管理区描述符(struct zone)中,struct free_area就专门用于描述伙伴系统的。在一个管理区中,伙伴系统一共维护转载 2016-09-01 10:43:34 · 1225 阅读 · 0 评论 -
直接内存回收中的等待队列
内存回收详解见linux内存源码分析 - 内存回收(整体流程),在直接内存回收过程中,有可能会造成当前需要分配内存的进程被加入一个等待队列,当整个node的空闲页数量满足要求时,由kswapd唤醒它重新获取内存。这个等待队列头就是node结点描述符pgdat中的pfmemalloc_wait。如果当前进程加入到了pgdat->pfmemalloc_wait这个等待队列中,那么进程就不会进行直接内存转载 2016-08-22 11:34:04 · 901 阅读 · 0 评论 -
Linux内存管理之页面回收
请求调页机制,只要用户态进程继续执行,他们就能获得页框,然而,请求调页没有办法强制进程释放不再使用的页框。因此,迟早所有空闲内存将被分配给进程和高速缓存,Linux内核的页面回收算法(PFRA)采取从用户进程和内核高速缓存“窃取”页框的办法不从伙伴系统的空闲块列表。 实际上,在用完所有空闲内存之前,就必须执行页框回收算法。否则,内核很可能陷入一种内存请求的僵局中,并导致系统崩溃转载 2016-08-22 11:20:35 · 3175 阅读 · 1 评论 -
页面回收之shrink_zone的实现
页面回收的最重要的函数即:shrink_zone,其主要工作就是shrink_active_list和shrink_inactive_list。 在shrink_zone中,如果该zone中需要扫描到的active和inactive的内存大于swap的阈值,即32个物理页面,则开始进行回收,否则不回收。 shrink_active_list:移动一部分activ转载 2016-08-22 11:19:02 · 1606 阅读 · 0 评论 -
Linux 2.6 中的页面回收与反向映射
为什么要进行页面回收操作系统管理内存中的物理页面,同时也担任着内存分配的职责。应用程序可以通过内存分配函数向操作系统申请物理页面;在使用完这些物理页面之后,应用程序可以通过相应的内存释放函数释放这些物理页面。但是,对于内存中的某些物理页面来说,页面的使用者并不会主动释放它们,如果这些物理页面一直被占用而得不到释放,那么无论计算机上可用的物理内存有多少,物理内存迟早都有被用完的时候。所以,对转载 2016-03-11 11:16:22 · 423 阅读 · 0 评论 -
linux内存源码分析 - 内存回收(匿名页反向映射)
概述 看完了内存压缩,最近在看内存回收这块的代码,发现内容有些多,需要分几块去详细说明,首先先说说匿名页的反向映射,匿名页主要用于进程地址空间的堆、栈、还有私有匿名共享内存(用于有亲属关系的进程),这些匿名页所属的线性区叫做匿名线性区,这些线性区只映射内存,不映射具体磁盘上的文件。匿名页的反向映射对匿名页的回收起到了很大的作用。为了进行内存回收,内核为每个zone管理区的内存页维护了5个转载 2016-08-23 07:30:14 · 1836 阅读 · 0 评论 -
linux内存源码分析 - 内存压缩(实现流程)
概述 本文章最好结合linux内存管理源码分析 - 页框分配器与linux内存源码分析 -伙伴系统(初始化和申请页框)一起看,会涉及里面的一些知识。 我们知道内存是以页框为单位,每个页框大小默认是4K(大页除外),而在系统运行时间长后就会出现内存碎片,内存碎片的意思就是一段空闲页框中,会有零散的一些正在使用的页框,导致此段页框被这些正在使用的零散页框分为一小段一小段连续页框转载 2016-08-23 07:31:13 · 1424 阅读 · 0 评论 -
linux内存源码分析 - 伙伴系统(释放页框)
翻了一下之前的文章,发现竟然忘记写内核是如何释放页框的,罪过。 释放页框很简单,其实只有几步检查此页是否被其他进程使用(检查页描述符的_count是否为0)。如果是释放单个页框,则优先把它放回到该CPU的单页框高速缓存链表中,如果该CPU的单页框高速缓存的页框过多,则把该CPU的页框高速缓存中的pcp->batch个页框放回伙伴系统链表中。在放回伙伴系统的过程中,会与旁边的空闲页转载 2016-08-23 07:31:56 · 937 阅读 · 0 评论 -
shrink_page_list 函数分析
shrink_page_list 是页面回收体系中最至关重要的一个函数,它决定在zone->inactive_list中的页面最后是否能被回收释放掉。这个函数的处理流程总结如下1、如果页面被锁住了,放入继续将页面保留在inactive list中,后就再扫描到底时候再试图回收这些page2、如果回写控制结构体标记了不允许进行unmap操作,将那些在pte表项中有映射到页面保留在inacti转载 2016-10-18 09:34:52 · 3449 阅读 · 0 评论 -
LINUX内核内存管理kmalloc,vmalloc
一.kmalloc与vmallco 在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,释放内存用的是kfree,vfree,kmalloc函数返回的是虚拟地址(线性地址). kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直转载 2016-10-27 16:24:12 · 1499 阅读 · 0 评论 -
linux内存映射
内存管理分为对连续物理内存区管理和非连续内存区管理,本文主要讲解连续的物理内存区管理的技术中所涉及到的内核线性地址空间映射的相关知识。涉及到的东西有:页框,管理区(高端内存,低端内存),高端内存映射等,这些知识是掌握伙伴系统算法和slab分配器的基础。一、页框 页框为物理内存分配的基本单元,现代32位计算机一般设置为4KB(见上文计算机内存寻址)。内核必须记录每个页框的当前转载 2016-10-26 17:54:52 · 432 阅读 · 0 评论 -
linux内存源码分析 - SLAB分配器概述
之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB大小的内存,页框分配器也不得不分配一个4KB的页框给申请者,这样就会有3KB被白白浪费掉了。为了应对这种情况,在页框分配器上一层又做了一层SLAB层,SLAB分配器的作用就是从页框分配器中拿出一些转载 2016-09-08 09:10:47 · 447 阅读 · 0 评论 -
linux内存源码分析 - SLUB分配器概述
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于嵌入式系统。慢慢的slab分配器或许会被slub取代,所以对slub的了解是转载 2016-08-23 07:35:41 · 2383 阅读 · 0 评论 -
总结一下linux中的分段机制
这篇文章主要说一下linux对于分段机制的处理,虽然都说linux不使用分段机制,但是分段机制属于CPU的一个功能,即使linux不使用,也要通过代码想办法绕过它,况且linux也使用到了分段机制中的某些功能。 分段机制主要功能只有两点:将物理内存划分为多个段,让操作系统可以使用大于其地址线对应的物理内存(比如正常情况下32位地址线可以访问4G大小的内存,但是有分段后则可访问大于转载 2016-08-23 07:34:49 · 3197 阅读 · 2 评论 -
内核参数说明
因个人能力有限,不能保证所有描述都正确,还请大家集思广益,有错误的地方欢迎大家留言指正,同时也欢迎大家留言对未标注项进行补偿,谢谢。 内核参数列表kernel.acctacct功能用于系统记录进程信息,正常结束的进程都会在该文件尾添加对应的信息。异常结束是指重启或其它致命的系统问题,不能够记录永不停止的进程。该设置需要配置三个值,分别是:1.如果转载 2016-08-23 07:33:56 · 3532 阅读 · 0 评论 -
linux内存源码分析 - 内存池
内存池是用于预先申请一些内存用于备用,当系统内存不足无法从伙伴系统和slab中获取内存时,会从内存池中获取预留的那些内存。内存池与特殊slab一样,需要使用的设备需要自己创建内存池,而不是系统会自动生成。书上形容得好,内存比作新鲜食物,内存池比作罐头食物,人比作拥有此内存池的模块,当无法吃到新鲜食物时,就需要打开罐头吃罐头食物。 一般情况下,内存池建立在slab之上,也就是说池子里存放的转载 2016-08-23 07:32:48 · 398 阅读 · 0 评论 -
Linux内存映射——mmap
一 mmap系统调用1.内存映射所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。Linux提供了mmap()函数,用来映射物理内存。在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的准备工作,生成vm_area_struct结构体,然后调用设备驱动程序中定义的mmap函数。转载 2016-08-30 21:32:03 · 486 阅读 · 0 评论 -
linux内核 address_space 结构
在阅读Linux2.6的内核内存管理这一部分时,我看到page结构中的一个mapping成员,我感到很迷惑,这个成员的属性太复杂了,我们来看看:struct address_space *mapping;表示该页所在地址空间描述结构指针,用于内容为文件的页帧(1) 如果page->mapping等于0,说明该页属于交换告诉缓存swap cache(2)转载 2016-05-17 07:23:57 · 1224 阅读 · 0 评论 -
linux页表创建与更新
简单来说,讨论linux页表就是讨论linux进程的的页表:linux页表的创建与更新都包含于进程的创建与更新中。当前的linux内核采用的是写时复制方法,在创建一个linux进程时,完全复制父进程的页表,并且将父子进程的页表均置为写保护(即写地址的时候会产生缺页异常等)。那么父子进程谁向地址空间写数据时,产生缺页异常,分配新的页,并将两个页均置为可写,按照这种方式父子进程的地址空间渐渐变得不同。转载 2016-05-15 12:02:41 · 1097 阅读 · 0 评论 -
linux内存寻址解析 (二)
5.Linux中的分页Linux分页机制的作用:分页机制是在段机制之后进行的,它进一步将线性地址转换为物理地址。我们先来看看硬件构造:80386使用4K字节大小的页,且每页的起始地址都被4K整除。因此,早期80386把4GB字节线性地址空间划分为1M个页面,采用了两级表结构。两级表的第一级表称为页目录,存储在一个4K字节的页中,页目录表共有1K个表项,每个表项为4个字节转载 2016-05-14 10:30:03 · 675 阅读 · 0 评论 -
linux内存寻址解析 (一)
1.内存地址1.逻辑地址:每一个逻辑地址都有一个段和偏移量组成。2.线性地址:也叫虚拟地址,是一个32位无符号整数,可以用来表示高达4GB的地址,值得范围从0x00000000到0xffffffff。3.物理地址:用于内存芯片级内存单元寻址内存控制单元(MMU)将逻辑地址转化成线性地址,再转化成物理地址。2.硬件中的分段1.段选择符(段寄存器 )转载 2016-05-14 10:29:06 · 2595 阅读 · 0 评论 -
linux 用户空间与内核空间——高端内存详解
摘要:Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。用户空间的内存映射采用段页式,而内核空间有自己的规则;本文旨在探讨内核空间的地址映射。 Linux内核地址空间划分通常32位Linux内核虚转载 2016-05-14 09:16:29 · 389 阅读 · 0 评论 -
Linux内存管理之页面回收
请求调页机制,只要用户态进程继续执行,他们就能获得页框,然而,请求调页没有办法强制进程释放不再使用的页框。因此,迟早所有空闲内存将被分配给进程和高速缓存,Linux内核的页面回收算法(PFRA)采取从用户进程和内核高速缓存“窃取”页框的办法不从伙伴系统的空闲块列表。 实际上,在用完所有空闲内存之前,就必须执行页框回收算法。否则,内核很可能陷入一种内存请求的僵局中,并导致系统崩溃转载 2016-03-15 10:03:34 · 494 阅读 · 0 评论 -
Linux内核剖析之回收页框
一、页框回收算法 1、为何要有页框回收算法? Linux在为用户态与内核分配动态内存时,检查得并不严谨。 例如: (1)、对单个用户创建的进程的RAM使用的总量并不作严格的检查(进程资源的限制只针对单个进程); (2)、对内核使用的许多磁盘高速缓存和内存高速缓存大小也同样不做限制。 2、为何要减少控制?可以使内核以最好的可行方式使用可用的RAM: (1)、当系统负载较低时,RAM的大部转载 2016-03-21 17:40:40 · 1412 阅读 · 0 评论 -
linux内存管理初始化
内存管理子系统是linux内核最核心最重要的一部分,内核的其他部分都需要在内存管理子系统的基础上运行。而对其初始化是了解整个内存管理子系统的基础。对相关数据结构的初始化是从全局启动例程start_kernel开始的。本文详细描述了从bootloader跳转到linux内核内存管理子系统初始化期间所做的操作,从而来加深对内存管理子系统知识的理解和掌握。内核的入口是stext,这是在arch/转载 2015-08-07 09:54:21 · 1176 阅读 · 0 评论 -
Linux Malloc分析-从用户空间到内核空间
1背景知识1.1 进程的用户空间图1:来源 http://www.open-open.com/lib/view/open1409716051963.html该结构是由进程task_struct.mm_struct进行管理的mm_struct的定义如下:[cpp] view plaincopy转载 2015-08-30 11:44:57 · 551 阅读 · 0 评论 -
Bootmem机制
10. Bootmem机制10.1. 简介Bootmem机制是内核在启动时对内存的一种简单的页面管理方式。它为建立页表管理代码中的数据结构提供动态分配内存的支持,为了对页面管理机制作准备,Linux使用了一种叫bootmem分配器(bootmem allocator)的机制,这种机制仅仅用在系统引导时,它为整个物理内存建立起一个页面位图。这个位图建立在内核代码映象终点_en转载 2016-05-28 09:58:29 · 678 阅读 · 0 评论 -
fork,你拿什么证明你的写时拷贝(COW)
前段时间在学习内核的进程管理方面的东西,看了进程创建和进程调度的代码,想写个大而全的东西,即有内核代码分析,又有一些实验在效果上证明内核的代码。 但是这篇文章很难产,感觉自己还是驾驭不了这个宏大的主题。 好久没写文章了,今天就放弃这个想法,写一个简单的东西。 我们都知道fork创建进程的时候,并没有真正的copy内存,因为我们知道,对于fork来讲,有一个很讨厌的东西叫ex转载 2016-05-15 19:52:41 · 971 阅读 · 0 评论 -
用户空间缺页异常pte_handle_fault()分析--(上)
前面简单的分析了内核处理用户空间缺页异常的流程,进入到了handle_mm_fault()函数,该函数为触发缺页异常的地址address分配各级的页目录,也就是说现在已经拥有了一个和address配对的pte了,但是这个pte如何去映射物理页框,内核又得根据pte的状态进行分类和判断,而这个过程又会牵扯出一些其他的概念……这也是初读linux内核源码的最大障碍吧,在一些复杂的处理中,一个点往往可以转载 2016-05-15 20:01:26 · 997 阅读 · 0 评论 -
Linux SWAP 深度解读
swap、swappiness及kswapd原理,swap分区优先级的妙用。真可谓一文在手,SWAP从此不再忧愁。敬请笑纳。概述本文讨论的 swap基于Linux4.4内核代码 。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文,应该可以帮你解决以下问题:转载 2016-07-01 08:06:39 · 22982 阅读 · 3 评论 -
启用伙伴算法
5.8 初始化内存管理回到start_kernel,下一个函数执行mm_init()。这个函数很重要了,来自同一个文件。 static void __init mm_init(void){ /* * page_cgroup requires countinous pages as memmap * and it's转载 2016-05-10 08:00:43 · 730 阅读 · 0 评论 -
把块存放在页高速缓存中
一、概述 Linux支持的文件系统大多以块的形式组织文件,为了减少对物理块设备的访问,在文件以块的形式调入内存后,使用块高速缓存(buffer_cache)对它们进行管理。每个缓冲区由两部分组成,第一部分称为缓冲区首部,用数据结构buffer_head表示,第二部分是真正的缓冲区内容(即所存储的数据)。由于缓冲区首部不与数据区域相连,数据区域独立存储。因而在缓冲区首部中,有一个指向数据的指转载 2016-06-02 10:42:48 · 1492 阅读 · 0 评论 -
page_address_init 函数
[start_kernel() --> page_address_init()]page_address_init() do nothing when all RAM can be mapped directly, otherwise, do following operations: // mm\highmem.c:static struct page_原创 2016-05-08 08:29:58 · 1658 阅读 · 0 评论 -
请求调页和写时复制
在刚开始看的时候感觉缺页异常(这可是异常啊,搞Java的人表示对着个比较敏感)肯定是一些进程在搞鬼,看完才发现原来是内核在搞鬼,它是故意的!!!1、请求调页 请求调页是一种动态分配内存的策略,把页面的分配推迟到不能再迟的时候(不能再迟的时候就是进程要访问的时候)。为什么要这样呢?RAM一般情况下都是很宝贵的资源,而且进程在一段的运行时间段中一般不会访问到所有的地址空间,到时发现p转载 2016-05-17 09:51:57 · 1887 阅读 · 0 评论 -
linux缺页异常处理--用户空间
用户空间的缺页异常可以分为两种情况--1.触发异常的线性地址处于用户空间的vma中,但还未分配物理页,如果访问权限OK的话内核就给进程分配相应的物理页了2.触发异常的线性地址不处于用户空间的vma中,这种情况得判断是不是因为用户进程的栈空间消耗完而触发的缺页异常,如果是的话则在用户空间对栈区域进行扩展,并且分配相应的物理页,如果不是则作为一次非法地址访问来处理,内核将终结进程转载 2016-05-15 20:05:12 · 941 阅读 · 0 评论 -
linux缺页异常处理--内核空间
缺页异常被触发通常有两种情况——1.程序设计的不当导致访问了非法的地址2.访问的地址是合法的,但是该地址还未分配物理页框下面解释一下第二种情况,这是虚拟内存管理的一个特性。尽管每个进程独立拥有3GB的可访问地址空间,但是这些资源都是内核开出的空头支票,也就是说进程手握着和自己相关的一个个虚拟内存区域(vma),但是这些虚拟内存区域并不会在创建的时候就和物理页框挂钩,由于程序转载 2016-05-15 20:04:01 · 807 阅读 · 0 评论