分段和分页结合:Pentium
  如果一个段比较大,把它整个保存在内存中可能很不方便甚至是不可能的,因此产生了对它进行分页的想法。这样,只有那些真正需要的页面才会被调入内存。
  每个段都看做是一个虚拟内存并对它进行分页,以结合分页的优点(统一的页面大小和在只使用段的一部分时不用把它全部调用内存)和分段的优点(易于变成、模块化、保护和共享)。
  Pentium处理器中虚拟内存的核心是两张表,即LDT(局部描述符表)和GDT(全局描述符表)。每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等,GDT描述系统段,包括操作系统本身。
  为了访问一个段,一个Pentium程序必须把这个段装入机器的6个段寄存器的某一个。在运行过程中,CS寄存器保存代码段,DS寄存器保存数据,其他寄存器不太重要。
  小结
  系统通过交换技术可以同时运行总内存占用超过物理内存大小的多个进程,如果一个进程没有内存空间可用,它将被换到磁盘上。内存和磁盘上的空间可以使用位图或空闲区列表来记录。
  现代计算机都有某种形式的虚拟内存。在简单的形式中,每一个进程的地址空间呗划分为同等大小的块,成为页面,页面可以被放入内存中任何可用的页框中。有多重页面置换算法,其中两个比较好的算法是老化算法和工作集时钟算法。
  分段可以帮助处理在执行过程中大小有变化的数据结构,并能简化链接和共享。分段还有利于不同的段提供不同的保护。有时,可以把分段和分页结合起来,以提供一种二维的虚拟内存,Pentium是这样及支持分段也支持分页的系统。
  Linux中的内存管理
  每个Linux进程都有一个地址空间,逻辑上有三段组成:代码段、数据段和堆栈段。
  代码段包含了形成程序可执行代码的机器指令。它是由编译器和汇编器把C、C++或者其他程序源码转换成机器代码而产生的。
  数据段包含了所有程序变量、字符串、数字和其他数据的存储。它有两部分,初始化数据和未初始化数据。
  跟代码段不同,数据段可以改变。程序总是修改它的变量。而且,许多程序需要在执行时动态分配空间。Linux允许数据段随着内存的分配和回收而增长和缩短,通过这种机制来解决动态分配的问题。
  第三段是栈段。在大多数机器里,它从虚拟地址空间的顶部或者附近开始,并且向下生长。如果栈生长到了栈段的底部以下,会产生一个硬件错误同时操作系统把栈段的底部降低一个页面。程序并不显式地控制栈段的大小。
  当一个程序启动的时候,它的栈并不是空的。相反,它包含了所有的环境变量以及为了调用它而向shell输入的命令行。
  Windows Vista内管管理
  在Windows Vista系统中,每个用户进程都有它自己的虚拟地址空间。对于x86机器,虚拟地址是32位的,因此,每个进程拥有4GB大小的虚拟地址空间。其中用户态进程的虚拟地址大小为2GB(在服务器器系统中,用户态进程的虚拟地址大小可以配置为3GB)。另外的2GB(或1GB)空间为内核进程所用。