存储管理(memory management)

1、存储器是计算机系统的重要资源之一,由内存和外存组成,CPU能直接访问内存而不能直接访问外存。内存管理的问题包括:内存管理方法、内存的分配和释放算法、虚拟存储器的管理、控制内存和外存之间的数据流动方法、地址变换技术和内存数据保护与共享技术等。

2、内存的分配和管理:该功能必须要记住每个存储区域的状态,实施分配,回收,为了实现这些功能,必须引入分配表格,统称为内存分配表,其组织方式包括:1)位图表示法(用一位0或1表示一个页面的使用与否),2)空闲页面表(包括首页面号和空闲页面个数,连续若干的页面作为一组登记在表中),3)空闲快表(空闲块首地址和空闲块长度,没有记录的即为进程所占用)。内存分配有两种方式:静态分配(进程开始时分配,并不允许以后再改变,采用静态地址映射),动态分配(程序运行过程运行“搬家”,必须采用动态地址映射)

3、内存共享:指两个或多个进程共用内存中相同区域,这样不仅能够多道程序动态地共享内存,提高存储利用率,而且还能共享内存中某个区域的信息。共享的内容包括:代码共享和数据共享,特别是代码共享要求代码必须是纯代码。内存共享的目的是通过代码共享节省内存空间,提高内存利用率,另一个目的是通过数据共享实现进程通信。

4、在单道程序设计系统中,主存划分为两个部分,一部份分配给操作系统独占,一部份分配给当前运行的程序。在多道程序设计中仍然进行这样的划分,不过用户空间不再是一个进程独占,而是多个进程共同分享,分配的工作则由操作系统动态进行。在多道程序设计系统中,由于进程通常需要花费很多时间等待I/O,处理器经常处于空闲状态,因此存储器的分配要尽可能地让更多地进程进入存储器。存储器管理从操作系统的角度以及历史的演变可以分为以下五种方式:

1)、交换(swapping):当新的进程请求时,如果主存仍有空间就调入,如果没有空间,则把内存中未就绪状态的进程调回磁盘,排入中间队列(排列临时从内存调出的现有进程的队列)。然后,OS从中间队列中调入另一个进程或从长期queue中接受处理一个新的process请求,然后执行新到的process。swapping是一种I/O操作,有可能使问题变得更坏而不是更好。但总的来说通常是更好,因此磁盘I/O速度一般比较快。

2)、分区(partition):OS占据memory的固定部分,其余部分分配给多个process使用,partion方案还可以分为fixed-size partition和variable-size partition。由于每个process需要的memory不一样,如果使用fixed-size方案则会浪费很多的memory,即使使用不等的fixed-size方案也浪费主存,因为不可能分配的memory刚好和process需要的大小一样。使用variable-szie方案分配可以使得分配的memory与process需要的size大小一样,可是这种方案到后来会产生很多的碎片,从而使memory的利用率大大下降。为了解决这个问题,可以使用紧缩(compaction)技术,OS一次又一次地移动存储器中的process,把所有空闲的空间放在一起,组成大的连续空间,不过这个过程很浪费处理器的时间,另外这个补救方法也还应该解决process在memory中移动的问题,因为process移动之后地址都变了。为了解决这个问题,可以采用logic address。当处理器执行一个process时,通过把当前process的起始单元地址加到每个逻辑地址上,自动地把逻辑地址转换成物理地址。

3)、分页:把物理空间和程序空间都划分为固定长度且都比较小的page,然后根据process需要的page数目分配空间,这样最多浪费最后一个page的一小部分。在process中,逻辑地址划分为两个部分进行解释,一个部分为页号,一个部分为页内偏移量,页号从页表中选择一个页,然后加上偏移量即是物理地址。分页对程序员是不可见的,它为程序员提供了较大的地址空间来满足需要。

4)、分段(segmentation):分段对程序员是可见的,他为组织程序和数据提供了方便,并提供把特权、保护属性与指令、数据相联系的手段。分段允许程序员把存储器看成由多个地址空间或段组成,段长度是可变的,是动态分配的。通常程序员或操作系统把程序和数据分配给不同的段。各种类型的程序可以有许多程序段和数据段,每段可分配存取权和使用权,存储器访问由段号和偏移量组成。这种组织方法有许多有优点:1)如果程序中的数据段需要改变,则可以由OS进行动态改变2)可以方便进程之间的共享,只要把要共享的段放入其它进程段表中即可3)方便存取权的分配,因为每一个段都是比较具有独立作用的段4)允许程序独立地被改变和重编译,不需要整个程序重新连接和重装入。

5)、段页式:下面着重讲述

5、地址转换:计算机中的物理存储器是一个存储字节的线性数组,每一个字节的地址是唯一且连续,称为物理地址。程序中提供的是逻辑地址或者称为虚拟地址,但是指令和数据等是存储在物理地址中,因此需要一个映射机制把逻辑地址映射成物理地址。为了实现这样的映射,需要处理器的支持,同时会把逻辑地址分成两个部分或者三个部分来解释,这主要取决于处理器的设置或者说存储器的管理机制。通过这种映射机制,操作系统或者用户程序中的地址不再是物理地址,因此可以利用这个机制安排一些物理地址不被映射成虚拟地址,这个就可以实现内存的保护,也可以对地址转换函数进行扩展,把某些虚拟地址视为无效地址,当访问这些地址的时候,转换机制将会报告一个异常,然后由操作系统接管并进行处理,通常用这种方法可以实现虚拟存储器的实现,获得一个比实际内存大的利用外存实现的虚拟内存。
6、根据虚拟地址和物理地址的映射机制,存储管理方案可以分为段式机制,页式机制和段页式机制。现在的系统通常是采用段页式机制,也就是结合了两种机制的优势,采用两级虚拟。在段式机制和页式机制中,每个进程都有一个由操作系统维护的转换页表集,这些转换页表只能由操作系统维护。第一级使用段机制,第二级采用页机制,在地址转换过程中,段机制总是要启用,而分页机制则可以根据需要而被启用或禁用。如果没有使用页机制,则由段机制转换产生的线性地址,直接作为物理地址使用。在X86系统中,虚拟地址由46位组成,如果启用页机制,则高14位为段选择子,而地32为又分为两部分,中间20位为页号,低12位为页内偏移量;如果禁用页机制,则高14为仍然为段选择子,而低32为为段内偏移量。每个存储器段都与一个特权级别相联系,只有足够级别的程序才能对相应的段进行访问。当一个进程试图访问一个段时,就把进程的当前特权级与要访问的段的特权级进行比较,以决定是否允许这一访问。如果外层级别的程序试图访问内层级别的存储空间是非法的,并产生一个异常,由操作系统处理。
7、段机制把虚拟存储器组织成大小可变的容量单位的集合,称之为段。采用段模式的虚拟地址被分成两个部分进行解释,前16为为段选择子,后32位为段内偏移量。段描述符由三个参量组成:段的基地址,段的界限,段的属性,并存储在存储器的段描述符表中,该描述符表是段描述符的一个数组。描述符表存储在由操作系统维护,并由处理器中的存储管理硬件所访问的,特别的段中,这些段在受保护的存储器中存储,只能由操作系统软件进行访问,避免应用程序的软件修改地址转换信息。全局描述符表(GDT)和局部描述符表(LDT)是包含段描述符表的两个特殊的段。虚拟地址空间分为相等的两半:一半由GDT进行映射,另一半由LDT进行映射,当发生任务切换时,LDT改变为新任务的LDT,而GDT保持不变,因此由GDT映射的虚拟地址空间为系统中所有的任务共用。但是由LDT映射的那一半虚拟地址空间,则由任务的切换而改变。在系统中,所有任务共享的段用GDT进行映射,这样的段包括:含有操作系统的段及系统中所有任务的LDT段,这些LDT段可视为属于操作系统的数据。
8、通常操作系统的核心工作在0级,操作系统的其它部分工作在1级,而应用程序则工作在3级,2级则留下供中间软件级使用。存储保护包含两个方面,一个是任务之间的保护以及任务之内的保护。

9、虚拟存储器:指当进程开始运行时,先将程序一部份装入内存,另一部分暂时留在外存,当要执行的指令不在内存时,由系统自动完成将它们从外存调入内存的工作;当没有足够的内存空间时,系统自动选择部分内存空间,将其中原有的内容交换到磁盘上,并释放这些内存空间供其它进程使用。虚拟存储技术同交换技术在原理上是一样的,只不过传统的交换技术中,交换的对象是进程,而在虚拟存储器中,交换的对象一般是页或者段。虚拟存储技术主要分为虚拟页式存储管理和虚拟段式存储管理两种。

10、虚拟页式存储管理是在进程开始时,不是装入全部页面,而是装入一个或零个页面,之后根据进程运行的需要,动态装入其它页面,当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面。使用虚拟页式存储管理时需要在原来的页式存储管理的页表中增加一些标志位:驻留位(又称中断位,表示该页是在内存还是在外存)、外存地址、访问位、修改位。访问为和修改为可以用来决定置换那个页面,具体由页面置换算法决定。

11、页面置换算法主要有:理想页面置换算法(OPT,最理想情况下的页面置换算法,但实际上不可能实现),先进先出页面置换算法(FIFO),最近最少使用页面置换算法(LRU),第二次机会页面置换算法,时钟页面置换算法。最近未使用页面置换算法(NRU),不经常使用算法(NFU)。

12、影响缺页次数的因素有:分配给程序的物理页面数、页面的大小、程序的编制、页面置换算法

13、虚拟段式存储管理和虚拟页式存储管理的基本原理是一样的,只是置换单位变为段。因此段表中应该增加以下内容:特征位(是否在内存中,是否可共享),存取权限(读,写,执行等),标志位(是否被修改过,能否移动),扩充位(该段长度为固定长/可扩充)。进程执行过程中,有时需要扩大分段,如数据段,由于要访问的地址超出原有的段长,所有发生越界中断,如果该段为可扩充段,而增加段的长度,否则出处处理。

14、段的静态链接是指为了程序正确执行,必须由链接装配程序把他们连接成一个可执行的目标程序,并在程序运行前都装入内存,静态链接的问题是花费时间,浪费空间。动态链接是指程序在开始运行时,只将主程序装配好并调入内存,其它各段的装配是在主程序段的运行过程中逐步完成。每个需要调用一个新段时,再将这个新段装配好,并于主程序段链接,使用纯页式存储管理难以完成动态链接,因为其逻辑地址是一维的。现在的大型程序中一般都有若干程序段和若干数据段,而且进程的某些程序段在进程运行期间可能根本不用,互斥执行的程序段没有必要同时驻留内存有些程序执行一次后不再用到,因此,采用动态链接和重定位是一种有效提高内存利用率的方法。

15、如果被链接段是可再入的,则称该段是纯的,简称纯段,即该段在运行过程中不允许修改其中的数据。与纯段相对应,也存在杂段,又称链接段。一般将程序所有可能变更的数据,包括链接间接字和某些临时变量、内部变量等,都放在杂段中。

 

16、

1)、请求分页(demand  paging):考虑一个比较大的process,它由很多的pages组成,由于程序运行的空间局部性和时间局部性原理,在任何一个小的时间段内,通常只有一些pages会用到,而其它的基本上不会使用,甚至在整个process的生命周期中都不会用到,因此这造成了空间的浪费。为了解决这个问题,可以对页采用需要时调入的策略。当程序转去执行一个不在主存中的页上的指令或者访问不在主存中的页上的数据时,会产生一个异常,并由操作系统接管,然后装入该页。于是,在任何时刻上,只有任一给定进程的一小部分页在存储器中,因而有更多的进程能驻留在存储器中,而且由于未使用的页不被换入或换出内存,因而节省了载入时间。采用demand paging时,必须仔细什么样的页可以被换出内存,如果算法不当,则会产生刚换出的页很快就要在载入的情况,加大系统的负担,这种状况称为系统抖动(thrashing)。虚拟存储器使得程序员看到的是一个很大的存储器,跟磁盘存储器有关而跟主存无关的空间。

2)、由于每个进程对应一个页表,但每个进程能占据大量的虚拟存储器,因而表的长度要很大,需要很多的空间,可以把页表放在虚拟存储器中在解决这个问题,也可以采用二级页表的方法或者采用倒置页表的方法。

3)、原则上,每次虚拟存储器的访问要产生两次物理存储器的存取,一次是获取相应的页表项,页次是获取所需的数据,因此会使存取时间加倍,为了解决这个问题,可以使用一个特殊的cache用于存储页表项,通常称为(translation lockaside buffer TLB)。这个cache起到与存储器中cache相似的作用,包含了最近使用的那些页表项。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值