linux 内存分配机制 (转)

Linux内存分配策略 等下次在申请内存的时候,就直接从内存池取出对应的内存块就行了,而且可能这个内存块的虚拟地址与物理地址的映射关系还存在,这样不仅减少了系统调用的次数,也减少了缺页中断的次数,这将大大降低 CPU 的消耗。为了改进这两个问题,malloc 通过 brk 系统调用在堆空间申请内存的时候,由于堆空间是连续的,所以直接预分配更大的内存来作为内存池,当内存释放的时候,就缓存在内存池中。查看进程的内存的分布情况,可以发现最右边没有 [head] 标志,说明是通过 mmap 以匿名映射的方式从文件映射区分配的匿名内存。 阅读详情

一般来说在ps aux中看到的rss就是进程所占用的物理内存。但是如果将所有程序的rss加起来的话。会发现比实际的内存还要大很多,这个是由于rss还包括了共享的部分。这个可以通过pmap -d PID来看到具体情况。

一. 内存使用说明

Free 命令相对于top 提供了更简洁的查看系统内存使用情况:

1 [root@rac1 ~]# free
2 total       used       free     shared    buffers     cached
3 Mem:       1035108   1008984      26124      0     124212     413000
4 -/+ buffers/cache:        471772      563336
5 Swap:       2096472   842320     1254152

这里显示的单位是KB。

在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

Mem:表示物理内存统计。
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况。只有mem被当前进程实际占用完,即没有了buffers和cache时,才会使用到swap。

Mem 行(第一行)数据说明:

Total:1035108KB。表示物理内存总大小。

Used:1008984KB。表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。

Free:26124KB。表示未被分配的内存。

Shared:0kb。共享内存,一般系统不会用到。

Buffers:124212KB。系统分配但未被使用的buffers 数量。

Cached:413000KB。系统分配但未被使用的cache 数量。

-/+ buffers/cache 行(第二行)数据说明:

Used:471772kb,实际使用的buffers 与cache 总量,也是实际使用的内存总量。

Free: 563336kb, 未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

根据以上分析,可以得出一下结论:

1.  实际可用内存大小:

Free(-/+ buffers/cache行)= Free(Mem)+buffers(Mem)+Cached(Mem);

563336 = 26124 + 124212+ 413000

2.  已经分配的内存大小:

Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)

1008984kb = 471772 + 124212 +413000

3.  物理内存总大小

total(Mem) = used(-/+ buffers/cache) + free(-/+ buffers/cache)

1035108 = 471772 + 563336

二. Swap配置对性能的影响

分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。 如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生 出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。
通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有 不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服 务器,随着访问量的增加,对Swap空间的要求也会增加,一般来说对于4G 以下的物理内存,配置2倍的swap,4G 以上配置1倍。

另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流 的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数 时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题 的。

三.  Linux 内存机制

Linux支持虚拟内存(Virtual Mmemory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来, 这块内存就可用于其它目的。当需要用到原始的内容时,它们被重新读入内存。这些操作对用户来说是完全透明的;Linux下运行的程序只是看到有大量的内存 可供使用而并没有注意到时不时它们的一部分是驻留在硬盘上的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程序就不会象一直在内存中运 行的那样快。用作虚拟内存的硬盘部分被称为交换空间(Swap Space)。

一般,在交换空间中的页面首先被换入内存;如果此时没有足够的物理内存来容纳它们又将被交换出来(到其他的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。
有 时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种情况是有可能发生的,例如如果在某一时刻有进行交换的必要,但后来一个占用很多物理内存 的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个需要时。此时物理内存会在一段时间内保持空闲状态。对此并没有什么可担心 的,但是知道了是怎么一回事,也就无所谓了。
许多操作系统使用了虚拟内存的方法。因为它们仅在运行时才需要交换空间,以解决不会在同一时间使用交换空间,因此,除了当前正在运行的操作系统的交换空间,其它的就是一种浪费。所以让它们共享一个交换空间将会更有效率。

注意:如果会有几个人同时使用这个系统,他们都将消耗内存。然而,如果两个人同时运行一个程序,内存消耗的总量并不是翻倍,因为代码页以及共享的库只存在一份。
Linux系统常常动不动就使用交换空间,以保持尽可能多的空闲物理内存。即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以 避免等待交换所需的时间:当磁盘闲着,就可以提前做好交换。可以将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样做可以提高 性能。
与访问物理内存相比,磁盘的读写是很慢的。另外,在相应较短的时间内多次读磁盘同样的部分也是常有的事。例如,某人也许首先阅读了一段E-mail消息, 然后为了答复又将这段消息读入编辑器中,然后又在将这个消息拷贝到文件夹中时,使得邮件程序又一次读入它。或者考虑一下在一个有着许多用户的系统中 ls命令会被使用多少次。通过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读以外,可以加快所有其它读的速度。这叫作磁盘缓冲(Disk Buffering),被用作此目的的内存称为高速缓冲(Buffer Cache)。但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间 不用的数据将被舍弃以腾出内存空间用于新的数据。
对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将 要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成, 而不会拖延程序的执行。

大多数操作系统都有高速缓冲(尽管可能称呼不同),但是并不是都遵守上面的原理。有些是直接写(Write-Through):数据将被立刻写入磁 盘(当然,数据也被放入缓存中)。如果写操作是在以后做的,那么该缓存被称为后台写(Write-Back)。后台写比直接写更有效,但也容易出错:如果 机器崩溃,或者突然掉电,缓冲中改变过的数据就被丢失了。如果仍未被写入的数据含有重要的薄记信息,这甚至可能意味着文件系统(如果有的话)已不完整。
针对以上的原因,出现了很多的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即使此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。当然这些问题不再本文的叙述范围。
由于上述原因,在使用适当的关闭过程之前,绝对不要关掉电源,Sync命令倾空(Flushes)缓冲,也即,强迫所有未被写的数据写入磁盘,可用以确定 所有的写操作都已完成。在传统的UNIX系统中,有一个叫做update的程序运行于后台,每隔30秒做一次sync操作,因此通常无需手工使用sync 命令了。Linux另外有一个后台程序,Bdflush,这个程序执行更频繁的但不是全面的同步操作,以避免有时sync的大量磁盘I/O操作所带来的磁 盘的突然冻结。
在Linux中,Bdflush是由update启动的。通常没有理由来担心此事,但如果由于某些原因bdflush进程死掉了,内核会对此作出警告,此时你就要手工地启动它了(/sbin/update)。

缓存(Cache)实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。 这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。缓冲的效力主要是由它的大小决定的。缓冲太小的话等于没用。它只能 容纳一点数据,因此在被重用时,所有缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。
如果缓存有固定的大小,那么缓存太大了也不好,因为这会使得空闲的内存太小而导致进行交换操作(这同样是慢的)。为了最有效地使用实际内存,Linux自动地使用所有空闲的内存作为高速缓冲,当程序需要更多的内存时,它也会自动地减小缓冲的大小。
这就是一般情况下Linux内存的一般机制,真正的Linux内存的运行机制远远比这个复杂。

Linux 如何进行内存分配 Linux内核通过复杂的算法和策略来管理和优化有限的物理内存(RAM),它像一位聪明的管家,总是在幕后默默工作,确保每个任务都能获得足够的内存空间,并且尽可能地减少浪费。反之,当释放内存时,相邻的小块会被合并成更大的块,以便后续使用。例如,当我们启动一个基于GTK图形界面的应用程序时,它会加载libgtk.so这样的共享库,从而避免重复加载相同的库文件,节省了宝贵的内存资源。你可以把这里当作自己的家,无论是工作之余的小憩,还是寻找灵感的驿站,我都希望你能在这里找到属于你的那份快乐和满足。 阅读详情

相关推荐

Android内存分配回收机制

一 ,Android内存分配回收机制 从宏观角度上来看Android系统可以分为三个层次 1. Application Framework, 2. Dalvik 虚拟机 3. Linux内核。 这三个层次都有各自内存相关工作: 1. Application Framework Anroid基于进程中运行的组件及其状态规定了默认的五个回收优先级: Empty process

a15838319826的博客 4045

深入理解Linux内存分配

为了写一个用户层程序,你也许会声明一个全局变量,这个全局变量可能是一个int类型也可能是一个数组,而声明之后你有可能会先初始化它,也有可能放在之后用到它的时候再初始化。除此之外,你有可能会选择在函数内部去声明局部变量,又或者为变量动态申请内存。 不管你在用户程序中采取哪种方式申请内存,这些都对应着不同的内存分配方式以及不同的数据段,如果再加上代码段,就构成了一个完整的进程。由此可见,一个完整的进程在内存空间中对应着不同的数据区,具体来说,对应着五种不同的数据区: 代码段,存放操作指令;数据段,存放已初始

木牛的博客 1512

Linux用户空间和内核空间所有15种内存分配方法

在Linux操作系统中,内存管理是一个关键的系统功能。用户空间和内核空间分别使用不同的函数来申请内存。以下是用户空间和内核空间内存申请函数的详细列表:Linux用户空间内存申请函数。

嵌入式技术开发 1330

【Linux内存】Linux的内存管理机制

6.底层驱动的mmap,根据sys_mmap传递过来的对象指针获取到用户的虚拟内存的信息(vm_start:空闲内存区域的首地址),然后再根据芯片手册或者原理图得到物理地址,然后调用remap_pfn_range进行地址映射(将物理地址映射到vm_start)5.sys_mmap中内核会在用户3G的虚拟地址空间的MMAP内存映射区,找一块空闲的虚拟内存,然后分配一个struct vm_area_struct结构体对象来描述这块空闲的内存区域,然后将这个对象的指针传递给底层驱动的mmap。

Stay_Hun_forward的博客 3170

linux中的内存分配

linux中的内存分配

hqb_newfarmer的博客 177

认识 Linux 内存构成:Linux 内存调优之内存分配机制和换页行为认知

博文内容涉及 Linux 中内存分配和换页机制的基本认知理解不足小伙伴帮忙指正 😃,生活加油99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式前面的文章和小伙伴们分享了 Linux 虚拟内存,物理内存,以及页表,TLB,大页认知,今天我们来看看具体的内存分配以及换页行为。

山河已无恙 441

linux 内存分配机制

这几天在观察apache使用内存情况,所以特意了解了下linux的内存机制,发现一篇写得还不错。转来看看。 一般来说在ps aux中看到的rss就是进程所占用的物理内存。但是如果将所有程序的rss加起来的话。会发现比实际的内存还要大很多,这个是由于rss还包括了共享的部分。这个可以通过pmap -d PID来看到具体情况。 一. 内存使用说明 Free 命令相对于top 提供了更简洁的查看系

koozxcv的博客 3572

Outlook邮件备份全攻略:从导出到导入的完整流程(附常见问题解决)

本文提供了一份详尽的Outlook邮件备份全攻略,涵盖从导出到导入的完整流程。重点解析了经典桌面版Outlook的.pst文件备份方法、进阶的智能筛选备份策略,以及如何通过导入恢复和工具验证确保备份可用。同时,文章还介绍了构建自动化备份体系与异地容灾的最佳实践,并附有常见问题解决方案,帮助用户建立可靠的邮件数据安全防线。

weixin_29248611的博客 891

Linux内存分配机制

Linux内存分配机制 原文:https://blog.youkuaiyun.com/gfgdsg/article/details/42709943 Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物...

weixin_43947156的博客 261

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

传感器采集信息的频率(采样频率)

较高的采集频率通常能提供更详细的信息,但也会增加数据处理和存储的负担。在某些应用中,较高的采样频率可能是必要的,而在其他情况下,则可能会选择适当的低采样频率以降低功耗和数据处理压力。传感器采集信息的频率(采样频率)是指传感器在一定时间内对输入信号进行采样的次数。对于一些需要快速检测和响应的应用,如运动传感器、声音传感器等,高采样频率是至关重要的。高采样频率通常需要更多的功耗和更大的存储容量,因为产生的数据量更大。例如,对于快速运动的对象,较低的采样频率可能无法捕捉到运动的真实轨迹。

chen的博客 5343

Linux内核内存分配机制说明

malloc:用于用户空间,通过brk或mmap系统调用分配内存,物理内存的分配可能延迟到实际访问时。kmalloc:用于内核空间,通过SLAB/SLUB分配器分配内存,物理内存的分配是立即进行的。两者都依赖于内核的内存管理机制,但malloc在用户空间运行,而kmalloc在内核空间运行。

我觉得你很6 653

分析方法—temporal receptive field(TRF)

总结来说,时间感受野其实就是一个 filter!课程中的描述—.(使用时间感受野与刺激进行卷积来描述)时间感受野一般是听觉计算中使用的,在视觉中,有另一种分析叫做空间感受野(spatial receptive fields)。回归权重(Regression weights)是指在回归分析中用于估计自变量与因变量之间关系的权重或系数。回归分析是一种统计方法,用于建立自变量与因变量之间的关联模型,并通过拟合数据来估计模型中的参数。在简单线性回归中,只有一个自变量与一个因变量之间的关系被建模。

m0_51474171的博客 1602

深度理解 linux 系统内存分配

本文详细介绍了 linux 操作系统下的内存分配原理,包括用户态和内核态。

我要出家当道士 1556

grafana使用方法

1、点击仪表盘2、新建仪表盘3、选择数据源4、选择查询的条件5、美化。

2403_87359664的博客 323

【BUG已解决】ImportError: cannot import name ‘OpenAI‘ from ‘openai‘ 解决方案

的核心是版本不匹配用确认当前版本如果是 0.x 版本 →升级到 1.x升级后代码语法要同步改为团队协作项目务必在中锁定版本号,避免"我这能跑,你那不能跑"的问题对接国产模型时,只需替换base_url参数,SDK 调用方式完全一致。

一键难忘的博客 1万+

Linux 下 malloc 内存分配机制详解

在 Linux 系统中,malloc() 是 C 语言标准库(glibc)提供的动态内存分配函数。📌 示例:运行一个多线程程序后查看 /proc//maps,你会看到一个 [heap] 区域和多个匿名 mmap 区域——它们分别对应 main arena 和 thread arenas。因此,一个进程可以有多个 arena,每个 arena 都是一个独立的“堆”,拥有自己的空闲块管理结构和锁。Arena 是 malloc 用来管理内存的独立分配区,目的是支持高效、线程安全的内存分配。

唐装鼠的主页 1043

YOLOv11改进策略【损失函数篇】| 引入Soft-NMS,提升密集遮挡场景检测精度,包括GIoU-NMS、DIoU-NMS、CIoU-NMS、SIoU-NMS、 EIou-NMS

传统的非极大值抑制(NMS)算法在目标检测中存在一个问题,即当一个物体的检测框与具有最高得分的检测框M有重叠(在预定义的重叠阈值内)时,会将该检测框的得分设置为零,从而导致该物体可能被遗漏,降低了平均精度。为了解决这个问题,作者提出了Soft-NMS算法。本文将YOLOv11默认的NMS修改成GIoU-NMSDIoU-NMSCIoU-NMSSIoU-NMSEIou-NMS。

Limiiiing的博客 4318

Linux 内存分配理论与水位机制全解 (配B站精讲视屏教程)

Linux内存分配机制核心原理与优化实践 摘要:本文全面剖析Linux内存管理核心机制,重点讲解Buddy分配器原理、/proc/buddyinfo解析方法及内存水位线机制。文章指出Buddy分配器以2的幂次方页块为单位管理内存,通过/proc/buddyinfo可监控各阶空闲块数量(计算公式:order N数量×4KB×2^N)。详细解析min/low/high三条水位线的作用机制及min_free_kbytes的调优方法,建议值65536(64MB)可提升系统稳定性。针对常见性能问题,提供基于buddy

Interview_TC的博客 1016

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

AI人人懂 936

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

linux 内存 伙伴,Linux内存分配机制之伙伴系统和SLAB

内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。这就要求内核采取灵活而恰当的内存分配策略。通常,内存分配一般有两种情况:大对象(大的连续空间分配)、小对象(小的空间分配)。针对不同的需求,Linux分别采取了伙伴系统算法和SLAB进行内存分配。伙伴系统:把所有的空闲页框分为11个块链表,每个块链表中的结点分别是大小为1,2,4,8,16,32,64,128,256,5...

weixin_42628573的博客 290

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux kernel 内存分配管理机制以及分配机制

其实计算机的核心就是运算, 但是为了复杂的运算毕竟只靠cpu 自带的寄存器 云算力毕竟有限,所以就有了内存的出现。 下面我们呢先见一下linux 中内存的分布情况。 在内核空间中,内核 地址16~896M 其他有iomap 和dma 一、内核空间 1、页 页(page)是内核的内存管理基本单位。(linux/mm_types.h) struct page { unsigned long flags; // 页标志符 struct address_space *mapping; // 该页...

sdc20102010的博客 1846

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

解密 Linux 下 ARM SMMU 的 DMA 内存分配机制

本文深入解析了Linux内核中ARM SMMU如何管理DMA内存分配。以音频子系统为例,从驱动调用dma_alloc_coherent()开始,详细剖析了请求如何经由IOMMU框架传递,最终由SMMU完成IOVA地址分配与页表映射的全过程,并探讨了不同分配策略对系统性能的影响与调优方法。

yellow的专栏 630

linux内存分配原理

Linux进程分配内存的两种方式--brk() 和mmap() 如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看。 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断...

一码当先 1078

Linux内存分配原理

进程调用C=malloc(200K)以后,内存空间如图4:默认情况下,malloc函数分配内存,如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。这样子做主要是因为brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的),而mmap分配的内存可以单独释放。也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。

上官宏竹的专栏 1318
上一篇: do while(0)在宏定义中的应用
下一篇: priority_queue的用法
otuhacker
博客等级 码龄18年 21粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值