1 / 139

第四章 存储器管理

第四章 存储器管理. 4.1 引 言. 众所周知,存贮器是计算机的重要资源。它直接为 CPU 提供执行的指令和数据,而且还要与 I/O 系统频繁地进行数据交换。因此,如何管理存贮器,使它得到充分利用,这是操作系统的重要课题。 一、存贮器管理功能 存贮器作为操作系统管理的一部分重要资源,其管理的目的有两个:一是方便用户使用,二是提高存贮器的利用率。.

Télécharger la présentation

第四章 存储器管理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 存储器管理

  2. 4.1 引 言 众所周知,存贮器是计算机的重要资源。它直接为CPU提供执行的指令和数据,而且还要与I/O系统频繁地进行数据交换。因此,如何管理存贮器,使它得到充分利用,这是操作系统的重要课题。 一、存贮器管理功能 存贮器作为操作系统管理的一部分重要资源,其管理的目的有两个:一是方便用户使用,二是提高存贮器的利用率。

  3. 多道程序出现后,共享主存首先要解决好存贮分配和各程序安全地在主存运行的问题。由于用户程序和非常驻的系统程序是随机且动态地进入系统的,因此,不论是用户还是系统均不能预先知道其程序究竟放在存贮器的哪一部分。它们不能按主存的实际地址编程,只能用相对地址或逻辑地址编程。这样,存贮器管理应主要涉及以下四方面内容:多道程序出现后,共享主存首先要解决好存贮分配和各程序安全地在主存运行的问题。由于用户程序和非常驻的系统程序是随机且动态地进入系统的,因此,不论是用户还是系统均不能预先知道其程序究竟放在存贮器的哪一部分。它们不能按主存的实际地址编程,只能用相对地址或逻辑地址编程。这样,存贮器管理应主要涉及以下四方面内容:

  4. (1) 存贮器分配 主要解决多道程序共享主存和如何进行主存分配的问题(即存贮分配采用的算法问题)。 • (2) 地址转换或重定位 研究各种地址变换方法以及相应的地址变换机构。 • (3) 存贮器保护 研究采用什么方法保护存贮器的各种信息彼此不被破坏的问题。

  5. (4) 存贮器扩充 研究采用多级存贮技术实现虚拟存贮及所用的各种调度算法。 二、存贮器管理中使用的几个概念 1、地址空间 在用汇编语言或高级语言编写的程序中,对数据和子程序的访问通常是用符号名进行的。

  6. 把程序中的各种符号名的集合所限定的空间叫程序的名空间。把程序中的各种符号名的集合所限定的空间叫程序的名空间。 经编译程序处理后,源程序中的各种符号名转换成机器指令和数据的目标程序,并用实际地址码替换符号地址。这种经编译或连接后目标代码所限定的地址域叫该程序的地址空间。地址空间中各个地址叫做相对地址,或逻辑地址,又叫虚地址。

  7. 这是因为编译程序在对一个源程序编译时,总是以“0”作为参考地址,其它所有地址都是以0为起始地址顺序编码的。这是因为编译程序在对一个源程序编译时,总是以“0”作为参考地址,其它所有地址都是以0为起始地址顺序编码的。 2、存贮空间 存贮空间是指物理存贮器中全部物理单元的集合所限定的空间。而存贮空间是由字或字节组成的一个大的阵列,每一个字或字节都有它自己的编号地址。存储空间中各个地址叫做绝对地址,或物理地址,又叫实地址。

  8. CPU就是通过使用这种地址存取存贮空间的程序和数据的。 显然地址空间的大小由被编译的源程序决定,而存贮空间的大小由系统的硬件配置决定的。一个程序只有从地址空间装入到存贮空间后才能运行。 3、地址重定位(Relocation) 用户程序装入主存后才能运行。当其要装入主存时,首先要为它分配一个适当的存贮空间。

  9. 由于地址空间的逻辑地址往往与分配到的存贮空间的物理地址不一致,而处理机执行用户程序时,所要访问的指令和数据地址必须是实际的物理地址。这样必须把逻辑地址转换为物理地址。这种把程序地址空间的逻辑地址转换为存贮空间的物理地址的工作叫地址重定位,又叫地址映射或地址变换(Addrass mapping or relocation)。 用户程序由地址空间装入到存贮空间是由装入程序实现的。

  10. 根据用户程序地址变换的时间和所采用的技术不同,地址重定位的方式又分为静态重定位和动态重定位两种。根据用户程序地址变换的时间和所采用的技术不同,地址重定位的方式又分为静态重定位和动态重定位两种。

  11. (1) 静态重定位 系统需要一个静态重定位装入程序。在作业装入时,装入程序把用户程序地址空间中的指令和数据的相对地址全部转换成存贮空间的绝对地址。这样在程序执行时要访问的地址就是实际主存的地址。我们把这种由装入程序进行的地址变换叫静态重定位。 • (2) 动态重定位 动态重定位是靠硬件的地址转换机构来实现的。

  12. 通常采用的办法是设置一个重定位寄存器。在存贮管理为程序分配一个主存区域后,装入程序把程序和数据原样装入到分配的存贮区中,然后把这个存贮区的起始地址送入重定位寄存器中。在程序执行时,先将相对地址转换成主存的绝对地址,才能进行存贮器的访问。由于这种定位方式是在程序执行过程中进行的,所以叫动态重定位。通常采用的办法是设置一个重定位寄存器。在存贮管理为程序分配一个主存区域后,装入程序把程序和数据原样装入到分配的存贮区中,然后把这个存贮区的起始地址送入重定位寄存器中。在程序执行时,先将相对地址转换成主存的绝对地址,才能进行存贮器的访问。由于这种定位方式是在程序执行过程中进行的,所以叫动态重定位。

  13. 假定一个程序装入到起始地址为1000的内存区中。当CPU执行取指令操作“LOAD A,500”时,该指令所在的地址为10。这样CPU地址寄存器的内容为10。为了执行取指令,首先系统对其进行地址重定位。重定位装置将相对地址10与重地位寄存器中的1000相加,生成绝对地址,并将该地址送内存地址寄存器,实现取指令的操作。图4.1给出了动态重定位变换过程。

  14. 由此可见,静态重定位不需要硬件支持,因而容易实现。但静态重定位是在程序装入时进行的,要求程序占有连续的存贮区,不能实现存贮器共享,程序执行时也不允许其代码在主存移动。主存利用率较低。由此可见,静态重定位不需要硬件支持,因而容易实现。但静态重定位是在程序装入时进行的,要求程序占有连续的存贮区,不能实现存贮器共享,程序执行时也不允许其代码在主存移动。主存利用率较低。 与静态重定位相比,动态重定位有如下优点: ① 程序不必占有连续的存贮空间。

  15. 为了充分利用主存,系统可将用户程序从一个区域移到在主存的另一个区域。移动后,只要按新分配的存贮空间的起始地址修改重定位寄存器即可。为了充分利用主存,系统可将用户程序从一个区域移到在主存的另一个区域。移动后,只要按新分配的存贮空间的起始地址修改重定位寄存器即可。 ② 便于多用户共享存贮器中的同一 程序。 ③ 主存利用率高。

  16. 4.2单用户单道程序的存贮分配 最简单的存贮管理方案是单一连续区的分配。它用在早期的单道批处理和个人计算机的单用户单任务系统中。单一连续区分配是指主存只有一个用户作业。用户把程序从磁盘或磁带上装入主存,占据全部存贮空间和所有系统资源。 在个人计算机中,这种管理方法将,存贮器划分为两部分:一部分是操作系统,另一部分是用户作业(或进程)。如图4.2所示。

  17. 0

  18. 操作系统驻留在RAM(Random Access Memory)低地址部分;或驻留在ROM(Read Only Memory)高地址部分;或设备驱动程序驻留在ROM的高地址部分,操作系统的其余部分在RAM的低地址部分。如,UNIX系统和DOS系统通常是这样安排的;IBM PC机的DOS操作系统采用图4.2(c)的结构,设备驱动程序位于1M字节地址空间的高8k的地址中,这部分程序叫做BIOS(Basic Input Output System)。

  19. 4.3 多用户多道程序的存贮分配——分区分配 分区分配的存贮管理是为了适应多道程序设计技术而产生的最简单的存贮管理。它把主存划分成若干个区域,每个用户占有一个。根据分区情况,又分为固定式分区和可变式分区。 一、固定式分区 固定式分区是适合多道程序的最简单存贮管理。它把主存预先划分成几个大小不等的分区。

  20. 当作业到达时,选择一个适合作业要求的最小空闲区分给作业,或当没有可用的空闲分区时,让其在该分区队列中等待。图4.3 的(a)给出了让作业按大小分别排入各分区队列中等待的情况。 为了充分利用存储器,系统只维持一个等待存贮器的队列。任何时候,只要有一个分区变为空闲,队列中的一个作业就可装入运行。如图4.3(b)。

  21. 多个作业等待队列 一个作业等待队列 分区3(200K) 分区2(100K) 分区3(200K) 分区2(100K) 分区4(132k) 分区4(132k) 分区1(30k) 分区1(30k) 操作系统(50K) 操作系统(50K) (b)单作业队列 (a)多作业队列 图4.3 固定式分区的组织

  22. 为了实现固定式分区管理,系统通常设置一个主存分区使用说明表,用以描述各分区的分配情况。该表如下所示。为了实现固定式分区管理,系统通常设置一个主存分区使用说明表,用以描述各分区的分配情况。该表如下所示。 分区起始地址 分区大小 占用标志 50k 30k J1 80k 100k 0 180k 200k J2 380k 132k 0

  23. 固定式分区管理方案在IBM 360计算机上曾使用多年,由操作人员在每天早上根据当天情况,把存贮器划分成若干个分区。这种方法简单,易于实现。 采用这种技术,虽然可使多个作业共享主存,但主存利用是不充分的。

  24. 二、可变式分区 为了提高存贮器的利用率,存贮空间的划分在装入作业时进行。当作业要求运行时,由系统从空闲可用的存贮空间划分出一大小正好等于作业大小的存贮区分配给作业。这种技术就叫可变式分区或动态分区。 使用可变式分区技术时,作业的个数不断变化,内存分区个数也是不断改变的。

  25. 如图4.5给出了一种情况。最初,进程A在主存,然后进程B和C从盘上装入,之后进程A运行完,进程D装入,紧接着进程B完成,最后,进程E装入主存。如图4.5给出了一种情况。最初,进程A在主存,然后进程B和C从盘上装入,之后进程A运行完,进程D装入,紧接着进程B完成,最后,进程E装入主存。

  26. 1M 1M 1M 1M 1M 270k 270k 270k 270k Pc(100k) Pc(100k) Pc(100k) Pc(100k) 170k 170k 170k 170k Pb(30k) Pb(30k) 10k 160k 70k 140k 140k 140k Pe(60k) Pa(120k) Pa(120k) 100k 100k Pd(80k) Pd(80k) 20k 20k 20k 20k 20k 操作系统 操作系统 操作系统 操作系统 操作系统 0 0 0 0 0 (a) (b) (c) (d) (e) 图4.5 可变式分区的使用情况,其中阴影部分为空闲区

  27. 可变式分区与固定式分区相比,当进程不断进出主存时,对于进程的数量、大小及其占用的存贮位置,是不断地改变。可变式分区能改进存贮器的使用效率,却使存贮器的分配和释放工作复杂了。可变式分区与固定式分区相比,当进程不断进出主存时,对于进程的数量、大小及其占用的存贮位置,是不断地改变。可变式分区能改进存贮器的使用效率,却使存贮器的分配和释放工作复杂了。 由图4.5可以看出,主存中的分区数目和大小随作业的变化而不断改变。

  28. 对可变式分区的主存分配和回收,通常有四种方法进行管理:分区说明表、空闲区链、位示图和伙伴系统。对可变式分区的主存分配和回收,通常有四种方法进行管理:分区说明表、空闲区链、位示图和伙伴系统。 • 1、分区说明表 为了方便主存的分配和回收,分区说明表可由两张表格组成。一张是已分配区表,另一张是未分配区说明表。

  29. 当有作业要求分配主存时,首先从未分配区表中找一个足以容纳该作业的空闲区,若这个分区比较大,则一分为二,一部分分配给作业,另一部分仍作为空闲区留在表中。再在已分配区表中找一个空表目,填入新分配作业的信息。 图4.6中的两张表的内容就是对图4.5(e)情况的描述。

  30. 内存使用情况 0K OS(20k) Pd(80k) (10k) Pe(60k) Pc(100k) 20K 100K 110K 170K 270K 1M 图4.6 可变分区分区说明表 空闲区表 已分配区表

  31. 采用分区说明表比较直观、简单,但由于主存分区个数不定,所以表格长度应设置合理,否则会出现或者表格不够用或者造成表格溢出。采用分区说明表比较直观、简单,但由于主存分区个数不定,所以表格长度应设置合理,否则会出现或者表格不够用或者造成表格溢出。

  32. 2、空闲区链 记录存贮空间使用情况的一种较好方法是将表格信息附加在分区中。通常将表格信息放在每个分区的首尾两个字中,利用分区自己管理自己。表格存放如下一些信息: (1) 状态信息:“0”表示该区空闲,“非0”表示已分配。 (2) 该区的大小(以字或块为单位)。

  33. 状态位 分区大小(N+2) 前向指针 大小为N的已分配区或空闲区 状态位 分区大小(N+2) 后向指针 (3) 指针:分别指向其上或其下分区的位置。通常首字指针(又叫前向指针)指向下一分区,尾字指针(又叫后向指针)指向其上一分区位置。下图给出了带有表格信息的分区格式。

  34. 所有空闲区连成一个双向链。为了便于管理,系统设置一个链表头指针head,指向链中第一个空闲区位置。所有空闲区连成一个双向链。为了便于管理,系统设置一个链表头指针head,指向链中第一个空闲区位置。 常用的空闲区链的管理方法有三种: 第一种是链中的空闲区按照起始地址的大小从小到大排列,这种方法叫首次适应(first fit)法。

  35. 当进程要求装入主存时,存贮管理程序从链头开始扫描这个链,直到找到一个足够大的空闲区为止。当进程要求装入主存时,存贮管理程序从链头开始扫描这个链,直到找到一个足够大的空闲区为止。 第二种算法叫最佳适应(best fit)法。采用最佳适应法为进程分配存贮空间时,要扫描整个链表,以获得能满足进程需求且为最小的空闲区。由于它总是将最接近进程需求量的空闲区分配给进程,故称为最佳适应。

  36. 最佳适应算法比首次适应算法效率低。因为每次分配分区都要查找整个链表;其次,它比首次适应要浪费更多的空贮空间。因为它可能把主存划分得更小,成为无用的碎片。最佳适应算法比首次适应算法效率低。因为每次分配分区都要查找整个链表;其次,它比首次适应要浪费更多的空贮空间。因为它可能把主存划分得更小,成为无用的碎片。 第三种算法叫最坏适应(worst fit)法。它与最佳适应算法的思想正好相反。采用最坏适应法为进程分配存贮空间时,要扫描整个链表,直到找到该链中能满足进程要求且为链中最大的空闲区为止。

  37. 之后,把这个最大的空闲区一分为二,一部分分给进程,另一部分仍留在链中。 为了提高进程分配存贮空间的速度,最佳适应算法和最坏适应算法分别按空闲区尺寸从小(大)到大(小)排队。从而使最佳、最坏适应法的查找速度与首次适应法一样高效。但每当分配一个空闲区,且有一部分剩余空间时,要重新整理链,以便按序排列。

  38. 当进程运行完成时,为了使系统尽可能保持较大的空闲区,当回收一个释放区时,要考虑释放区是否与空闲区相邻接,若邻接,先进行合并,再将合并后的空闲区插入链或表中。当进程运行完成时,为了使系统尽可能保持较大的空闲区,当回收一个释放区时,要考虑释放区是否与空闲区相邻接,若邻接,先进行合并,再将合并后的空闲区插入链或表中。 释放区邻接的分区情况有:释放区邻接的是另一进程的已分配区,或者是空闲区。

  39. 下面以首次适应法为例说明系统回收进程占用区存在的四种可能情况:设进程的释放区为R,与R相邻的两个空闲区分别为F1和F2。R的首地址送LOC,R的大小送SIZE。下面以首次适应法为例说明系统回收进程占用区存在的四种可能情况:设进程的释放区为R,与R相邻的两个空闲区分别为F1和F2。R的首地址送LOC,R的大小送SIZE。

  40. 低地址高地址 低地址高地址 空闲区 F1 进程P 占用区 2 空闲区 F1 占用区2 (a)合并后 (a)若释放区R与F1相邻接,即其低地址部分邻接一空闲区。将R与F1合并,合并后的空闲区仍记为F1。

  41. 如何判断释放区R是否与某个空闲区相邻呢?只要从链首开始查找即可:若F1的首地址+F1的大小=R的首地址,说明R与F1相邻接。只要修改F1的大小=F1的大小+SIZE,其它参数以及在链中的位置不变。如何判断释放区R是否与某个空闲区相邻呢?只要从链首开始查找即可:若F1的首地址+F1的大小=R的首地址,说明R与F1相邻接。只要修改F1的大小=F1的大小+SIZE,其它参数以及在链中的位置不变。

  42. 低地址 高地址 低地址 高地址 占用区1 进程 P 空闲区F2 占用区1 空闲区F2 (b)合并后 (b)若释放区R与F2相邻接,即其高地址部分邻接一空闲区。将R与F2合并,合并后的空闲区记仍记为F2。 判断释放区R是否与F2空闲区相邻,只要从链首开始查找。 若LOC+SIZE=F2的首地址,说明R与F2相邻接。需修改F2的首地址=LOC,F2的大小= F2的大小+SIZE。

  43. 空闲区 F1 释放区 R 空闲区 F2 空 闲 区 F1 合并后 (c)若释放区R的高、低地址部分都邻接一个空闲区。应将三个分区合并为一个大空闲区,并记为F1。先将R与F2合并,记为F2。再将F2与F1合并,并将F2从链中删除。

  44. (d)若释放区R上下都不邻接空闲区,将其插入空闲区链的适当位置即可。书中第62页的图4.11给出了首次适应算法的回收算法的流程图,这里不再重画。(d)若释放区R上下都不邻接空闲区,将其插入空闲区链的适当位置即可。书中第62页的图4.11给出了首次适应算法的回收算法的流程图,这里不再重画。

  45. 三、分区管理的存贮器保护 采用静态重定位和动态重定位技术不能解决存贮保护的问题。在多道程序和多用户系统中,不允许一个进程读写属于其它用户或系统的存贮空间。分区管理如何解决存贮保护问题呢?

  46. 根据存储管理采用的方法不同,保护的方法也不同。下面介绍通常采用的两种方法。根据存储管理采用的方法不同,保护的方法也不同。下面介绍通常采用的两种方法。 • 1、基址+限长 采用空闲区表或空闲区链时,实现存贮保护的方法是基址加限长法。在重定位寄存器的基础上增加一个限长寄存器。我们把这两个寄存器分别叫基址和限长寄存器。

  47. 为了存贮保护的需要,在进行地址重定位前,先将CPU形成的地址与限长寄存器内容比较,若其小于限长寄存器内容,则允许进行地址转换,否则产生地址越界中断,终止程序运行。为了存贮保护的需要,在进行地址重定位前,先将CPU形成的地址与限长寄存器内容比较,若其小于限长寄存器内容,则允许进行地址转换,否则产生地址越界中断,终止程序运行。

  48. 2、存贮保护键 采用位图时,实现存贮保护可用存储保护键法。IBM 360机采取的保护措施就是将主存划成2k字节的若干块,每块对应4位保护码。程序状态字PSW中相应地含有4位键码。当一个运行进程对存贮器存取时,若其程序状态字的键码与访问块的保护码不同时,360硬件产生异常失陷,中止程序执行。从而使存贮区得到保护。

  49. 四、分区管理的优缺点 主要优点为 (1)实现了多道程序共享主存。 (2)实现分区管理的系统设计相对简单,不需要更多的系统软硬件开销。 (3)实现存贮保护的手段也比较简单。 缺点为 (1)主存利用不够充分:系统中总有一部分存贮空间得不到利用,这部分被浪费的空间叫零头(或碎片)。 (2)没有实现主存的扩充问题。

More Related