1内存管理(MemoryManagement)第7章2存储管理存储器是计算机系统的重要组成部分,所以存储器的管理是操作系统最主要的功能之一。程序的指令和数据只有被调入内存(RAM)里才能被CPU直接访问,程序才能够被执行。软件系统需要的内存容量在不断地增加,所以内存的容量仍然是计算机硬件中最关键的、且又是最紧张的“瓶颈”资源。如何对存储器进行有效的管理,不仅直接影响到它的利用率,而且还对系统的性能有重大影响。存储管理的主要对象是内存。3教学要求熟悉存储管理目的和功能,掌握地址重定位的概念。熟悉固定分区分配、动态分区分配的实现原理;掌握可变分区分配的数据结构和分配回收算法,熟悉可变分区碎片和拼接技术。熟练掌握分页存储管理原理,熟练掌握分页存储管理基本的地址变换机构和具有快表的地址变换机构。掌握分段存储管理原理和分段地址变换机构,掌握分页和分段比较,熟悉分页和分段的共享,掌握段页式存储管理原理和地址变换机构。4教学要求-1掌握虚拟存储器的理论基础和定义,熟悉虚拟存储器实现方式和特征。掌握请求分页的页表机制、缺页中断机构和地址变换机构,熟悉页面的分配和置换策略、页面的分配的算法。熟练掌握最佳置换算法、先进先出(FIFO)置换算法、最近最久未使用置换算法LRU,熟悉Clock置换算法和页面缓冲算法;了解工作集概念。掌握请求分段的段表机制、缺段中断机构和地址变换机构,熟悉分段的共享和保护。5内存管理内存通常被分为两部分:操作系统和用户程序。内存管理的核心是进一步细分用户可访问的内存部分,以满足多个进程的要求。如何分配内存空间?必须有效地分配内存以保证有适当数目的就绪进程可以运行,以提高处理器的利用率。6内存管理的功能1.内存分配内存分配的主要任务是:为每一道程序分配内存空间,使它们“各得其所”;当程序撤消时,则收回它占用的内存空间。分配时注意提高存储器的利用率。2.地址映射目标程序所访问的地址是逻辑地址集合的地址空间,而内存空间是内存中物理地址的集合,在多道程序环境下,这两者是不一致的,因此,存储管理必须提供地址映射功能,用于把程序地址空间中的逻辑地址转换为内存空间中对应的物理地址。73.存储保护内存保护的任务是确保每道程序都在自己的内存空间运行,互不干扰。保护系统程序区不被用户侵犯(有意或无意的),不允许用户程序读写不属于自己地址空间的数据(系统区地址空间,其他用户程序的地址空间)。4.提高主存储器的利用率减少不可用的存储空间(称为“碎片”、“零头”),允许多道程序动态共享主存。5.内存扩充内存扩充的任务是从逻辑上来扩充内存容量,使用户认为系统所拥有的内存空间远比其实际的内存空间(硬件RAM)大的多。87.1.1地址重定位1.名字空间、地址空间和存储空间在源程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合称为“名字空间”。汇编语言源程序经过汇编,或者高级语言源程序经过编译,得到的目标程序是以“0”作为参考地址的模块。然后多个目标模块由连接程序连接成一个具有统一地址的装配模块,以便最后装入内存中执行。我们把目标模块中的地址称为相对地址(或称为“逻辑地址”),而把相对地址的集合称为“相对地址空间/逻辑地址空间”或简称为“地址空间”。9将装配模块装入内存执行时,需要确定装入内存的实际物理地址,并修改程序中与地址有关的代码,这一过程称为地址重定位。地址空间的程序和数据经过地址重定位处理后,就变成了可由CPU直接执行的绝对地址程序(物理地址)。我们把这一地址集合称为“绝对地址空间”或“存储空间”。10程序的名字空间、地址空间和存储空间符号源程序LoadA,data1相对目标程序(装配模块)LoadA,200绝对目标程序LoadA,55200名字空间地址空间相对地址/逻辑地址空间存储空间绝对地址/物理地址空间汇编/编译连接地址重定位装入11逻辑地址、物理地址和地址映射地址映射BA=1000LoadA2003456。。。1200物理地址空间LoadAdata1data13456源程序LoadA20034560100200编译连接逻辑地址空间12地址逻辑地址(Logical)程序员访问的地址,与当前数据在内存中的实际位置无关在进行内存访问时,必须将其转换成物理地址相对地址(Relative)逻辑地址的特例相对于某些已知点(通常的程序开始处)的存储单元物理地址(Physical)也称为绝对地址是数据在主存中的实际位置132.地址重定位的分类地址重定位,也称地址映射(map),它将相对地址转换成内存中的绝对地址。按照重定位的时机,可分为静态重定位和动态重定位。静态重定位静态重定位是在程序执行之前进行重定位。它根据装配模块将要装入的内存起始地址,直接修改装配模块中的有关使用地址的指令。在图中以“0”作为参考地址的装配模块,要装入以10000为起始地址的存储空间。显然在装入程序之前,程序必须做一些修改才能正确运行。14例如:LOAD1,2500这条指令是把相对地址为2500的存储单元的内容365装入1号累加器。而这时内容为365的存储单元的实际物理地址为12500(起始地址10000+相对地址2500),所以LOAD1,2500这条指令中的直接地址码要作相应的修改,即改为LOAD1,12500。LOAD1,25003650100:2500:2600:LOAD1,1250036510000:10100:12500:12600:程序的地址空间内存的地址空间15静态重定位虽然有无须硬件支持的优点,但是也存在明显的缺点:一是程序重定位以后就不能在内存中移动;二是要求程序的存储空间是连续的,不能把程序存储到若干个不连续的区域中。在重定位表中列出要修改的位置。如:重定位表的150表示相对地址150处的内容为相对地址(即100为从0起头的相对位置)。在装入时,要依据重定位后的起头位置(2000)修改相对地址。重定位修改:重定位表中的150-绝对地址2150(=2000+150)内容修改:内容100变成2100(=100+2000)。jmp150100150...RelocationTable0jmp15021002150...200016动态重定位是指在程序执行过程中进行地址重定位,即在每次访问内存单元前才进行地址变换。动态重定位可使装配模块不加任何修改就装入内存,但是它需要硬件—重定位寄存器的支持。程序的目标模块在装入内存时,与地址有关的指令都无须进行修改。当该指令被操作系统取到中央处理器指令寄存器IR上执行时,操作系统首先把该模块装入的实际起始地址减去目标模块的相对基地址,然后将其差值装入重定位寄存器。当CPU执行该指令时,地址变换硬件逻辑自动将指令中的逻辑地址与重定位寄存器中的值相加,再根据和值作为内存的绝对地址去访问该单元的数据,读入的数据送到寄存器1。完成地址变换硬件是属于存储管理部件MMU,目前它已集成到中央处理器CPU中。17动态重定位LOAD1,25003650:10025002600程序的地址空间LOAD1,2500365100001010012500物理地址内存的地址空间重定位寄存重定位寄存器中央处理器CPU指令寄存器LOAD1,25002500(逻辑地址)MMU(存储管理部件)CPU芯片+1000018动态重定位的特性动态重定位是在指令执行过程中动态进行,它由硬件完成,这样可以带来两个好处:目标程序装入内存时无需任何修改,所以装入之后再移动也不会影响其正确运行,这便于存储器用压缩技术来解决碎片问题。一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域可以不相邻接,只要各个模块有自己对应的重定位寄存器就可以了。19例子一个程序包含一段重定位代码,假设第一次读进内存100的起始地址中。此时,程序按下述地址进行访问:150,188和244。如果该程序第二次读进内存时,被重定位到内存150的起始地址中,为了正确地访问数据,上述那些地址将如何调整?Q:200,238,294207.2内存分区内存管理最基本的操作是由处理器将程序装入主存中执行。如何将程序装入主存?固定分区(FixedPartitioning)动态分区(DynamicPartitioning)简单分页(SimplePaging)简单分段(SimpleSegmentation)虚拟分页(Virtual-MemoryPaging)虚拟分段(Virtual-MemorySegmentation)21分区存储管理方式分区存储管理是能够满足多道程序运行的最简单的存储器管理方案,其基本思想是将内存划分成若干个连续的区域,称为分区。每个分区只能储存一个程序,而且程序也只能在它所驻留的分区中运行。分区存储管理根据分区个数及分区大小的可变性分为固定分区和动态分区两种。22固定分区在作业装入之前,系统管理员或操作系统事先将内存划分成若干个分区。一旦划分完成,在系统运行期间不再重新划分,即分区的个数不可变,分区的大小不可变,所以,固定式分区又称为静态分区。可划分为大小相等的分区(Equal-sizepartitions)和大小不等的分区(Unequal-sizepartitions)任何小于或等于分区大小的进程都可以装入到任何可用的分区中。如果所有的分区都满了,系统可以换出一个进程,将其所占用的分区分配给另一个进程使用。2324区号大小起址标志116KB20K已分配232KB36K已分配364KB68K已分配4124KB132K未分配(a)分区说明表系统维护了一张分区说明表,每个表目说明一个分区的大小、起始地址和是否已分配。0k:20k:36k:68k:132k:256k内存分配图操作系统作业A(16k)作业B(26k)作业C(56k)第1分区(16kb)(已分配)第2分区(32kb)(已分配)第3分区(64kb)(已分配)4分区(124kb)(未分配)25存在两个问题程序可能太大而不能放到一个分区中,必须使用覆盖技术,使得在任何时候该程序只有一部分放到主存中。主存的利用率不高。任何进程,即使很小,都需要占据一个完整的分区。一个进程的大小不可能正好等于某个分区的大小,所以每个被分配的分区内总有一部分被浪费,我们把这部分被浪费的存储区称为内部碎片(fragmentation)或内零头。如上图所示中第3分区未分配的部分还有8KB,加上第4分区的124KB共计132KB,而且这132KB的内存空间在物理上是一个连续的区域,这时如果有一个大小为130KB的作业申请内存,却被拒绝,因为分区的大小是预先划分好的,分区说明表中指出只有第4分区未分配(大小为124K),且不能改变分区的大小。26放置算法大小相等的分区所有分区大小都相等,只要存在可用的分区,进程就可以装入大小不等的分区把每个进程指定到足够容纳它的最小分区每个分区维护一个队列,保存该分区换出的进程可使每个分区内的碎片最少改进:把每个进程指定到可容纳它的最小可用分区中所有分区只提供一个队列2728固定分区的不足分区的数目事先生成,因此限制了系统中活动进程的数目小作业不能有效地利用分区空间存在内部碎片问题29动态分区(DynamicPartitioning)(1)动态分区概述动态分区是指在作业装入内存时,从可用的内存中划出一块连续的区域分配给它,且分区大小正好等于该作业的大小。动态分区中分区的大小和分区的个数都是可变的,而且是根据作业的大小和多少动态地划分,因此又称可变分区。这种存储管理技术是固定式分区的改进,既可以获得较大的灵活性,又能提高内存的利用率。30系统初始化后,内存被划分成两块,一块用于常驻的操作系统,另一块则是完整的空闲区(用户区)。对于调入的若干个作业,划分几个大小不等的分区给它们,随着作业的调入和撤除,相应的分区被划分和释放,原来整块的存储区形成空闲区和已分配区相间的局面。下图给出了动态分区的示例,512KB内存中除20KB操作系统外,装入作业2、3、4、6四个,有空闲区1、2、3三个。31动态分区示例序号P大小起址状态132k20k空闲256k260k空闲3116k396k空闲4——空