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

news/2024/7/20 13:30:22 标签: 内存管理, 操作系统
大 内存如果从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


http://www.niftyadmin.cn/n/993614.html

相关文章

任意一个英文的纯文本文件,统计其中的单词出现的个数(shell python 两种语言实现)...

现有plain text titled test.txt,统计其中的单词出现的个数。test.txt的内容:i have have application someday oneday day demoi have some one coma ideal naive i用python实现的代码:import recount {}f open(test,r) b f.read()#print…

python base,python-Base 62转换

没有标准的模块,但我已经写了我自己的功能来实现。BASE62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"def encode(num, alphabetBASE62):"""Encode a positive number in Base XArguments:- num: The number to e…

初步学习弹性布局

今天刚刚学习了微信小程序,学习微信小程序之前首先得熟悉弹性布局 如果把一个元素设置为display:flex,它的所有子元素都成为容器成员,称之为项目,并且,子元素的float,clear和vertical-align属性都会失效。以下介绍弹性…

Oracle数据库升级前必要的准备工作

Oracle数据库升级向来是一门纷繁复杂的工程,DBA需要为产品数据库的升级耗费大量时间精力在准备工作上;因为其升级复杂度高,所以即便做了较为充分的准备仍可能在升级过程中遇到意想不到的问题,为了更高效地完成升级任务和减少停机时…

WMI自动切换网关

[背景]本人比较懒,不想因为每次要更换网关而动这个添那个,就写了个脚本来提换网关,适合我,估计也有适合各位的,拿过去,大家可以扩展下,很方便的.....哈哈......msgbox "用来自动切换网关的脚本"DefaultIPGateway1Array("192.168.x.x")DefaultIPGateway2Arr…

Myeclipse创建Maven项目

2019独角兽企业重金招聘Python工程师标准>>> 第一步,创建一个Web Project,创建时勾选 Add Maven support 下面图片的步骤中,Project structure建议选第二个,选第一个会导致创建的项目没有src/main/java等文件夹&#x…

matlab 温图,NCL画假相当位温图

; 假相当位温beginfi addfile("./new.grib2", "r")time fi->initial_time0_hours;YYYYMMDDHH tostring(cd_calendar(time, -3))dims dimsizes(YYYYMMDDHH)cstnew((dims),string)cst1new((dims),string)do i 0,dims-1utc str_get_cols(YYYYMMDDHH…

rz工具的安装和使用

在工作中经常遇到把文件从windows转到linux,然后再从linux回到windows,来来回回的用xftp虽然很舒服但是有时候遇到需要来回输入跳板机ip地址、账号密码的情况(不少公司应该是使用跳板机来当中间文件传送器吧,然后再辅助一个共享盘…