linux系统中 文件存储空间的管理,Linux系统的存储管理

Linux系统采用了虚拟内存管理机制,就是交换和请求分页存储管理技术。这样,当进程运行时,不必把整个进程的映像都放在内存中,而只需在内存保留当前用到的那一部分页面。当进程访问到某些尚未在内存的页面时,就由核心把这些页 面装入内存。这种策略就使进程的虚拟地址空间映射到机器的物理空间时具有更大的灵活性,通常允许进程的大小可大于可用内存的总量,并允许更多进程同时在内 存中执行。

1 Linux的多级页表

在x86平台的Linux系统中,地址码采用32位,因而每个进程的虚存空间可达4GB。Linux内核将这4GB的空间分为两部分:最高地址的 1GB是“系统空间”,供内核本身使用;而较低地址的3GB是各个进程的“用户空间”。系统空间由所有进程共享。虽然理论上每个进程的可用用户空间都是 3GB,但实际的存储空间大小要受到物理存储器(包括内存以及磁盘交换区或交换文件)的限制。

由于Linux系统中页面的大小为4KB,因此进程虚存空间要划分为1M个页面。如果直接用页表描述这种映射关系,那么每个进程的页表就要有1M个表项。为此,Linux系统采用三级页表的方式。

地址映射是与具体的CPU和MMU(内存管理单元)相关的。对于i386来说,CPU只支持两级模型,而从Pentium Pro开始,允许将地址从32位提高到36位,并且在硬件上支持三级映射模型。

2 内存页的分配与释放

一般来说,Linux系统采用两种方法来管理内存页:位图和链表。

利用位图可以记录内存单元的使用情况。用一个二进制位(bit)记录一个内存页的使用情况:如果该内存页是空闲的,则对应的位是1;如果该内存页已经分配出去,则对应的位是0。分配内存时就检测该位图中的各个位,找到所需个数的连续位值为1的位图位置,进而就获得所需的内存空间。

利用链表可以记录已分配的内存单元和空闲的内存单元。采用双向链表结构将内存单元链接起来,从而可以加速空闲内存的查找或链表的处理。

Linux系统的物理内存页分配采用链表和位图相结合的方法。

在分配内存页组时,如果系统对于分配请求有足够的空闲内存页,Linux的页面分配程序首先搜索等于要求数量的最小页组的信息,然后在对应的双向链 表中查找空闲页组;如果没有与所需数量相同的空闲内存页组,则继续查找下一个空闲页组(其大小为上一个页组的2倍)。如果找到的页组大于所要求的页数,则 把该页组分为两部分:满足所请求的部分,把它返回给调用者;剩余的部分,按其大小插入到相应的空闲页组队列中。

当释放一个页面组时,页面释放程序就会检查其上下是否存在与它邻接的空闲页组。如果有,则把该释放的页组与所有邻接的空闲页组合并成一个大的空闲页组,并修改有关的队列。

3 内存交换

当系统中出现内存不足时,Linux内存管理子系统就需要释放一些内存页,从而增加系统中空闲内存页的数量。此任务是由内核的交换守护进程kswapd完成的。kswapd也受内核的调度。但是,它没有自己独立的地址空间,只使用系统空间,所以也把它称为线程。它的任务就是保证系统中有足够的空闲内存页。

当系统启动时,交换守护进程由内核的ini(初始化)进程启动。它在完成一些简单的初始化操作之后便进入无限循环,在每次循环的末尾会进入睡眠。内核在一定时间以后又会唤醒并调度它继续运行。

交换守护进程所做的工作主要分为两部分。第一部分是在发现可用的内存页面已经短缺的情况下,则找出若干不常用的内存页面,使它们从活跃状态(至少有一个进程的页表项指向该页面)变为不活跃状态(不再有任何进程的页表项指向该页面),为页面换出做好准备。第二部分是每次都要执行的工作,把那些已经处于不活跃状态的“脏”页面(即内存页的内容与盘上页面的内容不一致)写入交换设备,使它们成为不活跃“干净”页面(内存页面内容与盘上页面内容一致),继续缓冲或者回收一些内存页,使之成为空闲的内存页。

如果空闲的内存页数量大于上限值,则交换守护进程就不做任何事情,而进入睡眠状态;如果系统中的空闲内存页数量低于上限值,甚至低于下限值,则交换进程将用以下三种办法减少系统正在使用的内存页数:

(1)减少缓冲区和页高速缓存的大小。如果不再需要这些缓存中包含的某些页面,则释放它们,使之成为空闲的内存页。

(2)把System V的共享内存页(实际是一种进程间通信机制)交换到交换文件,从而释放出物理内存。

(3)将页面换出物理内存或者直接抛弃它们。kswapd进程首先选择可交换的进程,然后把该进程一部分页面换出内存(如果它们是“脏”的),而大部分页面可被直接抛弃。上述两种情况下的那些物理页面都成为可供进程分配使用的空闲内存页。

作为交换空间的交换文件实际就是普通文件,但它们所占的磁盘空间必须是连续的,即文件中不能存在“空洞”(即中间没有任何数据但也无法写入的空间)。核心在交换设备上是分配一片连续空间,而不管碎片问题。另外,交换文件必须保存在本地硬盘上。

交换分区和其他分区没有本质区别,但交换分区中不能包含任何文件系统。通常,最好将交换分区的类型设置为Linux Swap。

(studyarea)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值