一、内存的概念
1. 物理内存:即插在主板上的内存条。他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外)。
但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存占用,甚至导致物理内存消耗殆尽。
2. 虚拟内存:虚拟内存就是在硬盘上划分一块页面文件,充当内存。
当程序在运行时,有一部分资源还没有用上或者同时打开几个程序却只操作其中一个程序时,系统没必要将程序所有的资源都塞在物理内存中,于是,系统将这些暂时不用的资源放在虚拟内存上,等到需要时在调出来用。
当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。
把那些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事,内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。
3. 虚拟内存可行性的理论基础:
1、进程中的所有内存访问地址都是逻辑地址,这些逻辑地址在运行时动态的被转换为物理地址,这意味着一个进程可以被换入或换出内存,使得进程可以执行过程中的不同时刻占据内存中的不同区域。
2、一个进程可以划分成许多块,在执行过程中,这些块不需要连续的物理内存中。
4. 使用虚拟内存的好处:
1、在内存中保留多个进程。由于对任何特定的进程都仅仅装入它的某些块,因此就有足够的空间来放置更多的进程。
2、进程可以比内存的全部空间还大。程序占用的内存空间的大小是程序设计中最大的限制之一。通过基于分页或分段的虚拟内存,这些分块可以按某种覆盖策略分别加载。
二、windows 内存管理方式主要分为:页式管理,段式管理,段页式管理。
1. 固定分区
说明:在系统生成阶段,内存被划分成许多静态分区。进程可以被装入到大于或等于自身大小的分区。
优势:实现简单,只需要极少的操作系统开销。
缺点:由于有内部碎片,对内存的使用不充分;活动进程的最大数目是固定的。
2. 动态分区
说明:分区是动态创建的,因而使得每个进程可以被装入与自身大小正好相等的分区中。
优势:没有内部碎片;可以更充分的使用内存。
缺点:由于需要压缩外部碎片,处理器利用率低。
3. 页式管理:页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页;
页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应的页表;并用相应的硬件地址变换机构来解决离散地址变换问题。
页式管理采用请求调页或预调页技术来实现内外存存储器的统一管理。不需要装入一个进程的所有页,每次只需将进程运行需要的页装入到内存中不一定连续的页框中,非驻留页在以后需要时自动调入内存。
其优点是没有外碎片,每个内碎片不超过页的大小。
缺点是,程序全部装入内存,要求有相应的硬件支持。例如地址变换机构缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本,增加了系统开销。
4. 段式管理:段式管理的基本思想是把程序按照内容或过程函数关系分段,每段都有自己的名字。
一个用户作业或进程所包括的段对应一个二维线形虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换为实际内存物理地址。
不需要装入一个进程的所有段,每次只需将进程运行需要的段装入到内存中不一定连续的某些动态分区中,非驻留段在以后需要时自动调入内存。
其优点是可以分别编写和编译,可以针对不同类型的段采用不同的保护,可以按段为单位来进行共享,包括通过动态链接进行代码共享。
缺点是会产生碎片。
5. 段页式管理:为了实现段页式管理,系统必须为每个作业或进程建立一张段表以管理内存分配与释放、缺段处理等。
另外由于一个段又被划分成了若干个页。每个段必须建立一张页表以把段中的虚页变换成内存中的实际页面。显然与页式管理时相同,页表中也要有相应的实现缺页中断处理和页面保护等功能的表项。
段页式管理的段式管理与页式管理方案结合而成的所以具有他们两者的优点。
但反过来说,由于管理软件的增加,复杂性和开销也就随之增加了。另外需要的硬件以及占用的内存也有所增加。使得速度降下来。
分段和分页都有它们的长处:
- 分页对程序员是透明的,它消除了外部碎片,因而可以更有效地使用内存,并且移入或移出内存的块是固定的,大小相等的。
- 分段对程序员是可见的,它具有处理不断增长的数据结构的能力以及支持共享和保护的能力。
- 在段页式的系统中,用户的地址空间被程序员划分成许多段。每个段一次划分成许多固定大小的页,页的长度等于内存中页框的大小。
- 从程序员的角度看,逻辑地址仍然由段号和段偏移量组成,从系统的角度看,段偏移量可视为指定段中的一个页号和页偏移。
页式和段式的区别:
相似:离散分配,地址映射机构来实现地址转换
(1)页是信息的物理单位,分页是为了实现离散分配方式,减少内存的外零头,提高内存利用率,或者说是由于系统管理的需要,而不是用户的需要。段是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了更好地满足用户的需要。
(2)页大小固定且由系统决定,把逻辑地址划分为页号和页内地址两部分,是机器硬件实现的,段的长度不固定,却决定于用户所编写的程序,通常由编译系统在对源程序进行编译时根据信息的性质来划分。
(3)页内系统地址是一维的,即单一的线性地址空间,程序员只需利用一个标识符,即可表示一个地址。分段的作业地址空间是二维的,程序员在标识一个地址时即需要给出段名,又需要给出段内地址。