linux底层内存管理--用户空间的分级分配系统以及懒惰的含义

简介:
大 内存如果从heap中分配,第一它如果释放了可能不会立即归还操作系统,第二它如果不释放,由于heap中小内存的分配和释放会造成很多碎片,再有大内存 分配需求时可能会失败,另外heap是要求很严格的一个虚拟内存区间,而且算法维护开销很大,最好让它和谐一些,就是说不要让内存分配的差别过于大,一会 很大的需求,一会一个字节的,由于用户程序内存需求的不确定性,它又不能像内核那样实现简单的页面对齐,最小分配粒度我说是半个字节都不为过,而最大可以 上G,即使是伙伴算法也不能高效的实现从而带来它在内核中的那种高效,因此linux对用户空间的内存分配实行了分级管理,具体怎样划分级别的策略留给最 终的程序员,linux的glibc库实现了以下的分级机制,通过若干个微调值控制用户进程内存分配的地点,分别为: 
M_TRIM_THRESHOLD:当可以被释放的内存堆积到该值时进行正真的释放(sbrk)操作; 
M_MMAP_THRESHOLD:如果需要分配的内存超过该值,glibc将采用mmap分配内存。 

这 样的话,超过M_MMAP_THRESHOLD的内存分配都将采用mmap进行,如此的结果就是当用户调用free的时候,它将马上返还给操作系统,这些 内存就不会占据着可能根本就不会再使用的比如heap空间,那样地话可能还会导致heap过于大从而阻碍正常的别的mmap分配。通过这种分级分配机制, 用户只要设置好自己的策略,内存分配在底层看来就会和谐很多,不会过于严重的出现内存块大小相间的情况,也不会出现小内存乱释放导致碎片,最大的可用内存 无法满足大内存需求但是空闲内存之和却很大的情况。其实heap在linux中是个很松散的概念,之所以有heap这一说是历史原因,其初衷是为了管理动 态内存,那是在指针这种数据类型被展示给程序员之后的事了,然而如果我们有更好的内存管理方式特别是动态内存管理方式的话,那么为何还要死死拽住heap 这个概念呢?其实就算是内核也是一切为了用户,最初的内存和进程同时换入换出,然后又有了写时复制,就是说在fork子进程的时候,完全和父进程共享内存 区域,然后直到二者之一有写操作的时候才将写的页面分离,其实这个写时复制机制只不过是动态请页机制的一个策略,另一个策略就是物理内存并不映射到进程地 址空间,直到第一次访问的时候再做,而且每次只映射一个页面,和谐的是,这二者同时在缺页处理中实现,其实这种懒惰的方式是有道理的,其根本就是为了向每 个进程可以最大化的使用内存,想达到这个目的每个进程就必须做相反的事,也就是用最懒惰的方式使用内存,向最小化使用内存的方向收敛,这看似是矛盾的,然 而这就是自组织,我们保护环境是为了利用环境,比如可以让更多的人开上车(如果环境被破坏就没有办法再开车了),使生活更舒适,然后为了达到这个目标就必 须尽量少开车,这就是和谐。需要节省资源的需要采用懒惰机制的是个体,最大化收益的是整体,带来的结果就是公平,就是和谐。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273407

相关文章
|
2月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
138 17
|
1月前
|
Linux
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
77 24
Linux系统之whereis命令的基本使用
|
1月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
126 48
|
6天前
|
存储 缓存 Linux
Linux系统中如何查看CPU信息
本文介绍了查看CPU核心信息的方法,包括使用`lscpu`命令和读取`/proc/cpuinfo`文件。`lscpu`能快速提供逻辑CPU数量、物理核心数、插槽数等基本信息;而`/proc/cpuinfo`则包含更详细的配置数据,如核心ID和处理器编号。此外,还介绍了如何通过`lscpu`和`dmidecode`命令获取CPU型号、制造商及序列号,并解释了CPU频率与缓存大小的相关信息。最后,详细解析了`lscpu`命令输出的各项参数含义,帮助用户更好地理解CPU的具体配置。
36 8
|
6天前
|
存储 运维 监控
深度体验阿里云系统控制台:SysOM 让 Linux 服务器监控变得如此简单
作为一名经历过无数个凌晨三点被服务器报警电话惊醒的运维工程师,我对监控工具有着近乎苛刻的要求。记得去年那次大型活动,我们的主站流量暴增,服务器内存莫名其妙地飙升到90%以上,却找不到原因。如果当时有一款像阿里云 SysOM 这样直观的监控工具,也许我就不用熬通宵排查问题了。今天,我想分享一下我使用 SysOM 的亲身体验,特别是它那令人印象深刻的内存诊断功能。
|
21天前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
34 3
|
21天前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
34 2
|
2月前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
175 23
|
5天前
|
Linux
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat > filename` 创建新文件,`cat >> filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
25 5
Linux 常用文件查看命令