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

晨曦之光 发布于 2012/04/10 15:00
阅读 446
收藏 0

大 内存如果从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子进程的时候,完全和父进程共享内存 区域,然后直到二者之一有写操作的时候才将写的页面分离,其实这个写时复制机制只不过是动态请页机制的一个策略,另一个策略就是物理内存并不映射到进程地 址空间,直到第一次访问的时候再做,而且每次只映射一个页面,和谐的是,这二者同时在缺页处理中实现,其实这种懒惰的方式是有道理的,其根本就是为了向每 个进程可以最大化的使用内存,想达到这个目的每个进程就必须做相反的事,也就是用最懒惰的方式使用内存,向最小化使用内存的方向收敛,这看似是矛盾的,然 而这就是自组织,我们保护环境是为了利用环境,比如可以让更多的人开上车(如果环境被破坏就没有办法再开车了),使生活更舒适,然后为了达到这个目标就必 须尽量少开车,这就是和谐。需要节省资源的需要采用懒惰机制的是个体,最大化收益的是整体,带来的结果就是公平,就是和谐。


原文链接:http://blog.csdn.net/dog250/article/details/5303676
加载中
返回顶部
顶部