Linux内存管理(一)——从硬件角度看内存管理

从硬件角度看内存管理

①、在操作系统还没有出来之前,程序都是被存放在卡片上,计算机读取一张卡片就运行一条指令。这种从外部存储介质上直接运行指令的方法效率很低
②、单道编程的内存管理
所谓单道,就是整个系统只有一个用户进程和一个操作系统。在这种模式下,用户程序总是加载到同一个内存地址上运行。所以内存管理很简单,实际上不需要任何的内存管理单元,因为程序使用的地址就是物理地址,而且也不需要地址保护。缺点:无法运行比实际物理内存大的程序;其次,系统只运行一个程序,造成资源浪费;其三,无法移植到其他的计算机中运行
③、多道编程的内存管理
所谓多道变成,就是系统可以同时运行多个进程,在内存管理中,出现了固定分区动态分区两种技术

固定分区

固定分区,就是在系统编译阶段主存被划分成许多静态分区.
优点:进程可以装入大于或者等于自身大小的分区。这个实现起来比较简单,操作系统管理开销也比较小
缺点
1、程序大小和分区的大小必须匹配;
2、活动进程的数目比较固定;
3、地址空间无法增长。

因为固定分区方法有缺点,动态分区的方法自然而然就出现了

动态分区

动态分区的思想也比较简单,就是在一整块内存中首先划出一块内存是给操作系统本身使用,剩下的内存空间给用户进程使用。

比如:当第一个进程A运行时,先从这一大片内存中切割一块与进程A大小一样的内存给进程A使用。当第二个进程B准备运行时,我们可以从剩下的空闲内存中继续切割一块和进程B大小一样的内存块给进程B使用。以此类推,这样进程A和进程B以及后面进来的进程就可以实现动态分区了。

但是动态分区的方法有一个缺陷:那就是有可能会产生很多的内存空洞,导致内存的利用率也随着下降,其实这些内存空洞就是我们常说的内存碎片。那么这个内存碎片是怎么产生的呢?看一下下面的例子你们就能够理解了。

比如:进程A使用了操作系统往上的10MB内存,进程B使用了进程A往上的6MB内存,进程C使用了进程B往上的8MB内存。假如进程D需要的是5MB的内存,那么剩下的4MB(假设总共有32MB,除去操作系统的4MB剩下28MB)不足以装载进程D,那么第一个内存空洞就产生了。假设某个时刻,操作系统需要运行进程D,这时系统中没有足够的内存,就需要选择一个进程来换出,以便为进程D腾出足够的空间,假设操作系统选择进程B来换出,这样进程D就装载到了原来进程B的地址空间内,于是产生了第二个内存空洞(因为进程B占有的内存是6MB,而进程D只需要5MB,多出了1MB的内存)。那么动态分区这个缺点怎么来解决呢

为了解决碎片化的问题,操作系统需要动态的移动进程,使得进程占用的空间是连续的,并且所有空闲空间也是连续的。但是,整个进程的迁移是一个非常耗时的过程。不管是固定分区法,还是动态分区法,都存在很多问题:

a、进程地址空间保护问题:所有的用户进程都可以访问全部的物理内存,所以恶意的程序可以修改其他程序的内存数据,这是的进程一直处于危险和担惊受怕的状态下。即使系统里的所有进程都不是恶意进程,但是进程A依然可能不小心修改了进程B的数据从而导致进程B运行崩溃。这明显违背了“进程地址空间需要保护”的原则,也就是地址空间要相对独立。因此每个进程的地址空间都应该受到保护,以免被其他进程有意或者无意地伤害

b、内存使用效率低:如果即将要运行的进程所需要的内存空间不足,就需要选择一个进程进行整体换出,这种机制导致有大量的数据需要换出和换入,效率非常低下

c、程序运行地址重定位问题:进程每次在换出换入时运行的地址都是不固定的,这给程序的编写带来了一定的麻烦,因为访问数据和指令跳转时的目标地址通常是固定的,这就需要重定位技术了
由此可见,上述3个重大问题需要一个全新的解决方法,而且这个方案在操作系统层面已经无能为力了,必须要在处理器层面解决,因此产生了分段机制分页机制

分段机制

人们最早想到的一种机制叫做分段机制。其基本思想就是把程序所需要的内存空间的虚拟地址映射到某个物理地址空间中。

分段机制可以解决地址空间保护问题:两个不同的进程会被映射到不同的物理地址空间中,它们在物理地址空间是不会有重叠的。如果一个进程访问了没有映射的虚拟地址空间,或者访问了不属于该进程的虚拟地址空间,那么CPU会捕捉到这个越界访问,并且拒绝该次访问,同时CPU会发送一个异常错误给操作系统,由操作系统去处理这些异常情况,这就是我们常说的缺页异常。

分段机制解决问题的思路可以总结为:增加一个虚拟内存,进程运行时看到的地址是虚拟地址,然后需要CPU提供的地址映射方法,把虚拟地址转换为实际的物理地址,这样多个进程同时运行时,就可以保证每个进程的虚拟内存空间是相互隔离的,操作系统只需要维护虚拟地址到物理地址的映射关系即可。

但是分段机制也有不足之处:它的内存使用效率依然是比较低。分段机制对虚拟内存到物理内存的映射依然是以进程为单位,也就是当物理内存不足时,换出到磁盘的依然是真个进程,因此会导致大量的磁盘访问,从而影响系统性能。因此,分页机制就产生了

分页机制

上面提到的分段机制的地址映射的粒度太大, 以整个进程地址空间为单位的分配方式导致内存的利用率不高。
分页机制把这个分配机制的单位继续细分成固定大小的页,进程的虚拟地址空间也按照页来进行分割。这样常用的数据和代码就可以以页为单位驻留在内存中,而那些不常用的页可以交换到磁盘中,从而节省物理内存,这比分段机制要高效得多。
分页机制的实现离不开硬件的实现。在CPU内部有一个专门的硬件单元来负责这个虚拟页面到物理页面的转换,它就是内存管理单元(MMU)

内存管理单元(MMU)

ARM处理器的内存管理单元包括TLBTable Walk Unit两个部件。

TLB是一块高速缓存,用于缓存页表转换的结果,从而减少内存访问的时间。一个完整的页表翻译和查找的过程叫做页表查询,页表查询的过程是由硬件自动完成,但是页表的维护需要软件来完成。页表查询是一个相对耗时的过程,理想的状态是TLB里缓存有页表转换的相关信息。当TLB未命中时,才会去查询页表,并且开始读入页表的内容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值