Linux内存管理
(文字来源:
cnblogs /autum/archive/2012/10/12/
linuxmalloc
)
摘要:本文针对Linux操作系统的内存管理进行详细阐述,包涵了物理内存与虚拟内存的管理机
制。
关键字:虚拟内存;物理内存;地址映射;内存管理
1 为什么需要使用虚拟内存
大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多。问题是内存空间太
小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕。所以提出了虚拟内存,使得每个进程
用于G的独立用户内存空间和共享的G内核内存空间。(每个进程都有自己的页表,才使得G用户空间
的独立)这样进程运行的速度必然很快了。而且虚拟内存机制还解决了内存碎片和内存不连续的问题。为
什么可以在有限的物理内存上达到这样的效果呢?
2 虚拟内存的实现机制
首先呢,提一个概念,交换空间(swap s pace),这个大家应该不陌生,在重装系统的时候,会让
你选择磁盘分区,就比如说一个硬盘分几个部分去管理。其中就会分一部分磁盘空间用作交换,叫做
swap s pace。其实就是一段临时存储空间,内存不够用的时候就用它了,虽然它也在磁盘中,但省去了
很多的查找时间啊。当发生进程切换的时候,内存与交换空间就要发生数据交换一满足需求。所以啊,进
程的切换消耗是很大的,这也说明了为什么自旋锁比信号量效率高的原因。
那么我们的程序里申请的内存的时候,linux内核其实只分配一个虚拟内存( 线 性地址),并没有分
配实际的物理内存。只有当程序真正使用这块内存时,才会分配物理内存。这就叫做延迟分配和请页机制
释放内存时,先释放线性区对应的物理内存,然后释放线性区;"请页机制"将物理内存的分配延后了,这
样是充分利用了程序的局部性原来,节约内存空间,提高系统吞吐;就是说一个函数可能只在物理内存中
呆了一会,用完了就被清除出去了,虽然在虚拟地址空间还在。(不过虚拟地址空间不是事实上的存储,
所以只能说这个函数占据了一段虚拟地址空间,当你访问这段地址时,就会产生缺页处理,从交换区把对
应的代码搬到物理内存上来)
3 物理内存与虚拟内存的布局
如图所示,左边是物理地址分配,与实际的CPU相关。KB的这些都是一些控制器所占有,比如
lcdc sd卡,他们的寄存器地址就是这样定死的。但是呢,我们要访问这些寄存器的时候,还是不能直接用
要使用内存管理的规则,使用虚拟地址去访问它,所以在驱动等内核程序中需要使用虚拟地址访问寄存器
如果有人直接使用物理地址访问寄存器,那么唯一的解释就是没有开mmu。不过这样你的进程就没有G
内存可以用了。
1/ 4
Liunx 内存管理