此篇文章是我在B站学习时所做的笔记,大部分图片都是课件老师的PPT,方便复习用。此篇文章仅供学习参考。
提示:以下是本篇文章正文内容
重点!!!
MS—DOS 的存储管理采用了单一连续分配方式
只能用于单用户、单任务的操作系统!!! 内存中只能有一道用户程序,用户程序独占整个用户区空间。
缺点:会产生内部碎片
解说:
由于整个系统当中同一时刻只会有一个用户程序的运行,所以采用这种分配方式的系统当中,不一定需要采用内存保护,有的系统当中,它也会设置那种越界检查了一些机制,但是像早期的个人操作系统,微软的MS-DOS系统就没有采用这种内存保护的机制,因为系统中只会运行一个用户程序,那么即使这个用户程序出问题了,那也只会影响用户进程本身,或者说即使这个用户程序越界,把操作系统的数据损坏了,那这个数据一般来说也可以通过重启计算机就可以很方便地这进行修复,所以说采用单一连续分配的系统当中,不一定采取内存保护,那这也是它的优点呐,另一方面这个方式的缺点也很明显,就是只适用于单用户,单任务的操作系统,它并不支持多道程序并发运行,并且这种方式会产生内部碎片,那所谓的内部碎片就是指我们分配给某一个进程,或者说程序的内存区间当中,如果有重要部分没有被用上,那这就是所谓的内部碎片,像这个例子当中,本来整个用户区都是分配给这个用户进来的,但是有这么大一块,它是空闲的,暂时没有用起来,那本来给这个进程分配了,但是这个进程没有用上了这一部分内存区就是所谓的内部碎片,所以这个方式也会导致存储器的利用率很低。
无外部碎片,会产生内部碎片
动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。(eg:假设某计算机内存大小为64MB,系统区8MB,用户区共56 MB.….)
假设系统采用的数据结构是“空闲分区表”…
如何回收?
空闲分区表为例
解说:
还是相同的例子,有一个进程五需要4MB(四兆字节),那如果说我们采用了某种分配算法,最后决定把这4M字节的空闲分区分配给进程5,那么本来这个空闲分区(分区号3,分区大小4)的大小,就和此次申请的这个内存空间大小是相同的,所以如果把这个分区空闲分区全部分配给这个进程的话,那么显然空闲分区的数量会-1,所以我们需要把这个分区对应的这个表项给删除,那如果说我们采用的是空闲分区链的话,那我们就是需要把其中的某一个而空闲分区链的节点给删掉。那这是分配的时候可能会遇到的两种情况。
重点!!!
动态分区分配没有内部碎片,但是有外部碎片。
可以通过紧凑(拼凑,Compaction)技术来解决外部碎片。即将各个进程挪位,挪出一个连续的空闲区域出来
答:①显然之前介绍的三种装入方式当中,动态重定位的方式,其实是最方便实现进程在内存当中移动位置这件事,所以我们应该采用的是 动态重定位 的方式。
②紧凑之后,需要各个进程的起始地址给修改掉,进程的起始地址信息一般存放在进程对应的PCB当中,当进程要上CPU运行之前,会把进程的起始地址那个信息放到重定位寄存器里或者叫基址寄存器里。