操作系统读书笔记(6)

内存管理


在单道程序设计系统中,内存被划分为两个部分:一部分供操作系统使用(驻留监控程序、内核),一部分供当前正在执行的程序使用。在多道程序设计系统中,必须在内存中进一步细分出“用户”的部分,以满足多个进程的要求。细分的任务由操作系统动态完成,这称为内存管理。


1、内存管理的关键术语

页:一个固定长度的数据块,储存在二级存储器中(如磁盘),数据页可以临时复制入内存中的页框中

段:一个变长的数据块,存储在二级存储器中。整个段可以临时复制到内存的一个可用区域内(分段),或者将一个段分为许多页,将每页单独复制到内存中


2、内存管理的需求

(1)重定位:重定位即将进程的逻辑地址转化为物理地址。分为静态重定位和动态重定位:静态重定位是指在进程装入内存阶段就将进程的逻辑地址转化为了物理地址,这种方法要求程序必须完整的一次性装入内存且进程的位置不能发生改变,及时使用交换技术在换回是仍然要在原始的位置,所以一般交换技术采用动态重定位;动态重定位是指在进程运行时,每次读取指令的时候进行动态地址转换,需要硬件的支持,称为地址转换器在cpu中。该过程是在执行期间完成的。

覆盖技术是指大的程序无法一次性装入内存,可以在知道程序的架构的时候按模块进行覆盖,原则是不互相调用的同等级的模块可以相互覆盖内存区域。运用该方法的前提是明确知道程序的逻辑架构。覆盖区的长度由覆盖段的最大长度决定。

---------------------------------------------------------------------------------------------------------------------------------------------

交换技术是将进程的全部或者一部分暂时不用的换出内存缓解内存压力,一般交换技术用于不连续存储中,使用动态重定位,因为若使用静态重定位换出的部分在换入时必须换到原始的位置。

(2)保护:每个进程都应该受到保护,以免被其他进程有意或无意地干涉。该进程以外的其他进程中的程序不能未经授权地访问(进行读或写)该进程的内存单元

内存保护的需求必须由处理器(硬件)来满足,而不是由操作系统(软件)满足。这是因为操作系统不能预测程序可能产生的所有内存访问,只能在指令访问内存时来判断这个内存访问是否“违法”(存取数据或跳转),为了实现这一点,处理器硬件必须具有这个能力。


(3)共享:任何保护机制都必须有一定的灵活性,以允许多个进程访问内存的同一部分。内存管理系统必须允许对内存共享区域进程受访访问


(4)逻辑组织:大多数程序被组织成模块,某些模块是不可修改的,某些模块包含可以修改的数据。如果操作系统和计算机硬件能够有效的处理以某种模块的形式组织的用户程序和数据,则会带来很多好处。


(5)物理组织:计算机存储器至少要被组织成两级,内存和外存。让程序员负责组织两级存储器之间的信息流是不切实际的,这显然是一种系统责任,这个任务恰恰是存储管理的本质所在。



3、内存分配

内存的划分分为静态划分和动态划分,都是连续内存存储技术,而非连续内存存储技术有分页、页段式、分段。

(1)固定分区

静态划分预先将物理内存划分为固定分区,当新进程装进内存,选择合适的空闲分区分配给进程。又称为固定分区法,分区的长度可以不同。
管理分区使用分区使用表,表项的内容是分区编号(线性的)、分区大小、分区使用情况。按照分区大小从小到大方式排列。

一种特殊的固定分区法:分页式划分。将内存划分为很小的页框,其中页框远小于上述的分区。两者的区别是:固定分区要求进程存进连续的内存空间,而分页式划分允许进程可以不连续存储在不同的页框。页框的管理使用空闲页框表,将连续空闲的页框集中管理。

静态划分的缺点是会产生大量的内零头,这些分区内部的零头不能再被使用,因为已经分配给既定的进程了,这样就大大浪费了内存空间。这种现象称为内部碎片
为了解决内部碎片的问题,可以采用动态划分技术,将真个用户内存看做整体,动态的将内存划分给需要的进程。


(2)动态分区

动态分区会导致越来越多的碎片,内存的利用率随之下降,这种现象称为外部碎片。克服外部碎片的一种技术是压缩(碎片整理技术):操作系统不时地移动进程,使的进程占用的空间连续,并且所有空闲空间连成一片。但是压缩是一项特别费时的过程,并且浪费了处理器时间。压缩需要重定位的能力,也就是说,必须能够把程序从一块区域哟定到另一块区域,而不会使程序中的内存访问无效。

动态分区划分需要一定的划分算法保证外零头最少,主要的划分算法有:FFA首次适应算法、BFA最佳适应算法、WFA最差适应算法和伙伴分配算法,这就解决了为进程分配内存空间的问题。并不解决是否一次性装入进程的问题。
FFA算法:查询空闲分区表,将第一个适合的空闲分区分给进程,若剩余分区大于阈值则作为新的空闲分区更新分区表,否则全部分给进程。该算法的缺点是造成过多的小外零头,使得进程不能再多装。
 

BFA算法:将空闲分区从小到大排列,选择第一个适合的分区分配给进程,这样保证外零头最小。优点是保证不分割大分区,但是形成过多的无法分割的小的外零头。

WFA算法:将空闲分区从大到小排列,选择第一个适合的分区分配给进程,这样保证了外零头不至于过小能够再次分割,但是总是分割大分区,使得不能装下稍微大的进程。

伙伴算法:将静态分区和动态分区法结合在一起,降低了内零头和外零头的浪费。该算法将内存分为2的幂次方,当第一次划分的时候根据分半的方法划分内存,将两个相邻的同大小的分区成为兄弟分区,当内存回收的时候可以讲兄弟分区合并,这样分区的大小就可以动态变化。



(3)分页

使用分页技术在内存中为每个进程浪费的空间仅仅是进程最后一页的一小部分形成的内部碎片,没有任何外部碎片。

操作系统维护空闲页框的列表,为每个进程维护一个页表,页表给出了该进程的每一页对应的页框的位置,在程序中,每个逻辑地址包括一个页号和在该页中的偏移量。根据进程页表中页号和对应页框的位置,由对应的页框号和偏移量计算出物理地址。

总之,采用简单的分页技术,内存被分成许多大小相等且很小的页框,每个进程被划分成同样大小的页;较小的进程使用较少的页,较大的进程使用较多的页;当一个进程被装入时,它的所有的页都被装入到可用页框中,并且建立一个页表。这种方法解决了分区技术的许多问题。


(4)分段

采用分段技术,可以把程序和其相关的数据划分到几个段中,并不要求所有程序的所有段的长度都相等。和分页技术一样,采用分段技术时的逻辑地址也是由两部分组成:段号和偏移量。在分段方案中,一个程序可以占据多个分区,并且这些分区不要求是连续的,这与动态分区有点不同。分段消除了内部碎片,但是会产生外部碎片。

在简单的分段方案中,每个进程都有一个段表,系统也会维护一个内存中的空闲块列表。每个段表项必须给出相应的段在内存中的起始地址,还必须指明段的长度,以确保不会使用无效的地址


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值