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

Linux内存分配策略

伙伴系统分配算法 在上一节, 我们介绍了Linux内核怎么管理系统中的物理内存....但有时候内核需要分配一些物理内存地址也连续的内存, 所以Linux使用了 伙伴系统分配算法 来管理系统中的物理内存....在Linux内核中, 把两个物理地址相邻的内存当作成伙伴, 因为Linux是以页面号来管理内存的, 所以就是说两个相邻页面号的页面是伙伴关系....那么给定一个 i 号内存, 怎么找到他的伙伴内存呢? 通过观察我们可以发现, 如果页面号是复数的, 那么他的伙伴内存要加1, 如果页面号是单数的, 那么他的伙伴内存要减1....Linux内核使用 free_area[i] 管理 2i 个内存页面大小的内存块列表.

3.2K10

Linux申请大内存(mmap)

---- 1.为什么要使用大内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级表和分页进行管理,操作系统每个默认大小为4KB。...如果进程使用的内存过大,比如1GB,这样会在表中占用 1GB / 4KB = 262144个表项,而系统TLB可以容纳的表项远小于这个数量。...---- 2.怎样使用大内存 2.1 先预留一定量的大内存 #先查看系统有多少已经预留的大内存 # cat /proc/meminfo |grep -i huge #预留192个大 # sysctl...\n"); getchar(); munmap(m, s); return 0; } ---- 3.最后的话 大内存的好处不仅是减少TLB未命中次数,而且大内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上...,因此不会出现缺页中断,也就不会引入访问磁盘的时延,另外,大内存在物理上是连续的,对于大内存访问也有一定的加速效果。

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

Linux 内核 内存管理】物理释放 ( 物理释放 __free_pages 函数 )

文章目录 一、物理释放 __free_pages 函数 一、物理释放 __free_pages 函数 ---- 分配器 提供了 释放 物理的 函数 __free_pages , 该函数定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#4083 位置 ; __free_pages 函数参数分析 : struct page *page 参数 表示 要释放的 物理 page...的 虚拟空间地址 ; unsigned int order 参数 表示 要释放的 物理 的 " 阶数 " , 也就是 要释放的物理大小 ; 阶 ( Order ) : 物理 的 数量单位 ,...n 阶块 指的是 2^n 个 连续的 " 物理 " ; 参考 【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 块、阶 | 伙伴 ) __free_pages 函数源码...order == 0) free_hot_cold_page(page, false); else __free_pages_ok(page, order); } } 源码路径 : linux

12.6K20

零拷贝内存 or 锁定内存

这是一个小实验,在于验证GPU上使用零拷贝内存锁定内存的性能差别。使用的是点积计算,数据量在100M左右。...实验步骤很简单,分别在主机上开辟普通内存锁定内存以及进行零拷贝内存的操作,看三者哪个完成的时间比较快,具体的代码在最后,这里是实验结果: ?...但是,锁定内存相比于零拷贝内存到底慢在哪里呢,当然是慢在从主机内存拷贝到显存的时间了,注释掉锁定的拷贝语句之后,可以得到以下结果: ?...ps:但是,奇怪的是,如果只将a,b内存拷贝的语句注释掉,锁定内存仍旧可以得到正确的结果,暂时想不明白是为什么 这时就要问了,看起来零拷贝比锁定要快啊,那还要这个锁定干嘛呢,当然是有用的,因为...,零拷贝的内容不能缓存在显存里,如果内容要被反复使用,零拷贝就要不停地从内存里取值,增加总线压力,这样相比锁定也就处于劣势。

1.9K50

Linux 标准大和透明大

Huge pages ( 标准大 ) 和 Transparent Huge pages( 透明大 ) 在 Linux 中大分为两种:Huge pages ( 标准大 ) 和 Transparent...内存是以块即的方式进行管理的,当前大部分系统默认的大小为 4096 bytes 即 4K。1MB 内存等于 256 ;1GB 内存等于 256000 。...CPU 拥有内置的内存管理单元,包含这些页面的列表,每个页面通过表条目引用。当内存越来越大的时候, CPU 需要管理这些内存的成本也就越高,这样会对操作系统的性能产生影响。...Huge Pages Huge pages 是从 Linux Kernel 2.6 后被引入的,目的是通过使用大内存来取代传统的 4kb 内存页面, 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能...Huge pages 有两种格式大小:2MB 和1GB ,2MB 块大小适合用于 GB 大小的内存, 1GB 块大小适合用于 TB 级别的内存;2MB 是默认的大小。

4.8K50

Linux 内核 内存管理】物理内存组织结构 ⑥ ( 物理 page 简介 | 物理 page 与 MMU 内存管理单元 | 内存节点 pglist_data 与 物理 page 联系 )

文章目录 一、物理 page 简介 1、物理 page 引入 2、物理 page 与 MMU 内存管理单元 3、物理 page 结构体 4、Linux 内核源码中的 page 结构体 二、内存节点...pglist_data 与 物理 page 联系 内存管理系统 3 级结构 : ① 内存节点 Node , ② 内存区域 Zone , ③ 物理 Page , Linux 内核中 , 使用 上述..., 就是 " 内存区域 " zone , " 内存区域 " 再向下划分 , 就是 " 物理 " page ; 2、物理 page 与 MMU 内存管理单元 在 Linux 内核中 , MMU 内存管理单元...结构体 " 物理 " page 是 Linux 内核 " 内存管理 " 中的 最小单位 , 物理 中的 " 物理地址 " 是连续的 , 每个 " 物理 " 使用 struct page 结构体...SPARSEMEM */ // 描述数组 struct page *node_mem_map; #endif } 参考 【Linux 内核 内存管理】物理内存组织结构 ③ ( 内存管理系统三级结构

6.7K10

MySQL 内存淘汰策略

全表扫描对InnoDB的影响 当我们在查询数据的时候,会从磁盘上读取数据内存中,如果内存中的数据是最新的,可以直接读取内存也返回,不需要从磁盘上再次读取。...内存数据是在Buffer Pool中管理的,Buffer Pool的两个重要作用是: 加速更新 加速查询 InnoDB Buffer Pool的大小由innodb_buffer_pool_size决定...show engine innodb status\G; 从上图中可以看出,当前的命中率是97.7%,命中率越高,说明我们从内存获取数据的次数越多。...由于现在磁盘内存的数据量完全是一个量级,因此很容易出现淘汰的现象。...如果按照普通的LRU算法,假设我们一个很大的查询需要淘汰掉绝大多数的内存,这将会导致Buffer Pool的内存命中率急速下降,磁盘压力增加,SQL语句会响应变慢。

1.4K10

性能优化:Linux环境下合理配置大内存

比如从磁盘读文件时,主要的时间在磁盘内部的操作上,而消耗的CPU时间只占I/O操作响应时间的少部分。只有在过高的并发I/O时才可能会使SYS CPU有所增加。 2....因此,决定先使用大内存来调优系统的内存使用。 大内存是一种统称,在低版本的Linux中为Large Page,而当前主流的Linux版本中为Huge Page。...实际上这里可以反映出Linux在分页处理机制上的缺陷。而其他操作系统,比如AIX,对于共享内存段这样的内存,进程共享相同的表,避免了Linux的这种问题。...总结 本文以一个案例,介绍了Linux操作系统下大内存在性能提升方面的作用,以及如何设置相应的参数来启用大内存。...另外值得高兴的是,新版本的Linux内核提供了Transparent Huge Pages,以便运行在Linux上的应用能更广泛更方便地使用大内存,而不仅仅是只有共享内存这类内存才能使用大内存

4.5K50

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

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

1.4K40

DPDK巨地址管理Linux内核内存管理内存映射pagemaprdma内存注册

DPDK巨地址管理/Linux内核内存管理/内存映射/pagemap/rdma内存/注册术语PFN: 物理地址对应的帧号:pfn = pte_pfn(*pte)INFINIBAND_USER_MEM...,就如同将整个文件从磁盘加载到内存。...11、调过程先在交换缓存空间(swap cache)中寻找需要访问的内存,如果没有则调用nopage函数把所缺的磁盘装入到主存中。...这时候文件修改位于缓存,并没有写回到磁盘文件中去。7、如果缓存缺失,那么产生一个缺失异常,创建一个缓存,同时通过inode找到文件该页的磁盘地址,读取相应的填充该缓存。...有两种方式可以把脏写回磁盘:(1)手动调用sync()或者fsync()系统调用把脏写回(2)pdflush进程会定时把脏写回到磁盘同时注意,脏不能被置换出内存,如果脏正在被写回,那么会被设置写回标记

18610

Linux 透明大 THP 和标准大 HP

Linux 中大分为两种: Huge pages (标准大) 和 Transparent Huge pages(透明大)。...标准大(HugePages) 标准大(HugePages)是从 Linux Kernel 2.6 后被引入的,Huge Pages 可以称为大内存或者大页面,有时候也翻译成大/标准大/传统大...透明大存在的问题: Oracle Linux team 在测试的过程中发现,如果 linux 开启透明大 THP,则 I/O 读写性能降低 30%;如果关闭透明大 THP,I/O 读写性能则恢复正常...Linux7 默认情况下是开启透明大功能的。检查系统对应版本。...而其他操作系统,比如 AIX,对于共享内存段这样的内存,进程共享相同的表,避免了 Linux 的这种问题。 5、提高 Oracle 性能,减少 SGA 的交换。

2.2K20

Linux-3.14.12内存管理笔记【建立内核表(3)

前面已经分析了内核表的准备工作以及内核低端内存表的建立,接着回到init_mem_mapping()中,低端内存表建立后紧随着还有一个函数early_ioremap_page_table_range_init...temporary kernel mappings */ FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, 其中KM_TYPE_NR表示“窗口”数量,在高端内存的任意一个框都可以通过一个...“窗口”映射到内核地址空间,调用kmap_atomic可以搭建起“窗口”到高端内存的关系,即建立临时内核映射。...,是从表缓冲空间中申请还是通过memblock算法申请内存。...值得注意的是,与低端内存表初始化不同的是,这里的表只是被分配,相应的PTE项并未初始化,这个工作将会交由以后各个固定映射区部分的相关代码调用set_fixmap()来将相关的固定映射区表与物理内存关联

1.5K11

linux中透明巨与巨的区别

Linux中,透明巨(Transparent HugePage)和巨(HugePage)是两种不同的内存管理技术。 透明巨Linux内核中的一项特性,旨在提高内存的利用率和性能。...它通过将内存分配为更大的巨(通常为2MB或1GB),减少了对内存表的访问次数,从而提高了内存访问的效率。透明巨是透明的,应用程序无需进行任何修改即可受益于这种内存管理技术。...而巨是指一种更大尺寸的内存,在Linux中可以使用不同的页面大小,常见的巨大小是2MB或1GB。...巨可以提供更高的内存访问性能,因为它减少了表的数量,降低了TLB(Translation Lookaside Buffer)缓存的压力,从而减少了内存访问的开销。...巨需要应用程序进行适当的修改和配置才能使用。 因此,透明巨和巨都是通过增加内存的尺寸来提高内存访问性能,但透明巨不需要应用程序的修改,而巨需要应用程序的支持和配置。

22110

Linux-3.14.12内存管理笔记【建立内核表(1)】

前面已经分析过了Intel的内存映射和linux的基本使用情况,已知head_32.S仅是建立临时表,内核还是要建立内核表,做到全面映射的。...建立内核表前奏,了解两个很关键的变量: max_pfn:最大物理内存页面帧号; max_low_pfn:低端内存区(直接映射空间区的内存)的最大可用帧号; max_pfn 的值来自setup_arch...Linux是一个支持多硬件平台的操作系统,各种硬件芯片的分页并非固定的2级(全局目录和表),仅仅Intel处理器而言,就存在3级的情况(全局目录、中间目录和表),而到了64位系统的时候就成了4...所以Linux为了保持良好的兼容性和移植性,系统设计成了以下的4级分页模型,根据平台环境和配置的情况,通过将上级目录和中间目录的索引位设置为0,从而隐藏了三级目录和中间目录的存在。...由此管中窥豹,看到了Linux内存分页映射模型的存在和相关设计,暂且也就先了解这么多。 分析宏是一件很乏味的事情,不过以小见大却是一件很有意思的事情。

1.8K41

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

框分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下: static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned...什么是内存碎片化 Linux物理内存碎片化包括两种:内部碎片化和外部碎片化。 内部碎片化: 指分配给用户的内存空间中未被使用的部分。...外部碎片化: 指系统中无法利用的小内存块。例如系统剩余内存为16K bytes,但是这16K bytes内存是由4个4K bytes的页面组成,即16K内存物理帧号#1不连续。...碎片化整理算法 Linux内存对碎片化的整理算法主要应用了内核的页面迁移机制,是一种将可移动页面进行迁移后腾出连续物理内存的方法。 假设存在一个非常小的内存域如下: ?...蓝色表示空闲的页面,白色表示已经被分配的页面,可以看到如上内存域的空闲页面(蓝色)非常零散,无法分配大于两的连续物理内存

2.6K20

Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存 | 产生缺页异常 | 分配物理内存 | 共享内存 | 进程内存 )

文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存 2、产生缺页异常 3、分配物理内存 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存 分配 虚拟内存 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问...缺页异常 " 后 , 会 分配 " 物理内存 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存 " 中 ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存 “..., 并且在 " 表 “ 中 , 将 ” 虚拟内存 " 映射到 ” 物理内存 " ; 三、共享内存 ---- 内存映射 与 共享内存 关系 : 文件映射 : 在进程间的 " 共享内存 " 就是使用

8.2K20

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

1 内存中不连续的的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块....分配到其中的可能位于物理内存中的任何地方. 通过修改负责该区域的内核表, 即可做到这一点. ? ?...因为用于vmalloc的内存总是必须映射在内核地址空间中, 因此使用ZONE_HIGHMEM内存域的要优于其他内存域. 这使得内核可以节省更宝贵的较低端内存域, 而又不会带来额外的坏处....其中依次映射了3个(假想的)物理内存, 在物理内存中的位置分别是1 023、725和7 311....接下来从物理内存分配各个 最后将这些连续地映射到vmalloc区域中, 分配虚拟内存的工作就完成了.

2.9K10

操作系统:内存的替换

问题:虚拟被分配使用之后,在表中一定有到相应的物理的映射吗?答案是否定的。 举个例子:电脑只有4g内存,但是要同时打开一个占用3g内存和一个2g内存的游戏,怎么办呢?...换页的设计思想 换页的基本思想就是当物理内存不够时,操作系统将若干物理的内容写到类似于磁盘这种更大更便宜的存储设备中,然后就可以回收物理并继续使用了。...换页的步骤: 当操作系统希望从应用程序A那里回收物理P(对于应用程序中的虚拟V)时,操作系统需要将P写入到磁盘中的一个位置,然后再应用程序A的表中去除对虚拟V的映射,同时记录该物理被换到磁盘上的对应位置...预取(prefetching)机制 由于换页过程涉及到耗时的磁盘io,因此在发生换入操作时,操作系统就设计了预取机制。预测还有哪些将要被访问,也将它们一并换入物理内存,减少发生缺页异常的次数。...替换策略 当需要分配物理时,若空闲的内存已经用完或者小于某个阈值,就需要通过替换策略将某些物理换出,以腾出物理内存的空间。

1K10

系统内存管理:虚拟内存内存分段与分页、表缓存TLB以及Linux内存管理

它可以为每个进程提供独立的地址空间,保护进程间的数据隔离,同时也可以有效地利用物理内存,将不常用的数据交换到磁盘上(交换区),以提供更大的可用内存空间。...当不够内存分配的时候,会选择使用内存交换,先把一块正在使用的内存移到磁盘中,然后再移回来把中间留的内存缝隙全用上,虽然解决了内存碎片的问题,但是这个交换操作很慢,效率低,看下图示:虚拟内存、分段和内存交换似乎解决了同时运行多个程序的问题...内存分页内存分页是将整个虚拟和物理内存空间划分为固定大小的连续内存块,称为(Page)。在Linux下,每一的大小通常为4KB。...这是因为程序执行过程中,访问的表项相对固定。通过利用TLB,可以大大提高地址转换的速度,加快程序的执行效率。Linux内存管理Linux内存管理涉及逻辑地址和线性地址的转换。...逻辑地址是程序使用的地址,而线性地址是通过段式内存管理映射的地址,也称为虚拟地址。Linux的虚拟地址空间分为内核空间和用户空间两部分。

43380
领券