前几天碰到一个题,操作系统如何处解决可寻址逻辑地址空间大而物理内存小的矛盾。
  这个题目我简单理解为操作系统处理内存超载的方法。
  如果计算机的内存足够大,可以保存所有进程,那么问题似乎不是问题,实际上,所有进程所需的内存数量总和通常要远远超出储存器能够支撑的范围。当一个系统在计算机引导完成后会启动几十个进程,单单的一个用于查看该程序的更新进程会吃掉几兆的内存,后台还有很多诸如此类的任务。当前的重要应用程序更是很容易吃掉一两百兆甚至更多的空间,因此把所有进程一直保存在内存中是很不现实的。
  解决内存超载有两种策略,交换技术和虚拟内存。
  交换技术
  把一个进程完整调入内存,使该程序运行一段时间,然后把它存回磁盘。空闲进程主要储存在磁盘上,当它们不运行时不会占用内存(尽管它们的一些进程会周期性的被唤醒以完成相关工作,然后又进入睡眠状态)这种技术是进程在内存与外存之间的动态调度。
  在选择换出哪个进程时,将长时间等待的那个进程换出。
  交换时机的确定
  a、只要不用换出(很少再用)
  b、在内存空间不够或有不够的危险时换出
  3、交换时需要做哪些工作?
  换出:用户程序的内存映像完整地换出;
  换入:确定换入的地址,进行换入,并设置相应的环境。
  换出后再换入的内存位置受地址“绑定”技术的影响,即地址产生时机的限制。
  虚拟内存
  该策略甚至能使程序在只有一部分被调入内存的情况下运行。虽然储存器容量在增长但是软件大小增长更快,总体来看交换技术并不是一个有吸引力的解决方案。虚拟内存的基本思想是每个程序拥有自己的地址空间,这个空间被分为很多个小块,每一块称做一个页面,每一页有连续的地址范围。这些页被映射到物理内存,当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。
  虚拟内存不只是“用磁盘空间来扩展物理内存”的意思,把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的作用也可以通过覆盖或者把处于不活动状态的程序以及它们的数据全部交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。