Buddy 分配算法 在看函数前,我们先看下算法,因为我一直认为有了“道”的理解才好进一步理解“术”。 ? 假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。...这个时候,在这段内存上不能找到连续的5个空闲的页框,就会去另一段内存上去寻找5个连续的页框,这样子,久而久之就形成了页框的浪费。...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍,如图: ?...从上面可以知道Buddy算法一直在对页框做拆开合并拆开合并的动作。Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n的和组成。这也是Buddy算法管理空闲页表的本质。
如下图所示: 但内存资源是有限的,随着系统中运行的进程越来越多,系统中可用的内存就会越来越少。那么,当可用内存不足时,Linux 内核是怎么处理的呢?...本文将会介绍,当可用内存不足时,Linux 内核的处理方式。 一、内存不足的处理方式 我们思考一下,当系统的可用内存不足时,进程继续申请内存会发生什么事情?...这样只会增加系统的负荷,并且不能解决系统内存不足的问题。 为了解决这个问题,Linux 内核引入了 LRU内存淘汰算法,用过 Memcached 或者 Redis 的同学应该都了解过 LRU算法。...当系统内存不足时,Memcached 和 Redis 都是使用 LRU算法 来淘汰内存的。...LRU算法状态流转 我们最后以一张状态流转图来描述 LRU 算法的过程: 三、总结 本文主要介绍了 Linux 内核内存回收过程中使用的 LRU 算法的原理,在下一篇文章中,我们将会介绍 Linux
. # # Out of Memory Error (os_linux.cpp:2627), pid=2084, tid=0x00007f89ff5d7700 # 部分二: Memory: 4k page...16333788k(136664k free), swap 0k(0k free) vm_info: Java HotSpot(TM) 64-Bit Server VM (25.112-b15) for linux-amd64...解决办法: 先升级Confluence所在机器的物理内存。...,可以略微调大一点 第三步: 启动Nginx 和 Confluence 服务,如果服务正常,就可以使用了 检验方式可以在Confluence的后台【一般配置】系统信息里的Java 栈堆 看到内存扩展后的数据...也可以ps aux | grep java 提醒: 内存不足可能会引发Confluence一系列的问题,建议有问题,先排查内存问题
gcd算法: 通过辗转相除求最大公约数 #include int gcd(int a,int b){ return a%b==0?...b:gcd(b,a%b); } int main(){ printf("%d",gcd(15,18)); return 0; } 扩展gcd算法: 对于不完全为 0 的非负整数 a,b,...by1 =bx2+a%by2 =bx2+(a-a/b*b)y2 =ay2+(x2-a/b*y2)b 所以x1=y2,y1=x2-a/b*y2 且if(b==0)不定方程 的一组解为x=1,y=0 因此扩展
为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...从上面可以知道Buddy算法一直在对页框做拆开合并拆开合并的动作。Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n的和组成。这也是Buddy算法管理空闲页表的本质。...CMA 细心的读者或许会发现当Buddy算法对内存拆拆合合的过程中会造成碎片化的现象,以至于内存后来没有了大块的连续内存,全是小块内存。...而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。...总结 从内存DDR分为不同的ZONE,到CPU访问的Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理,我们应该可以从感官的角度理解了下图: ?
网上学习了一番,其实这种计算方法不很准确,原因就是Linux的内存管理机制和Windows是不相同的,我理解Linux管理内存的特点,其中之一就是充分利用内存,网上这方面的资料,非常容易检索,我就不班门弄斧了...从MOS上看见了一些文章,直接或间接说明了这个问题, (1) Memory Not Being Released In Linux Top After The MDEX Engine Is Shut Down...(2) 使用第三方库psutil psutil是一个跨平台的进程管理,首先需要安装,psutil安装之前需要安装python-devel,均需要root用户,我的操作系统是Linux 6.5,Python...在Linux,windows,OSX,freebsdSun Solaris等系统上工作,最新的版本python是要高于2.6(Python 2.4 Python2.5 可以用2.1.3版本) 总结: 1...Linux下实际我们关注的是,系统可用内存的占用率,计算方法为(used-buffers-cached)/total*100%,并不是执行free指令中free显示的部分。 2.
普通文件的初始权限为 666(没有x) ,目录的初始权限 为777(rwx)
但是,当Linux物理内存超过1G时,线性访问机制就不够用了,因为只能有1G的内存可以被映射,剩余的物理内存无法被内核管理,所以,为了解决这一问题,Linux把内核地址分为线性区和非线性区两部分,线性区规定最大为...DMA Zone通常很小,只有几十M,低端内存区与高端内存区的划分来源于Linux内核空间大小的限制。...因此,Linux 规定“内核直接映射空间” 最多映射 896M 物理内存。...1G) 2.3 Linux内核高端内存的理解 前 面我们解释了高端内存的由来。...4 页框管理 4.1 页框管理 Linux采用4KB页框大小作为标准的内存分配单元。
方法来自酷安(我也不知道谁,笑哭) 截图 📷 理论上适用其他21.7.21或之后的版本的机型,需要手机内核支持 下载 链接:https://pan.ba...
文章目录 一、bootmem 引导内存分配器算法 1、低端内存映射 2、内存记录位图 3、最先适配算法 4、内存分配记录 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem...| free_bootmem ) 一、bootmem 引导内存分配器算法 ---- bootmem 引导内存分配器算法 ; 1、低端内存映射 低端内存映射 : 内核启动过程中 , 将 " 低端内存 "...交给 " 引导内存分配器 " 管理 , 低端内存 可以 直接映射到 内核虚拟地址空间 对应的 物理内存 ; 2、内存记录位图 内存记录位图 : 引导内存分配器 中 , 使用 " 位图 " 记录 物理页...的分配情况 , 如果物理页 分配 , 在 位图中物理页对应的为 置 1 ; 如果物理页 回收 , 在 位图中物理页对应的为 置 0 ; 3、最先适配算法 最先适配算法 : 分配内存时 , 扫描..." 位图 " , 找到 满足 内存需求大小 的 第一块 空闲的内存块 ; 4、内存分配记录 内存分配记录 : 为了有效利用内存 , " 引导内存分配器 " 支持小于 1 页的内存块分配 , bootmem_data
扩展欧几里德算法 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?...那么什么是扩展欧几里德呢? ...这里: x = y1 y = x1 – a/b*y1 以上就是扩展欧几里德算法的全部过程,依然用递归写: ? ...这就是理论部分,欧几里德算法部分我们好像只能用来求解最大公约数,但是扩展欧几里德算法就不同了,我们既可以求出最大公约数,还可以顺带求解出使得: a*x + b*y = gcd 的通解 x 和 y ...扩展欧几里德有什么用处呢?
扩展欧几里得算法 用途 当我们已知a,b 扩展欧几里得算法可以求出满足 解集 表示a,b的最大公约数 前导知识 推导过程 其实扩展欧几里得的推导过程挺自然的...return a; } int r=exgcd(b,a%b,x,y),tmp; tmp=x,x=y,y=tmp-a/b*y; return r; } 应用 1 扩展欧几里得最重要的应用就是求形如...首先,这个方程能够能力的条件是 ,这个应该比较显然 根据前面将的扩展欧几里得算法 我们可以先求出 的解 然后方程两边同时除以 就得到 的解 再在方程两边同乘c 就得到了方程
移除交换空间 ---- 概念 内存管理是Linux系统重要的组成部分。...为了解决内存紧缺的问题,Linux引入了虚拟内存的概念。为了解决快速存取,引入了缓存机制、交换机制等。...作为物理内存的扩展,Linux会在物理内存不足时,使用交换分区的虚拟内存。更详细地说,就是内核会将暂时不用的内存块信息写到交换空间,这样,物理内存得到了释放,这块内存就可以用于其他目的。...要深入了解Linux内存运行机制,需要知道下面提到的几个方面。 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。...其次,Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。
业余时间写的玩具操作系统,准备把内存管理部分加强一下,伙伴系统分配页面算法已经完成,下面就要开始写更加细粒度的内存分配,毕竟伙伴系统是按照页为基本单位分配的,参考内核版本linux2.6.30,没分析高版本的源码...,算法基本思想应该差不多。 ...slab算法是一个高效的内存分配算法,它通过把经常使用的内存块比如32字节,64字节大小或者某个常用结构体大小的类型组织成一个kmem_cache结构,经常分配和释放的内存会保存在一个array_cache...数组里,这样对频繁分配和释放的内存,分配和回收效率都是O(1)。...names++; } /* 4) Replace the bootstrap head arrays */ //替换cache_cache的array_cache成员,使用slab管理的空闲内存替换全局内存区
欧几里得算法 欧几里得算法是用来求最大公约数的,gcd(a,b)=gcd(b, a%b),如此递归下去,直到a%b==0,然后返回。...最终,gcd(a,b)=gcd(c,0),其中,a,b的最大公约数就是c 扩展欧几里得算法(exgcd) 扩展欧几里得算法是解决诸如:求整数x和y使得ax+by=gcd(a,b)的问题的。
image.png 要进行新建扩展分区的磁盘是 /dev/sda # fdisk /dev/sda # p 打印分区表 ?...image.png 此时磁盘已经有了3个分区,如果要再弄2个分区就不行,这个时候我们进行新建扩展分区 # n 添加一个新的分区 # e 添加一个扩展分区 # p 打印分区表 ?...image.png 此时已经看见扩展分区创建完成,在扩展分区下面新建2个分区 因为现在扩展分区是20G 所以下面的2个分区都给10G # n # +10G # p ? image.png ?
扩展Linux网络栈 来自Linux内核文档。之前看过这篇文章,一直好奇,问什么一条网络流会固定在一个CPU上进行处理,本文档可以解决这个疑问。为了更好地理解本文章中的功能,将这篇文章穿插入内。...简介 本文的描述了Linux网络栈中的一组补充技术,用于增加多处理器系统的并行性和提高性能。...RSS和其他扩展技术的目的是提升性能。多队列分发技术也可以按照优先级处理流量,但这不是该技术关注的内容。...一个典型的RSS配置应该给每个CPU分配一个接收队列(如果驱动支持足够多队列的话),或至少给每个内存域分配一个接收队列(内存域指共享一个特定内存级别(L1, L2, NUMA 节点等)的一组CPUs)。...参考: Queues, RSS, interrupts and cores Linux Network Scaling: Receiving Packets Linux 网络协议栈收消息过程-Per CPU
CPU访问本地内存的速度比访问远程内存的速度要快 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大....因此linux内核需要用一种体系结构无关的方式来表示内存....因此linux内核把物理内存按照CPU节点划分为不同的node, 每个node作为某个cpu结点的本地内存, 而作为其他CPU节点的远程内存, 而UMA结构下, 则任务系统中只存在一个内存node, 这样对于...系统中的NUMA结点都是从0开始编号的 3.1 linux-2.4中的实现 pgdat_next指针域和pgdat_list内存结点链表 而对于NUMA结构的系统中, 在linux-2.4.x之前的内核中所有的节点...-3.x~4.x的实现 node_data内存节点数组 在新的linux3.x~linux4.x的内核中,内核移除了pg_data_t的pgdat_next之指针域, 同时也删除了pgdat_list链表
1 Linux如何描述物理内存 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点(node), 内存则被分簇, 每个CPU对应一个本地物理内存, 即一个...内存中的每个节点都是由pg_data_t描述,而pg_data_t由struct pglist_data定义而来, 该数据结构定义在include/linux/mmzone.h, line 615, 每个结点关联到系统中的一个处理器...简单来说, 页是一个数据块, 可以存放在任何页框(内存中)或者磁盘(被交换至交换分区)中 我们今天就来详细讲解一下linux下物理页帧的描述 2 页帧 内核把物理页作为内存管理的基本单位....指的是在1M空间内的偏移,而不是在整个文件内的偏移 private 私有数据指针,由应用场景确定其具体的含义 lru 链表头,用于在各种链表上维护该页, 以便于按页将不同类别分组, 主要有3个用途: 伙伴算法...3.2 内存页标识pageflags 其中最后一个flag用于标识page的状态, 这些状态由枚举常量enum pageflags定义, 定义在include/linux/page-flags.h?
领取专属 10元无门槛券
手把手带您无忧上云