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

Linux内存分配策略

伙伴系统分配算法 在上一节, 我们介绍了Linux内核怎么管理系统中物理内存....但有时候内核需要分配一些物理内存地址也连续内存, 所以Linux使用了 伙伴系统分配算法 来管理系统中物理内存....上一节说过, 内核使用 alloc_pages() 函数来分配内存, 而 alloc_pages() 函数最后会调用 rmqueue() 函数来分配内存, rmqueue() 函数原型如下: static...在Linux内核中, 把两个物理地址相邻内存当作成伙伴, 因为Linux是以页面号来管理内存, 所以就是说两个相邻页面号页面是伙伴关系....所以, 使用伙伴系统算法只能分配 2order (order为0,1,2,3...)个页面. 那么order是不是无限大呢? 当然不是, 在Linux内核中, order最大值是 10.

3.2K10

linux内核冷热分配

先说说cpucache,和cpucache比起来访问主内存是非常慢,为了加快速度根据本地性原则,cpu在访问主内存时候会把附近一块数据都加载到cpucache里,之后读写这块数据都是在cache...linux本来有伙伴系统分配内存,为了加快单个内存分配linux在每个node里为每个cpu分配了一个per_cpu_pageset(暂且叫他缓存吧)。...这主要是因为内核用free_pages释放单个内存时候会调用free_hot_page。...刚释放内存大概率还在cpucache里,也就是说热缓存里很可能还在cpucache里,所以申请热缓存并且立即使用会直接访问cpucache速度会比较快。...其他情况就用冷缓存,冷缓存里在主内存里,需要重新加载到cpucache,速度会慢一些。

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

Linux分区分配

我们现在知道物理内存是以框为最小单位存在,那么内核中分配页框方法是什么呢?...分区分配分配在内核里机制我们叫做分区分配器(zoned page frame allocator),在linux系统中,分区分配器管理着所有物理内存,无论你是内核还是进程,都需要请求分区分配器...,这时才会分配给你应该获得物理内存框。...有时候目标管理区不一定有足够框去满足分配,这时候系统会从另外两个管理区中获取要求框,但这是按照一定规则去执行,如下: 如果要求从DMA区中获取,就只能从ZONE_DMA区中获取。...其函数接口 内核中根据不同分配需求有6个函数接口来请求框,最终都会调用到__alloc_pages_nodemask。 ?

1.4K30

Linux分区分配器之水位

我们讲分配时候讲到了快速分配和慢速分配,其中伙伴算法是在快速分配里做,忘记小伙伴我们再看下: static struct page * get_page_from_freelist(gfp_t...我们知道在内存分配时,只有low和min之间区域才是kswapd活动区域。而linux中默认low与min之间值又比较小,所以就很容易造成direct reclaim情况。...「extra_free_kbytes」: 源于此,安卓在linux水位基础上增加了extra_free_kbytes变量,这个extra时额外加在low和min之间,它在min不变情况下,让low...「watermark_scale_factor」: 内核总是在进步,在linux内核4.6版本中,又诞生了一种新调节水位方式,即watermark_scale_factor系数,其默认值是10,对应内存占比...至此,分配器中快速分配方式已经结束,下一篇让我们进入分配慢速分配方式:__alloc_pages_slowpath,涉及到内存碎片整理和内存回收。

1.2K30

Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中内存管理模块 | 分配器 | 不连续分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 缓存 | 高速缓存 )

文章目录 一、Linux 内核中内存管理模块 二、硬件设备内存管理 一、Linux 内核中内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 错误异常处理 ② 管理 ③ 引导内存分配器...: 分配器 , 块分配器 , 不连续分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 分配器 " 负责分配 内存物理 , 使用是 " 伙伴分配器 " ; " 不连续分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请 " 不连续物理 “ 可以 映射到 ” 连续虚拟 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...: 控制管理 被 进程 占用 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理 , 需要通过 整理内存碎片 并迁移数据 得到 连续 物理 ; 内存回收 : 内存不足时 ,..." ( MMU ) 中 , 还有一个 " 缓存 " ; 缓存 中缓存了 最近使用 " 映射 “ , 该映射作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

1.4K40

Linux从头学16:操作系统-如何把【目录和】当做普通物理进行操作

如果你看过 Linux 内核相关书籍,一定对下面这张图又熟悉、又恐惧: 这是 Linux 系统中,处理单元多级查询方式。...这篇文章,我们继续通过图片+实例方式,一起来研究一下内核代码一般都是如何来进行这些“自操作”。 把这里面的操作机制研究透彻之后,再去看 Linux 内核代码时,就不会晕头转向了。...; 操作系统读取程序结束后,为所有的地址构造好了目录和; 如下图所示: 目录和每一个有效表项中,存储地址都是一个个实实在在物理前 20 位(因为一个物理长度固定是 4KB,在分配时都是对齐...例如本文开头第一张图中,Linux 使用了4级表格来查找,并且中间两个表格还可以省略不用。 如何跨过中间这两个表格,Linux 内核代码中代码更复杂一些,但是策略都是一样。...对进行寻址 既然已经弄明白了操作系统是如何操作目录,那么对操作就不是什么大问题了。

1.5K20

Linux分配器之内存碎片化整理

分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下: static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned...什么是内存碎片化 Linux物理内存碎片化包括两种:内部碎片化和外部碎片化。 内部碎片化: 指分配给用户内存空间中未被使用部分。...例如进程需要使用3K bytes物理内存,于是向系统申请了大小等于3Kbytes内存,但是由于Linux内核伙伴系统算法最小颗粒是4K bytes,所以分配是4Kbytes内存,那么其中1K bytes...碎片化整理算法 Linux内存对碎片化整理算法主要应用了内核页面迁移机制,是一种将可移动页面进行迁移后腾出连续物理内存方法。 假设存在一个非常小内存域如下: ?...蓝色表示空闲页面,白色表示已经被分配页面,可以看到如上内存域空闲页面(蓝色)非常零散,无法分配大于两连续物理内存。

2.6K20

Mysql分库,你如何,怎样

分区目的就是减少数据库负担,提高数据库效率,通常点来讲就是提高增删改查效率。 什么是?...2.和分区不矛盾,可以相互配合,对于那些大访问量,并且数据比较多,我们可以采取和分区结合方式(如果merge这种方式,不能和分区配合的话,可以用其他试),访问量不大,但是数据很多...1.之前,首先要选中合适策略(以哪个字典为表字段,需要将数据分为多少张),使数据能够均衡分布在多张中,并且不影响正常查询。...在确定策略后,当数据进行存储及查询时,需要确定到哪张表里去查找数据, 数据存放数据 = 表字段内容 % 数量 2.分库 能够解决单数据量过大带来查询效率下降问题...,但是不能给数据库并发访问带来质提升,面对高并发写访问,当Master无法承担高并发写入请求时,不管如何扩展Slave服务器,都没有意义了。

1.9K20

Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 块、阶 | 伙伴 )

文章目录 一、伙伴分配器引入 二、块、阶 三、伙伴 一、伙伴分配器引入 ---- Linux 内核 初始化 完成之后 , 就会 丢弃 引导内存分配器 , 如 : bootmem 分配器 , memblock...分配器 ; 此时 , 使用 " 分配器 “ 管理 ” 物理 " , " 伙伴分配器 “ 就是 ” 分配器 " , 其特点是 算法简单 , 性能高效 ; 二、块、阶 ---- 伙伴分配器 有如下概念...: 块 ( Page Block ) : 英文名称 Page Block , 指的是 连续 " 物理 " ; 阶 ( Order ) : 物理 数量单位 , n 阶块 指的是 2^...n 个 连续 " 物理 " ; 如 : 0 阶块是 2^0 = 1 个 连续 " 物理 " ; 1 阶块是 2^1 = 2 个 连续 " 物理 " ; 2 阶块是 2...1 个物理 页号 是 2^n 整数倍 ; ③ 合并块 : 如果需要合并这两个 n 阶块为 n + 1 阶块 , 则第 1 物理 页号必须是 2^{n + 1}

94420

Linux内核管理-那些鲜为人知秘密

,而管理是在虚拟内存管理中尤为重要,本文主要以回答几个管理中关键性问题来解析Linux内核管理,看一看管理中那些鲜为人知秘密。...2)使用多级结构优劣: 优势: 1.节省内存 2.可以按需分配各级 3.可以离散存储 劣势: 需要遍历多级,需要多次访问内存,实现复杂度高点 3)Linux内核综合考虑: 典型以时间换空间...1)应用程序 访问虚拟内存即可如执行指令、读写内存, 没有权限管理 不管虚拟内存如何转换为物理内存,对应用来说透明。...2)Linux内核 填写,将基地址告诉mmu 内核初始化建立内核,实现缺页异常等机制为用户任务按需分配并映射。 当然,内核也可以遍历,如缺页异常时遍历进程。 10....>pgd 用户进程fork时候分配私有的pgd,用于保存pgd表项(仅仅分配了第一级)。

1.7K21

多级好处

,如果只使用了一个,一个表项大小为4byte,32位系统有4GB物理空间(一个进程看到是4GB大小虚拟空间),每一个表项对应着物理空间第xxx(4KB大小),那么应该有4GB/4KB=...如果是二级,规则就会改变,让二级对应到物理内存上4KB大小,一级此时变成映射为物理地址4MB(这样子是无法定位到具体(4KB),所以二级再去找),这样先找到一级,一级再和二级进行结合...,二级表相当于一级4MB分成了1024个(1KB个)4KB,找完后二级充当了offset角色,此时定位到具体4KB页面,再用一级offset一结合定位到具体物理地址。...这样一个进程浪费掉空间是一级占用:(4GB/4MB)*4byte=4KB,二级浪费掉是1kb(1个一级占用这么多)*1kb(此时有1kb(4GB/4MB)个一级)=4MB,加起来是...4MB+4KB,比光用一级要多4KB,但是2级是可以不存在,比如此时程序只用了%20,那么4MB就需要乘以%20,这样一下子就比只有一级时少了。

1.6K30

数据库是如何分库,如何

垂直是基于数据库中"列"进行,某个表字段较多,可以新建一张扩展,将不经常用或字段长度较大字段拆分出去到扩展中。...在字段很多情况下(例如一个大有100多个字段),通过"大拆小",更便于开发与维护,也能避免跨问题,MySQL底层是通过数据存储,一条记录占用空间过大会导致跨,造成额外性能开销。...水平切分分为库内分和分库,是根据内数据内在逻辑关系,将同一个按不同条件分散到多个数据库或多个中,每个中只包含一部分数据,从而使得单个数据量变小,达到分布式效果。...这样好处是:毫秒数在高位,生成ID整体上按时间趋势递增;不依赖第三方系统,稳定性和效率较高,理论上QPS约为409.6w/s(1000*2^12),并且整个分布式系统内不会产生ID碰撞;可根据自身业务灵活分配...不到万不得已不用轻易使用分库这个大招,避免"过度设计"和"过早优化"。分库之前,不要为,先尽力去做力所能及事情,例如:升级硬件、升级网络、读写分离、索引优化等等。

83310

SAP RETAIL分配查询报表

SAP RETAIL分配查询报表 SAP零售系统针对分配,也提供了报表查询功能。本文就SAP提供2个常用分配查询报表做一个简单说明。...输入分配编号(这个字段居然弄成了必输字段,感觉不太科学,不太合理)。 输入采购组织,采购组,物料号,供应商,分配Type等参数。...执行,得到如下报表结果, 报表上半部分显示分配header等信息,下半部分显示具体item信息, 2, 事务代码 WA30 - Allocation table for objects 执行事务代码...在结果界面里还可以点击按钮‘Change allocation table’去修改某个分配。...比如鼠标点一下分配1,然后点击这个按钮,就能进入分配1修改界面,如下图: 可以发现事务代码WA30不仅仅只是报表查询功能。 -完- 写于2011-11-09。

41800

MySQL分库浅谈一、分库类型二、分库查询三、分库问题四、分库策略

一、分库类型 1、单库单 所有数据都放在一个库,一张。 2、单库多表 数据在一个库,单水平切分多张。 3、多库多表 数据库水平切分,也水平切分。...二、分库查询 通过分库规则查找到对应和库过程: 如分库规则是acc_id mod 4方式,当用户新注册了一个账号,账号id123,我们可以通过acc_id mod 4方式确定此账号应该保存到...Acc_0003中。...当用户123登录时候,我们通过123 mod 4后确定记录在Acc_0003中。 三、分库问题 分库需要按不同维度记录数据,否则无法满足业务场景不同维度查询。...四、分库策略 1、按时间; 2、主表和详细信息; 3、按数据区间; 4、取模映射; 5、一致性Hash; 6、二叉树

3.9K50

高端内存映射之vmalloc分配内存中不连续--Linux内存管理(十九)

在用户空间中这不是问题,因为普通进程设计为使用处理器分页机制, 当然这会降低速度并占用TLB. 在内核中也可以使用同样技术. 内核分配了其内核虚拟地址空间一部, 用于建立连续映射....这一段具有线性地址空间所有性质. 分配到其中可能位于物理内存中任何地方. 通过修改负责该区域内核, 即可做到这一点. ? ?...接下来从物理内存分配各个 最后将这些连续地映射到vmalloc区域中, 分配虚拟内存工作就完成了...._32分配区域,而vunmap用于释放由vmap或ioremap创建映射。...unmap_vm_area使用找到vm_area实例,从删除不再需要项。与分配内存时类似,该函 数需要操作各级,但这一次需要删除涉及项。它还会更新CPU高速缓存。

2.9K10

如何优雅地玩转分库

垂直 垂直在日常开发和设计中比较常见,通俗说法叫做“大拆小”,拆分是基于关系型数据库中“列”(字段)进行。...某种意义上也能避免“跨问题(MySQL、MSSQL底层都是通过“数据”来存储,“跨”问题可能会造成额外性能开销,这里不展开,感兴趣朋友可以自行查阅相关资料进行研究)。...水平分库 水平分库与上面讲到水平分思想相同,唯一不同就是将这些拆分出来保存在不同数据中。这也是很多大型互联网公司所选择做法。如下图: ?...同时,这也会带来一些复杂技术问题和挑战(例如:跨分片复杂查询,跨分片事务等) 分库难点 垂直分库带来问题和解决思路: 跨库join问题 在拆分之前,系统中很多列表和详情所需数据是可以通过...有些库和原本是可以合并,却单独保存着。还有些,看起来放在A库中也OK,放在B库中也合理。 如何设计和权衡,这个就看实际情况和架构师/开发人员水平了。 3.

70620
领券