操作系统-内存管理(参考王道)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JACK_JYH/article/details/81987361

内存管理的功能

1.内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配麻烦,提高编程效率。

2.地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理器必须提供地址变换功能,把逻辑地址转换成相应的物理地址。

3.内存空间的扩充:利用虚拟存储技术或者自动覆盖技术,从逻辑上扩充内存。

4.存储保护:保证各道作业在各自的存储空间内运行,互不干扰。

链接的三种方式

1.静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接在一起,形成一个完整的装入模块。

2.装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接方式。

3.运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行的链接,其优点是便于修改和更新,便于实现对目标模块的共享。

装入

绝对装入:在编译时,如果知道程序驻留在内存中的某个位置,编译程序将产生绝对的地址目标代码。绝对装入由于逻辑与实际内存地址相同,故不需要对程序和数据的地址进行修改。绝对装入只适用于单道程序环境,绝对地址可由程序员在编译或者汇编时赋予。

可重定位装入:在多道程序环境下,多个目标模块的起始地址通常都是从0开始,程序中的其他地址都是相对于起始地址的,此时采用可重定位装入方式,根据内存的目前情况,将装入模块装入到内存的适当位置。装入时对目标程序中指令和数据的修改称为重定位,地址变换通常是在装入时一次完成的。所以又称静态重定位。

,静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业,此外,作业一旦进入内存后,在整个运行期间不能在内存中移动。

动态运行时装入:也称为动态重定位,程序在内存中如果发生移动,就需要采用动态的装入方式。装入程序在把装入模块装入内存后,并不立即把装入模块中的相对地址转换成绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持。

动态重定位的特点是可以将程序分配到不连续的存储区中,在程序运行之前可以只装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配的内存,便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

内存保护

两种方式

1.CPU中设置一对上,下限寄存器,存放用户作业在主存中的下限和上限,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。

2.通过采用重定位寄存器(或基址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护,重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值,每个逻辑地址值必须小于界地址寄存器,内存管理机构动态的将逻辑地址与界地址寄存器进行比较,如果未发生地址越界。则加上重定位寄存器的值后映射成物理地址,再送交内存单元。

覆盖与交换技术

1.覆盖

由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可以把用户空间分成为一个固定区和若干个覆盖区。将经常活跃的部分放在固定区,其余部分按照调用关系分段,首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统将其调如覆盖区,替换覆盖区中原有的段。覆盖技术的特点是打破了必须将一个进程的全部信息装入内存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行,再而,大家要注意到,内存中能够更新的地方只有覆盖区的段,不在覆盖区的段会常驻内存。

2.交换

把处于等待状态(或CPU调度原则下被剥夺运行权力)的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出:把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称为换入。

注意:

1.交换需要备份存储,通常是快速磁盘,它必须足够大,并且提供对这些内存映像的直接访问。

2.为了有效使用CPU,需要每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间,转移时间与所交换的空间内存成正比。

3.如果换出进程,比如确保该进程的内存空间成正比。

4.交换空间通常作为磁盘的一整块,且独立于文件系统,因此使用就可能很快。

5.交换通常在有许多进程运行且内存空间吃紧时开始启动,而系统负荷降低就暂停。

6.普通交换使用不多,但交换的策略的某些变种在许多系统中(如UNIX系统)仍然发挥作用。

交换技术主要是在不同进程(或作业)之间进行,而覆盖则用于同一程序或进程中。

连续分配方式

1.单一连续分配方式

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

优点:无外部碎片,可以采用覆盖技术,不需要额外技术支持。

缺点:只能用于单用户,单任务操作系统中,有内部碎片,存储器利用率极低。

2.固定分区分配

固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后背作业队列中,选择适当大小的作业装入该分区,如此循环。

1.分区大小相等:用于利用一台计算机控制多个相同对象的场合,缺乏灵活性

2.分区大小不等:划分为含有多个较小的分区,适量的中等分区及少量的大分区。

优点:1.没有外部碎片

缺点:1.程序可能太大而放不进任何一个分区中,这时用户不得不使用覆盖技术来使用内存空间。

2.主存利用率低,当程序小于固定分区大小时,也占用一个完整的内存分区空间,这样分区内部有空间浪费,这种现象称为内部碎片。

3.不能多个进程共享一个主存区

3.动态分区分配

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

缺点:外部随便很多(通过紧凑消除,就是操作系统不时地对进程进行移动和整理。但是这需要动态重定位寄存器地支持,且相对费时。紧凑地过程实际上类似于Windows系统中地磁盘整理程序,只不过后者是对外存空间地紧凑)

1.首次适应算法

2.最佳适应算法

3.最坏适应算法

4.邻近适应

首次适应不仅最简单,通常也是最好最快,不过首次适应算法会使得内存低地址部分出现很多小的空闲分区,而每次查找都要经过这些分区,因此也增加了查找的开销。邻近算法试图解决这个问题,但实际上,它常常会导致在内存的末尾分配空间分裂成小的碎片,它通常比首次适应算法结果要差。

最佳导致大量碎片,最坏导致没有大的空间。

进过实验,首次适应比最佳适应要好,他们都比最坏好。

非连续分配管理

需要额外地空间存储(分散区域)地索引,使得非连续分配地方式存储密度低于连续存储方式。

根据分区大小是否固定分为分页存储管理方式和分段存储管理方式。

1.分页存储管理方式(根据是否把所有页面都装入内存分为)

1.1 基本分页存储管理

1.2请求分页存储管理

分页的方法形式上看,像分区相等的固定分区技术,分页管理不会产生外部碎片,但它又又本质不同点:块的大小相对分区要小很多,而且进程页按照块进行划分,进程运行时按块申请主存可用空间执行。每个进程平均只产生半个块大小的内部碎片(也称页内碎片)

进程中的块称为页,内存中的块称为页框(页帧),外存页以同样的单位进行划分,直接称为块。

页面过小页表占用空间大,页面过大,碎片大。

页式管理只需要给出一个整数就能确定对应的物理地址,这是因为页面大小L是固定的,因此,页式管理中地址空间是一维空间。

地址变换机构

有快表的地址变换机构

(有些处理机设计为快表和慢表同时查找,如果在快表中查找成功则终止慢表的查找。

3.分段存储管理方式

分段管理方式的提出则是考虑了用户和程序员,以满足方便编程,信息保护和共享,动态增长及动态链接等多方面的需要。

段内要求连续,段间不要求连续

在段式系统中,段号和段内偏移量必须由用户显示提供,在高级程序设计语言中,这个工作由编译程序完成。

段表:每个进程都有一张逻辑空间与内存空间映射的段表,其中每一个段表项对应进程的一个段,段表项记录该段在内存中的起始地址和段的长度。

地址变换机构:

为了查询方便,顶级页表最多只能有1个页面

段页式存储管理方式:

页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享。

作业的地址空间首先被分成若干个逻辑段,每段都有自己的段号,然后再将每一段分成若干个大小固定的页。

逻辑地址有三部分构成:段号,页号,页内偏移量

段表表项:段号,页表长度,页表起始地址

页表表项:页号,块号

段表寄存器:指出段表起始地址和段表长度

页表寄存器:判断是否越界

重要概念

1.虚拟内存的管理需要有相关硬件和软件的支持,有请求分页页表机制,缺页中断机制,地址变换机构等。

2.在使用交换技术时,如果一个进程正在进行I/O操作时,则不能交换出主存。否则它的I/O数据区将被新换入的进程占用,导致错误,不过可以在操作系统中开辟I/O缓冲区,将数据从外设或将数据输出到外设的I/O活动在系统缓冲区中进行,这时在系统缓冲区与外设I/O时,进程交换不受限制。

3.当程序要访问某个内存单元时,由硬件检查是否允许,如果允许则执行,否则产生地址越界中断。

4.段页式存储管理中,地址映射表是每个进程一张页表,每个段一张段表。

5.内存保护需要由操作系统和硬件机构合作完成,以保证进程空间不被非法访问,内存保护是内存管理的一部分,是操作系统的任务,但是处于安全性和效率考虑,必须由硬件实现,所以需要操作系统和硬件机构的合作来完成。

6.覆盖技术是早期在单一连续存储管理中使用的扩大存储容量的一种技术,它同样也可用于固定分区分配的存储管理者中。

7.分页式存储管理有内部碎片,分段式存储管理有外部碎片,固定分区存储管理方式有内部碎片,分页式存储管理方式有内部碎片。

8.页式存储管理中,页表的始地址存放在寄存器中(页表基址寄存器(PTBR)),这样才能满足在地址变换时,能够较快地完成逻辑地址和物理地址之间的转换。

9.对重定位存储管理方式,应在这个系统中设置一个重定位寄存器。因为系统处理器在通一个时刻只能执行一条指令或访问数据,所以为每道程序(数据)设置一个寄存器是没有必要的,而只需要在切换程序执行时重置寄存器内容即可。

10.采用可重用程序是通过减少对换数的方法来改善系统性能的。可重入程序通过共享来使用同一块存储空间,或者通过动态链接的方式将所需程序映射道相关进程中,其最大的优点是减少了对程序的调入/调出,因此减少了对换数量。

11.实现分页,分段式存储需要特定的数据结构,例如,页表,段表等,为了提高性能还需要提供快存和地址加法器,代价高。分区存储管理满足多道程序设计的最简单存储管理方案,特别适合嵌入式等微型设别。

12.引入覆盖和交换技术是时间换空间。

13.页式存储页面大小是等长的。

14.引入段式存储管理方式,主要是为了满足用户下列要求:方便编程,分段共享,分段保护,动态链接和动态增长

15.主存分配以块为单位,访问以字节为单位。

16.存储管理目的:1方便用户2提高内存利用率

17.分页是一维,分段是二维,因为分页定长。

18.在多个进程并发执行时,所有进程的页表大多数驻留在内存中,在系统中设置一个页表寄存器(PTR),在其中存放页表在内存的起始地址和页表长度,平时,进程未执行时,页表的起始地址和页表长度存放在本进程的PCB中,当调度到进程时,才将两个数据转入页表寄存器,每个进程都有一个单独的逻辑地址,有一张属于自己的页表。

19.段页式存储管理兼有页式管理和段式管理的优点,采用分段方法来分配和管理用户地址空间,用分页方法来管理物理存储空间,但它的开销比分段式和页式管理的开销都要大。

问答

1.为什么要进行内存管理?

单道处理机系统阶段,一个系统一个时间只执行一个程序,内存分配简单。多道程序引入后,进程之间除了共享的不仅仅是处理机,还有主存储器。共享内存比较复杂,此时不对内存进行管理,容易导致数据混乱,以至于限制进程并发执行。

2.页式管理中每个页表项的大小下限如何确定?

首先用总的位数m-页内位数n,得到页号的位数x,然后取log2x,然后对结果向上取正,因为页表项以字节为单位。(也可以选择更大的页表项大小以至于让一个页面能够正好容下整数个页表项以方便存储(例如取成4B,那么一页正好可以装下1K个页表项)或者增加点其他什么信息)

3.多级页表解决了什么问题?又会带来什么问题?

多级页表解决了当逻辑地址空间过大时,页表长度会大大增加的问题。而采用多级页表时一次访盘需要多次访问内存升至磁盘,会大大增加一次方寸的时间。

题目

1.(2011考研)在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是(C)

A.编辑 B.编译 C.链接 D.装载

编译后的程序需要经过链接才能装载,而链接后形成的目标程序中的地址是逻辑地址。以,C语言为例:C语言经过预处理(cpp)-->编译(ccl)-->汇编(as)-->链接(ld)产生了可执行文件。其链接的前一步,产生了可重定位的二进制的目标文件。C语言采用源文件独立编译的方法,如程序main.c,file.c,file1.h,file2.h,在链接的前一步生成了main.o,file1.o,file2.o,这些目标模块采用的逻辑地址都从0开始,但只是相对该模块的逻辑地址。但只是相对于该模块的逻辑地址,链接器将这三个文件,libc和其他库文件链接成一个可执行文件,链接阶段主要完成重定位,形成整个程序的完整逻辑地址空间。(完成该变换过程的是装载阶段)

2.(2010考研)

某计算机采用二级页表的分页存储管理方式,按字节编址,页大小为2^10字节,页表项大小为2字节,逻辑地址结构为

页目录号|页号|页内偏移量

逻辑地址空间大小为2^16,则表示整个逻辑地址空间的目录表中包含表项的个数至少是(128)

猜你喜欢

转载自blog.csdn.net/JACK_JYH/article/details/81987361