存储管理--交换技术

来源:互联网 发布:python 5分钟执行一次 编辑:程序博客网 时间:2024/05/17 03:58

存储管理

         无存储器抽象:最简单的存储器抽象就是无存储器抽象,直接对物理内存进行操作,这样的存储下很难实现多进程。对于一个进程来讲,因为所有的内存空间都可见,还是可以实现多线程的并行。这种情况下通常一个系统在任意时刻只能运行一个程序,等待用户键入一个命令,运行结束以后等待键入另一个命令,新的运行程序覆盖原来的内存空间。虽然没有内存抽象,运行多个程序还是有可能,这就需要操作系统吧当前内存的内容保存到磁盘文件中,然后读入另一个程序运行,保证同一时刻,只有一个程序在内存中。

         另一中解决方法以IBM360为例,就是把内存分为2k的块,每块分一个4位的保护键,保护键在CPU特殊寄存器中,如果进程访问保护键与程序状态字不符合的没存,硬件就会捕捉到。但是还是有重大缺陷,因为使用的是绝对地址,一个程序运行中运行另一个程序,可能就会产生错误,要避免的就是使用绝对地址的方法。

          用户程序能够访问内存每个字节,很容易破坏系统,而且运行多个系统也是困难的。有一个比较好的方法就是利用地址空间,地址空间是进程可用于寻址内存的一套集合,每个进程都有自己的内存空间,并且这个地址空间独立与其他进程。实现这种方法就需要CPU配置两个特殊硬件寄存器,基址寄存器和界限寄存器,基址寄存器存放的是进程的起始地址,界限寄存器存放的是程序的长度。这样的话每个进程使用的内存实际是相对的,对应的物理地址是使用的地址加上其实地址所对应的物理地址。这种方法的缺点就是每次访问内存都需要使用加法进行相加,没有特殊电路的情况下,比较费时间。


如果计算机内存足够大,大到能够容纳所有进程,但实际情况是这样的想法并不现实。帕金森定律就说:不管内存多大,程序都能够把它填满。这样也就面临这一个内存超载的问题,比较常用的策略就是交换技术和内存映射。

交换技术:把进程完成调入内存,运行一段时间以后再存入磁盘,空闲进程主要存储在磁盘上,进行周期性的唤醒。例如一个系统中,开始只有进程a,占用0-2000的内存。然后调入进程b占用2001-3000的内存,然后调入进程c,占用3001-4000的内存。然后释放进程a,调入进程d,进程d占用0-500的内存。释放进程b,如此进行调用内存。可以看出在交换期间,内存中形成多个空闲区域,如果对内存进行紧缩,把内存放在一起的话,又会比较占用CPU。而且还有一个问题,进程创建时候该分配多大的内存?如果程序运行期间内存固定不变,那么就很好办,准确的分配需要的大小。但是如果数据段可以增长,就会出现问题,如果与该进程相邻的是一个空闲的内存,那么就把该空闲内存配给进程。如果相邻的是一个程序,要么就需要把增长的进程移动到内存中一足够大的区域中,要么就需要把一个或多个进程交换出去,以便产生足够大的空间。如果内存已满,则挂起,直到有足够的空间为止。


动态分配内存的时候就产生一个空闲内存的管理问题:一般两种方法,位图发和空闲链表方法。


把内存按照一定的方法分成响应的单元,每个单元对应与位图中的一位,1表示占用,0表示空闲。如果选择比较校的分配单元,那么就比较占用位图,如果选择比较大的分配单元,那么位图会比较小,但是如果进程大小不是分配单元的整数被,最后一个单元就会产生一定的浪费。而且分配内存的时候就需要搜索图位,比较浪费时间。


另一中方法就是链表管理:维护一个记录已经分配内存段和空闲内存段的链表。链表中的一个节点包含一个进程,或者两个进程之间的空闲区域。链表指针按照地址排序,便于更新。按早地址顺序在链表中存放进程和空闲区域,有几种算法,假设是存储器知道进程需要多大的内存:方法一:首次适配算法,存储器搜索链表,直到找到一个足够打的空闲区域,把该空闲区域分为两部分,一部分供进程使用,另一部分形成新空间。方法二:下次适配算法:和首次适配算法线同,不同的是么次找到何时的空闲区域都记录位置,以便下次寻找空闲区域从上次结束地方开始。方法三:最佳适配算法:试图找到最接近实际需要空闲区域,以最好地去匹配可用空闲区域。最佳适配算法每次都需要搜整个链表,算法比较慢,而且浪费更多内存,因为产生很多零碎的内存。算法四:最差适配算法:总是分配最大的可用空间,使新空闲区域比较大,可以继续使用。当然也不是个好的算法。如果进程空间和空闲区域各自维护独立链表,四个算法速度都会提高,但是会增加复杂度和内存释放速度。如果各自维护,那么空闲内存可以按照大小进行排序,在寻找内存的时候可以快速的找到。另一种分配内存的方法就是快速适配算法:为那些常用大小空闲区域维护单独链表,一个链表维护所有的分配好的内存的头指针进行维护。但是在一个程序终止或者换出的时候,寻找它的相邻块,查看是否可以合并的过程就十分费时了,如果不合并,那么就会分裂出大量进程无法利用的小空闲区域。




原创粉丝点击