关闭

内存管理

717人阅读 评论(0) 收藏 举报
分类:

要谈内存管理,就不得不先说说存储器,因为内存也是存储器中的一种。

存储器

存储器是计算机系统的重要组成部分,计算机中的存储器结构如下:


 

CPU寄存器访问速度最快,完全能与CPU协调工作,但由于价格昂贵,其容量很小,它的作用在于加速存储器的访问速度。

cache是高速缓存,其容量大于寄存器,小于主存,访问速度快于主存。将主存中的一些经常访问的信息存放到高速缓存中,减少访问主存储器的次数,可以大幅度提高程序的执行速度。

主存就是我们常说的内存,用于保存进程运行时的程序和数据。

内存管理就是管理主存,操作系统必须将内存空间进行合理地划分和有效地动态分配,来提高内存利用率。

在进行具体的内存管理之前,我们首先要了解进程运行的基本原理。

程序的装入和链接

要使程序运行,必须先为之创建进程,而创建进程的第一件事情就是将程序和数据装入内存。将用户程序变为可以在内存中执行的程序,需要经过一下几个步骤:

1.  编译:由编译程序将用户源代码编译成若干个目标模块。

2.  链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。

3.  装入:由装入程序将装入模块装入内存运行。

步骤如下图:


内存分配

 

内存的分配分为连续分配方式和非连续分配方式。

连续分配方式,是指为一个用户程序分配一个连续的内存空间。它主要包括单一连续分配、固定分区分配和动态分区分配。

非连续分配允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式,分段存储管理方式和段页式存储管理方式。

下面我们会介绍每一种内存分配方式。

单一连续分配

内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。

这种方式的优点是简单、无外部碎片,可以釆用覆盖技术,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。

 

固定分区分配

固定分区分配将用户内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中,选择适当大小的作业装入该分区,如此循环。

该方式无外部碎片,但不能实现多进程共享一个主存区,所以存储空间利用率低。固定分区分配很少用于现在通用的操作系统中,但在某些用于控制多个相同对象的控制系统中仍发挥着一定的作用。

动态分区分配

动态分区分配是一种动态划分内存的好方法,这种分区不预先将内存划分,而是在进程装入内存时,根据进程的大小动态的分区,并使分区的大小正好适合进程的需要。

动态分区在开始分配时是很好的,但是之后会导致内存中出现许多小的内存块。随着时间的推移,内存中会产生越来越多的碎片。

 

好啦,连续分配方式说完了,接下来是非连续分配方式了。

基本分页存储管理

固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低。我们希望内存的使用能尽量避免碎片的产生,这就引入了分页的思想:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。

分页的方法从形式上看,像分区相等的固定分区技术,分页管理不会产生外部碎片。但它又有本质的不同点:块的大小相对分区要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用空间并执行。这样,进程只会在为最后一个不完整的块申请一个主存块空间时,才产生主存碎片,所以尽管会产生内部碎片,但是这种碎片相对于进程来说也是很小的。

 

前面所说的块,在进程中就称为页。为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般存放在内存中。

在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。如下图:


基本分段存储管理

分页管理方式是从计算机的角度考虑设计的,以提高内存的利用率,提升计算机的性能, 且分页通过硬件机制实现,对用户完全透明;而分段管理方式的提出则是考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长动态链接等多方面的需要。

 

在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。

例如,用户进程由主程序、两个子程序、栈和一段数据组成,于是可以把这个用户进程划分为5个段,每段从0 开始编址,并分配一段连续的地址空间(段内要求连续,段间不要求连续,因此整个作业的地址空间是二维的)。其逻辑地址由段号S与段内偏移量W两部分组成。

如下图所示,段号为16位,段内偏移量为16位,则一个作业最多可有216=65536个段,最大段长为64KB。


和分页存储管理中的页表一样,分段存储管理方式中也有段表,段表记录该段在内存中的起始地址和段的长度,段表用于实现从逻辑段到物理内存区的映射。如下图:


段页式存储管理

页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享。如果将这两种存储管理方法结合起来,就形成了段页式存储管理方式。

 

在段页式系统中,作业的地址空间首先被分成若干个逻辑段,每段都有自己的段号,然后再将每一段分成若干个大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干个和页面大小相同的存储块,对内存的分配以存储块为单位,如图






2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:236074次
    • 积分:4037
    • 等级:
    • 排名:第7962名
    • 原创:146篇
    • 转载:0篇
    • 译文:0篇
    • 评论:76条
    博客专栏