首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内存管理之伙伴算法

,判断当前zone是否能够进行内存分配条件是首先判断free memory是否满足low water mark水位值,如果不满足则进行一次快速内存回收操作,然后再次检测是否满足low water mark...Buddy 分配算法 在看函数前,我们先看下算法,因为我一直认为有了“道”理解才好进一步理解“术”。 ? 假设这是一段连续页框,阴影部分表示已经被使用页框,现在需要申请一个连续5个页框。...这个时候,在这段内存上不能找到连续5个空闲页框,就会去另一段内存上去寻找5个连续页框,这样子,久而久之就形成了页框浪费。...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...从上面可以知道Buddy算法一直在对页框做拆开合并拆开合并动作。Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n和组成。这也是Buddy算法管理空闲页表本质。

2.1K30

Linux内存管理

本篇介绍 本篇介绍下Linux内存管理,用系统角度看内存寻址和分配机制。 内容介绍 内存管理应该是系统中最难模块之一了,而且历史也悠久,就先来简单回顾下。...分段和分页 谈到内存管理,最先想到就是分段和分页机制。...这时候就希望有一种粒度更细机制,于是分页就呼之欲出了。分页把地址空间按照页框来管理,一般是4k,也有其他款式,总之要和物理内存页框大小匹配上。这样内存就按照页框粒度来管理就好了。...atomic_long_t vm_numa_event[NR_VM_NUMA_EVENT_ITEMS]; } ____cacheline_internodealigned_in_smp; 管理物理内存使用是伙伴算法...mmap流程如下: image.png 缺页异常 linux 是在不得不使用物理内存时候才会分配物理内存。这句话该怎么理解呢?

13.7K51
您找到你想要的搜索结果了吗?
是的
没有找到

Linux - Linux内存管理

移除交换空间 ---- 概念 内存管理Linux系统重要组成部分。...为了解决内存紧缺问题,Linux引入了虚拟内存概念。为了解决快速存取,引入了缓存机制、交换机制等。...当需要用到原始内容时,这些信息会被重新从交换空间读入物理内存Linux内存管理采取是分页存取机制。...要深入了解Linux内存运行机制,需要知道下面提到几个方面。 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多空闲物理内存。...其次,Linux进行页面交换是有条件,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用页面文件交换到虚拟内存中。

52.3K41

Linux 内存管理

cache存取速度最高,可以和CPU匹配,因此其代价最高,容量也最小。       操作系统内存管理包括物理内存管理和虚拟内存管理:       我们这篇主要介绍Linux虚拟内存管理。...物理内存管理在另外一篇:《操作系统内存管理(思维导图详解)》       1、程序进程在内存数据结构  一.Linux 进程在内存数据结构 ---- 1、存储(没有调入内存)阶段:       可以看到一个可执行程序在存储...并且提供段 内分页管理机制 .   为 Linux虚拟内存管理机制提供了支持 。        ...六.分页机制管理 ----          Linux使用分页管理机制来更加有效地利用物理内存.当创建一个进程时.仅仅把当前进程一小部分真正装入内 存.其余部分需要访问时.处理器产生一个页故障.由缺页中断服务程序根据缺页虚拟地址和出错码调用写拷贝函数...例如:32位Linux每个用户进程都可以访问4GB线性地址空间, 而实际物理内存可能远远少于4GB. 采用分页机制 ,Linux仅把可执行映像一小部分装入物理内存

7.7K10

Linux-3.14.12内存管理笔记【伙伴管理算法(1)】

前面分析了memblock算法、内核页表建立、内存管理框架构建,这些都是x86处理setup_arch()函数里面初始化,因地制宜,具有明显处理器特征。...而start_kernel()接下来初始化则是linux通用内存管理算法框架了。...build_all_zonelists()用来初始化内存分配器使用存储节点中管理区链表,是为内存管理算法(伙伴管理算法)做准备工作。...**至此,可以知道__build_all_zonelists()是内存管理框架向后续内存页面管理算法做准备,排布了内存管理区zone分配次序,同时初始化了冷热页管理。...通常只有内存足够大时才会启用该功能,否则将会提升消耗降低性能。其中pageblock_nr_pages表示伙伴系统中最高阶页块所能包含页面数。 至此,内存管理框架算法基本准备完毕。

77510

Linux-3.14.12内存管理笔记【伙伴管理算法(2)】

前面已经分析了linux内存管理算法(伙伴管理算法准备工作。...其中page_cgroup_init_flatmem()与cgroup相关,而mem_init()则是管理伙伴管理算法初始化,此外kmem_cache_init()是用于内核slub内存分配体系初始化...当前主要分析伙伴管理算法,则仅对mem_init()做专门分析,其余暂且后面再分析。...接着init_page_count()这是设置页面的_count引用计数,设置为1,用于为__free_page()释放页面到内存管理算法中做准备。...最后__free_page(),该函数既是初始化伙伴管理算法,同时也是伙伴管理算法释放页面的操作函数。暂且搁置分析__free_page()实现,后面再详细深入。

91950

Linux-3.14.12内存管理笔记【伙伴管理算法(3)】

前面分析了伙伴管理算法初始化,在切入分析代码实现之前,例行先分析一下其实现原理。...伙伴管理算法(也称之为Buddy算法),该算法将所有空闲页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义: 【file:/include/linux/mmzone.h】...假设连续物理内存,各页面块左右页面,要么是等同大小,要么就是整数倍,而且还是偶数,形同伙伴。 其管理起来如图: ?...伙伴管理算法释放过程是,满足条件两个页面块称之为伙伴:两个页面块大小相同且两者物理地址连续。...而伙伴管理算法申请过程则相反,如果申请指定大小页面在其页面块链表中不存在,则会往高阶页面块链表进行查找,如果依旧没找到,则继续往高阶进行查找,直到找到为止,否则就是申请失败了。

97520

Linux 内存分页管理

内存是计算机主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。我将从内存物理特性出发,深入到内存管理细节,特别是了解虚拟内存内存分页概念。 内存 简单地说,内存就是一个数据货架。...因此,Linux采用了分页(paging)方式来记录对应关系。所谓分页,就是以更大尺寸单位页(page)来管理内存。在Linux中,通常每页大小为4KB。...这种对应关系让上层抽象内存和下层物理内存分离,从而让Linux能灵活地进行内存管理。由于每个进程会有一套虚拟内存地址,那么每个进程都会有一个分页表。为了保证查询速度,分页表也会保存在内存中。...因此,Linux分页表,采用了多层数据结构。多层分页表能够减少所需空间。 我们来看一个简化分页设计,用以说明Linux多层分页表。...最新Linux系统中分页表多达3层,管理内存地址也比本章介绍长很多。不过,多层分页表基本原理都是相同。 综上,我们了解了内存以页为单位管理方式。

1.1K30

Linux-3.14.12内存管理笔记【伙伴管理算法(4)】

此处承接前面未深入分析页面释放部分,主要详细分析伙伴管理算法中页面释放实现。页面释放函数入口是__free_page(),其实则是一个宏定义。...其中order表示页面数量,如果释放是单页,则会调用free_hot_cold_page()将页面释放至per-cpu page缓存中,而不是伙伴管理算法;真正释放至伙伴管理算法是__free_pages_ok...>batch); free_pcppages_bulk(zone, batch, pcp); pcp->count -= batch; } 其中pcp表示内存管理每...其中if (pcp->count >= pcp->high)判断值得注意,其用于如果释放页面超过了每CPU缓存最大页面数时,则将其批量释放至伙伴管理算法中,其中批量数为pcp->batch。...最后判断当前合并页面是否为最大阶,否则将页面放至伙伴管理链表末尾,避免其过早被分配,得以机会进一步与高阶页面进行合并。末了,将最后挂入空闲计数加1。 至此伙伴管理算法页面释放完毕。

1K30

Linux内核内存管理算法Buddy和Slab

有了前两节学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到内存管理都是对page管理,接下来我们看一下用来管理page经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...从上面可以知道Buddy算法一直在对页框做拆开合并拆开合并动作。Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n和组成。这也是Buddy算法管理空闲页表本质。...而当驱动需要使用时,就将进程占用内存通过回收或者迁移方式将之前占用预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。...总结 从内存DDR分为不同ZONE,到CPU访问Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理,我们应该可以从感官角度理解了下图: ?

2K30

Linux内存分页管理

我将从内存物理特性出发,深入到内存管理细节,特别是了解虚拟内存内存分页概念。 内存 简单地说,内存就是一个数据货架。内存有一个最小存储单位,大多数都是一个字节。...因此,Linux采用了分页(paging)方式来记录对应关系。所谓分页,就是以更大尺寸单位页(page)来管理内存。在Linux中,通常每页大小为4KB。...这种对应关系让上层抽象内存和下层物理内存分离,从而让Linux能灵活地进行内存管理。由于每个进程会有一套虚拟内存地址,那么每个进程都会有一个分页表。为了保证查询速度,分页表也会保存在内存中。...因此,Linux分页表,采用了多层数据结构。多层分页表能够减少所需空间。 我们来看一个简化分页设计,用以说明Linux多层分页表。...最新Linux系统中分页表多达3层,管理内存地址也比本章介绍长很多。不过,多层分页表基本原理都是相同。 综上,我们了解了内存以页为单位管理方式。

1.3K20

Linux内存分页管理

内存是计算机主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。我将从内存物理特性出发,深入到内存管理细节,特别是了解虚拟内存内存分页概念。 内存 简单地说,内存就是一个数据货架。...因此,Linux采用了分页(paging)方式来记录对应关系。所谓分页,就是以更大尺寸单位页(page)来管理内存。在Linux中,通常每页大小为4KB。...这种对应关系让上层抽象内存和下层物理内存分离,从而让Linux能灵活地进行内存管理。由于每个进程会有一套虚拟内存地址,那么每个进程都会有一个分页表。为了保证查询速度,分页表也会保存在内存中。...因此,Linux分页表,采用了多层数据结构。多层分页表能够减少所需空间。 我们来看一个简化分页设计,用以说明Linux多层分页表。...最新Linux系统中分页表多达3层,管理内存地址也比本章介绍长很多。不过,多层分页表基本原理都是相同。 综上,我们了解了内存以页为单位管理方式。

1.4K10

Linux内核内存管理算法Buddy和Slab

有了前两节学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到内存管理都是对page管理,接下来我们看一下用来管理page经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...从上面可以知道Buddy算法一直在对页框做拆开合并拆开合并动作。Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n和组成。这也是Buddy算法管理空闲页表本质。...而当驱动需要使用时,就将进程占用内存通过回收或者迁移方式将之前占用预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。...总结 从内存DDR分为不同ZONE,到CPU访问Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理,我们应该可以从感官角度理解了下图: ?

3.5K73

Android内存管理(四)Linux内存管理机制

linux内存管理卷帙浩繁,本文只能层层递进地带你领略冰山轮廓,通过本文你将了解到以下内容: 为什么需要管理内存 linux段页管理机制 内存碎片产生机理 为什么需要管理内存 老子著名观点是无为而治...在linux系统中如果以一种原始简单方式管理内存是存在一些问题,我们来看几个场景。...物理内存内存碎片 ---- 前面说段页管理机制算是虚拟空间部分,然而linux内存管理另外一个重要部分就是物理内存管理了,也就是如何分配和回收物理内存,这就涉及到一些内存分配算法和分配器。...无论是时间还是内存被碎片化之后都无法被有效利用,因此合理管理减少碎片对我们来说是至关重要,这也是物理内存分配算法和分配器研究重点。...而进行这种交换所遵循依据是“LRU”算法(Least Recently Used,最近最少使用算法)。

2.6K10

Linux 内存管理初探

本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法linux 内核几种内存管理方法,内存使用场景以及内存使用那些坑。...从内存原理和结构,到内存算法优化,再到使用场景,去探寻内存管理机制和奥秘。 一、走进 linux 内存 1、内存是什么?...二、 linux 内存地址空间 1、linux 内存地址空间 Linux 内存管理全貌 ?...三、 Linux 内存分配算法 内存管理算法——对讨厌自己管理内存的人来说是天赐礼物 1、内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配这些小内存生存周期又较长,反复申请后将产生内存碎片出现...尽量一次性申请较大内存,而不要反复申请小内存 尽可能申请大块 2 指数幂大小内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法

5K51

Linux内存描述之高端内存--Linux内存管理(五)

但是,当Linux物理内存超过1G时,线性访问机制就不够用了,因为只能有1G内存可以被映射,剩余物理内存无法被内核管理,所以,为了解决这一问题,Linux把内核地址分为线性区和非线性区两部分,线性区规定最大为...当物理内存大于1G时候, 内核是不能完全用低端内存管理全部物理内存, 所以低端内存剩下部分就是高端内存了, 高端内存没有直接映射, 是动态映射到内核空间....4 页框管理 4.1 页框管理 Linux采用4KB页框大小作为标准内存分配单元。...每个管理区又有自己描述符,描述了该管理区空闲页框,保留页数目等。每个页描述符都有到内存节点和到节点管理连接(被放在flag高位字段)。...内核调用一个内存分配函数时,必须指明请求页框所在管理区,内核通常指明它愿意使用哪个管理区。 4.2 保留页框池 如果有足够空闲内存可用、请求就会被立刻满足。

12.3K23

Linux-3.14.12内存管理笔记【伙伴管理算法(5)】-核心算法实现

前面已经分析了伙伴管理算法释放实现,接着分析一下伙伴管理算法内存申请实现。...伙伴管理算法内存申请和释放入口一样,其实并没有很清楚界限表示这个函数是入口,而那个不是,所以例行从稍微偏上一点地方作为入口分析。...这部分功能实现将在后面详细分析,当前主要聚焦在伙伴管理算法实现。...较正常伙伴算法不同,其向迁移类型内存申请内存页面时,是从最高阶开始查找,主要是从大块内存中申请可以避免更少碎片。...如果尝试完所有的手段仍无法获得内存页面,则会从MIGRATE_RESERVE列表中获取。这部分暂不深入,后面再详细分析。 毕了,至此伙伴管理算法分配部分暂时分析完毕。

1K20

Linux内存管理:memblock

内存管理是操作系统内核中最复杂部分之一, start_kernel函数在内核启动第一个init进程前初始化了所有的内核特性(包括那些依赖于不同架构特性),你也许还记得引导时创立临时页表,但复杂内存管理部分还没有开始...,当start_kernel函数被调用时,我们会看到初期内存管理到更复杂内存管理数据结构和技术转变,为了更好理解内核初始化过程,我们需要对这些技术有更清晰理解,今天我们会着重讨论这个过程,主要针对初期内存管理...,也不参与内存分配,称之为静态内存; GPU/camera/多核共享内存都需要预留大量连续内存,这部分内存平时不使用,但是必须为各个应用场景预留,这样内存称之为预留内存内存其余部分,是需要内核管理内存...memblock是什么 memblock介绍 memblock即linux启动后kernel管理内存空间抽象出来结构,此时buddy系统和slab分配器等并没有初始化,当需要执行一些内存管理内存分配任务...,此时就是有初期管理模块memblock机制。

1.8K20
领券