操作系统内存管理

来源:互联网 发布:空间网络音乐链接 编辑:程序博客网 时间:2024/06/05 22:51

物理内存和虚拟内存

我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。

物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,linux会在物理内存不足时,使用交换分区的虚拟内存,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。

单道程序存储管理

该方法是最简单的一种存储管理方法,也是其他更复杂的方法的基础。单道程序存储管理的基本思路是将整个程序划分为两部分,即系统区和用户区。某一个进程在启动时,操作系统将该进程的代码放入用户区,一直到该进程结束前,该程序始终独占用户区直到进程退出。然后操作系统在装入一个新的进程将其覆盖。该方法存在巨大的问题。首先,系统一次仅能运行一个程序,不能实现多进程并行运行;其次,内存利用率不高;其三,没有内存保护机制,运行的进程可以无限制地访问任何地址;最后,进程的地址空间有限,最大不可能超过内存的大小。为了解决这些问题,出现了多种多道存储管理。

分区存储管理

分区存储管理是最简单的多道存储管理方案,其基本思路是首先将内存分为系统区和用户区,然后将用户区划分为若干个等大小或不等大小的分区,每个进程占据一个分区,这样可以实现内存中同时保留和运行多个进程,实现并发操作。
分区存储管理有两种实现方法:固定分区和可变分区。
固定分区:在初始时刻就将各个进程的分区划分好,在系统的运行中不做更改;系统在管理固定分区,需要创建一个内存分配表记录各个分区的分区号、地址、长度、当前状态和所装载的进程信息等。
可变分区:在系统运行时,每个进程的空间由系统动态创建;在程序装入内存时,系统根据需求和内存空间的情况来决定内存分配。管理可变分区需要维护一个分区链表来记录各个分区的情况;使用最先匹配法、下次匹配法、最佳匹配法和最坏匹配法进行内存区分配;内存回收时只需要修改分区链表即可。

页式存储管理和段式存储管理

固定分区系统一定会产生内存碎片的问题;可变分区系统的碎片问题可以通过内存紧缩解决,但是会消耗额外的系统资源。因此,后来提出了页式存储管理方案,其特点是打破一个进程内存空间的连续性,使之可以分散在若干个离散的内存块中。

将程序的逻辑地址空间划分为固定大小的页(page),而物理内存划分为同样大小的页框(page frame)。程序加载时,可将任意一页放人内存中任意一个页框,这些页框不必连续,从而实现了离散分配。实现页式存储管理方案需要为每一个进程分别维护页表和物理页面表两个数据结构用于将逻辑地址同物理地址建立联系;内存的分配和回收也是修改这两个数据结构。在页式存储管理方式中地址结构由两部构成,前一部分是页号,后一部分为页内地址(位移量),

段式存储管理与页式存储相似,区别在于,段式存储的基本单元不再是一个固定大小的页,而是根据进程的逻辑单元而构成的段,每个段进行分布式存储。对于每个进程,操作系统维护一个段表,段表包含段号、分区起始地址、长度等信息。

页式和段式系统有许多相似之处。比如,两者都采用离散分配方式,且都通过地址映射机构来实现地址变换。但概念上两者也有很多区别,主要表现在:

  • 需求:分页仅仅是由于系统管理的需要,而不是用户的需要。段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了更好地满足用户的需要。 一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。

  • 大小: 页大小固定且由系统决定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的。段的长度不固定,且决定于用户所编写的程序,通常由编译系统在对源程序进行编译时根据信息的性质来划分。

  • 作业地址空间表示:分页的作业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。

  • 段表比页表短,可以缩短查找时间,提高访问速度。

内存不足情况下的处理

在多道程序下可能会出现内存不足的情况,针对以下三种状况:

  • 程序太大,超过空闲内存的容量而无法一次性装入,那么采用覆盖技术,只装入当前需要的指令和数据,其他指令和数据保存于外存;
  • 进程太多,综合超过了内存容量,使得新的进程无法运行,那么可以采用交换技术,将暂时不能执行的程序移出内存;
  • 若试图在有限的内存中尽可能装入多的进程,且每个进程尽可能大,则采用虚拟存储技术。
0 0