文档章节

linux内存管理浅析(一)

lgxheartlikesea
 lgxheartlikesea
发布于 2014/01/14 17:55
字数 888
阅读 118
收藏 2

最近因为项目中需求对linux的内存管理做了一些研究,现记录下来,一是为了自己以后方便深入学习,二是分享给那些需要的人,以便大家共同学习。 
        linux内存管理总体上分为两块:物理内存管理和虚拟内存管理。本篇博客就从这两块进行分析。
        先说物理内存,这个很好理解,就是我们主机中那块内存条,也就是大家口中平常所说的“我的内存是4G”中所指的那个“内存”。现在问题就来了:内存条是物理的,linux内核是个程序,说linux内核管理它,似乎中间缺少了些什么。对!就是介质的“程序化”。linux内核要管理介质,首先要把介质用程序中的一个数据结构表示吧,这样linux内核才能用它啊。先看物理介质“程序化”后的结构图:


        在内核中,一块均匀的物理内存介质,使用一个pg_data_t,如上图所示。为了方便管理,一个pg_data_t又一般分为三个区域:ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。
        ZONE_DMA:在IA-32计算机中一般是16M,适合DMA使用。
        ZONE_NORMAL:表示可直接线性映射到内核段的内存域。
        ZONE_HIGHMEM:这段物理内存是和以后讲的虚拟内存是动态映射的。(是不是感觉有点晕,没关系,后面讲完虚拟内存就可以对应上了。)
        讲到这里,也只是物理内存逻辑上的一种划分,实际中它真正怎么高效管理起来,比如你现在需要2M物理内存,linux内核马上就能分配给你,等会你又要100M内存,一会你用完了要释放,其他进程又要使用等等。现实是linux对这种管理高效到我们几乎感觉不到,这就得意于“伙伴系统”了。先看图:



        linux内核会将每个zone中的可用物理内存,按照2的0次方、1次方等等划分(每个块的物理地址是连续的),并按上图所示组织起来,当某用户需要一块内存时,找到刚好能满足它的块。例如,你需要一个1M内存,那就是4KB*2^8,linux内核就到上图中左侧为8对应的后面链表中去查找,如果找到了,就分配给你,没有就到9对应的里面去找,找到后会将2^9分为2^8和2^1两部分,2^8分配给你,2^1部分放到1对应的链表中。如果1对应的链表中可以合并为2^2,那么就会合并并将这个块调整到2对应的链表中。
       “伙伴系统”管理的最小单位是“页帧”(4KB),但实际上我们应用程序中使用的内存分配函数(比如c语言中的malloc)等是按字节计算的,4KB对我们来说太大,会造成“内部碎片”导致内存浪费,此时linux又有另外一种秘密武器——slab分配器,它就是专门针对这种小内存需求进行物理内存分配的。
       关于物理内存管理,我就点到为此,本篇只给大家一个较为系统的介绍,方便大家深入学习时的一个方向确定,各个细节可以再找其他资料详细参考学习。


© 著作权归作者所有

lgxheartlikesea
粉丝 3
博文 12
码字总数 6103
作品 0
成都
程序员
私信 提问
浅谈Linux服务器究竟设置多大交换分区合适

年前一客户来电,说他们信息中心机房一台Linux服务器运行缓慢,系统服务出现间歇性停止响应,让过去帮忙处理一下这一问题。 到达现场之后,发现此服务器的物理内存是16G,而最初装机的时候,...

袁跃平
2013/02/19
601
1
Off-By-One相关知识点浅析

  背景   在Freebuf上看到一篇文章Exim Off-by-One RCE漏洞(CVE-2018-6789)利用分析(附EXP),在ctf中经常能遇到off-by-one知识点的题型,想不到出现在了真实软件中,有点惊讶,就此机会...

FreeBuf
2018/04/27
0
0
linux 内存管理浅析(二)

上讲中,讲解了linux的物理内存管理,这讲进行虚拟内存管理的讲解。 我们程序猿们经常讲“我new(malloc)了多少内存”,实际上我们使用的new(malloc)申请的内存是“虚拟内存”,更确切的说...

lgxheartlikesea
2014/01/14
518
1
浅析LINUX内存的管理机制

为了提醒自己,也为了让大家对LINUX内存的管理机制有个简单的了解,所以做一下简单的介绍。 硬盘内存:磁盘上用于存放数据的地方 物理内存:linux系统运行的内存 虚拟内存:就是为了满足物理...

沙米笔记
2016/03/07
99
0
深入理解Linux内存管理-之-目录导航

转自:https://blog.csdn.net/gatieme/article/details/52384965 1 内存描述 2 页表管理 3 初始化内存管理

zwfgogo
2018/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
22分钟前
20
3
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部