1.内存管理术语:
a.页:一个固定长度的数据块,存储在二级存储器中(如磁盘)。数据也可以临时复制入内存中的页框中。
b.段:一个变长的内存块,存储在二级存储器中。整个段可以临时复制到内存的一个可用区域内(分段存储),或者可以将一个段分为许多页,将每页单独复制到内存中(分段和分页相结合,即段页式存储)。
2.内存管理的需求:
a.重定位:即在内存中的程序换出内存后,下次再加载进内存时,需要重新定位其在内存中的位置。
b.保护:每个进程都应该受到保护,以免被其它进程有意或无意干涉。因此,该进程以外的其它进程的程序不能未经授权地访问(进行读操作或者写操作)该进程的内存单元。还需要注意一点是:内存保护的需求必须由处理器(硬件)来满足,而不是由操作系统(软件)满足!这是因为操作系统不能预测程序可能发生的所有内存访问(因为程序在内存中可能发生重定位,这时就改变了原来在内存中的位置),即使可以预测,提前审查每个进程中可能存在的内存违法访问也是非常费时的。因此,只能在指令访问内存时动态的来判断这个内存访问是否违法(存取数据或跳转)。为实现这一点,处理器硬件必须具备这个能力。
c.共享:任何保护机制都必须具有一定的灵活性,以允许多个进程访问内存的同一部分。
d.逻辑组织:计算机系统中的内存总是被组织成线性的(或者一维的)地址空间,并且地址空间是由一系列字节或字组成的。外部存储器(简称外存)的物理层上也是按类似方式组织的。
e.物理组织:计算机存储器至少被组织成两级,成为内存和外存。内存提供快速的访问,成本也相对比较高,并且内存是易失性的,也就是说它不能提供永久存储。外存比内存慢而且便宜,它通常是非易失性的。因此,大容量的外存可以用于长期存储程序和数据,而小的内存则用于保存当前的程序和数据。在两级存储器间移动信息的任务是一种系统责任,而该任务恰恰就是存储管理的本质所在。
3.内存分区:内存管理最基本的操作是由处理器把程序装入内存中执行。在大部分现代多道程序设计系统中,这往往还涉及一种称为“虚拟内存”的精密方案。“虚拟内存”又基于分段和分页这两种技术或其中的一种。
固定分区:在大多数内存管理方案中,可以假定操作系统占据了内存中的某些固定部分,内存的其它部分可供多个用户进程使用。管理用户内存空间的最简单的方案就是把它分区,从而形成若干个边界固定的区域。任何程序,即使很小,都需要占据一个完整的分区。
内部碎片:被装入的程序的数据块小于分区大小,从而导致“分区内部”有空间浪费,即产生碎片。这是相对于“某一个进程对分配给它的内存的使用率而言的”
外部碎片:内存是有限的,当内存分配给进程后,还有部分内存无法满足给任何一个需要运行的内存的空间时,即产生碎片。这是相对于“整个内存的使用而言的”。
克服外部碎片的一种技术是压缩(compaction):操作系统不时的移动进程,使得进程占用的空间连续,并且所有空闲空间连成一片。这样就可以让内存逐渐的空闲出一片连续的空间使得足以给下一个进程运行。
压缩的缺点: 它是一个非常费时的过程,并且浪费了处理器时间。而且需要注意的是压缩需要动态重定位的能力,也就是说,必须能够把程序从内存的一块区域移动到另一块区域,而不会使程序中的内存访问无效。
重定位:内存中的进程的位置可能会发生改变,因此,进程的访问的(指令和数据单元)位置不是固定的。为解决这个问题,需要对集中地址类型进行如下区分:
a.逻辑地址:指与当前数据在内存中的物理分配地址无关的访问地址,在执行内存的访问之前必须把它转成物理地址。
b.相对地址:逻辑地址的一个特例,是相对于某些已知点(通常是程序的开始处)的存储单元。
c.物理地址(或绝对地址):是数据在内存中的实际位置。
逻辑地址到物理地址的转换由处理器硬件来完成!!
4.分页:大小不等的固定分区和大小可变的分区在内存的使用上都是低效的,前者会产生内部碎片,后者会产生外部碎片。但是,假如内存被划分成大小固定相等的块,且块相对比较小,每个进程也被分成同样大小的小块,那么进程中成为页的块可以指定到内存中成为页框的块。使用分页技术在内存中为每个进程浪费的空间仅仅是进程最后一页的一小部分形成的内部碎片,没有外部碎片。
在分页中,逻辑地址到物理地址的转换仍然由处理器硬件完成,并且处理器必须知道如何访问当前进程的页表。给出逻辑地址(页号,偏移量),处理器使用页表产生物理地址(页框号,偏移量)。
简单分页类似于固定分区,它们的不同之处在于:采用分页技术的分区相当小,一个程序可以占据多个分区,并且这些分区不需要是连续的。
5.分段:采用分段技术,可以把程序和其相关的数据划分到几个段中。尽管段有一个最大长度限制,但并不要求所有的程序的所有段的长度都相等。和分页一样,采用分段技术时的逻辑地址也是由两部分组成:段号和偏移量。
由于使用带下不等的段,分段类似于动态分区。在没有采用覆盖方案或使用虚拟内存的情况下,为执行一个程序,需要把它的所有段都装入内存。在分段方案中,一个程序可以占据多个分区,并且这些分区不要求是连续的。分段消除了内部碎片,但是和动态分区一样,它会产生外部碎片。不过由于进程被分成多个小块,因此外部碎片也会很小。
采用大小不等的段的另一个结果是:逻辑地址与物理地址不在具有简单的对应关系。类似于分页,在简单的分段方案中,每个进程都有一个段表,系统也会维护一个内存中的空闲列表。每个段表项必须给出相应的段在内存中的起始地址,还必须指明段的长度,以确保不会使用无效的地址。
总之,采用简单分段技术,进程被划分成许多段,段的大小不需要相等。当一个进程被调入时,它的所有段都被装入内存的可用区域中,并建立一个段表。
6.与内存相关的安全问题:内存和虚拟内存是容易受到安全威胁的系统资源,因此需要采取一些安全对策来保护它们。最明显的安全需求是“防止进程内存中的内容遭受未经授权的访问”。如果进程没有声明共享其部分内存,则其他程序不得访问这部分内存内容。如果进程声明某部分内存可以被指定程序共享,那么操作系统的安全服务必须保证只有这些指定进程可以访问这部分内存。以下介绍“缓冲区溢出攻击”:
7.总结:
内存管理是操作系统中最重要、最复杂的任务之一。内存管理把内存看做是一个资源,可以分配给多个活动进程,或者由多个活动进程共享。为了有效地使用处理器和I/O设备,需要在内存中保留尽可能多的进程。此外,程序员在进行程序开发时最好能不收程序大小的限制。
内存管理的基本工具是分页和分段。采用分页技术,每个进程被划分成相对比较小的、大小固定的页。采用分段技术可以使用大小不同的块。还可以在一个单独的内存管理方案中把分段和分页技术结合起来使用。