内存不够怎么办?

来源:互联网 发布:mac pdf导出jpg 编辑:程序博客网 时间:2024/04/29 12:15
  • 进程的总体目标是希望每个进程从逻辑上看都可以独占计算机的资源。
  • OS的多任务功能使得CPU能够在多个进程之间很好地共享,从进程的角度看好像是它独占了CPU,而不用考虑其他进程分享CPU的事情。
  • OS的I/O抽象模型也很好地实现了I/O设备的共享和抽象,那么唯一剩下的就是主存,也就是内存的分配问题了。

在早期的计算机中,程序是直接运行在物理内存上的,也就是说,程序在运行时所访问的地址都是物理地址。当然,如果一个计算机同时只运行一个程序,那么只要程序要求的内存空间不要超过物理内存的大小,就不会出问题。但事实上为了更有效地利用硬件资源,我们必须同时运行多个程序,正如前面的多道程序,分时系统和多任务中一样,当我们能够同时运行多个程序时,CPU的利用率将会比较高。那么很明显的一个问题是,如何将计算机上有限的物理内存分配给多个程序使用。
  •      假设我们的计算机有128MB的内存,  A程序运行需要10MB, B程序需要100MB,程序C需要20M。如果我们同时运行程序A和B,那么比较直接的做法是将内存的前10MB分配给程序A, 10MB~110MB 分配给B。 这样就能够实现A和B两个程序同时运行,但是这种简单的内存分配策略问题很多。
    1. 地址空间不隔离: 
      1. 所有的程序都直接访问物理地址,程序所使用的内存空间不是相互隔离的。恶意的程序可以很容易改写其他程序的内存数据,以达到破坏的目的;
      2. 有些非恶意的,但是有臭虫的程序可能不小心修改了其他程序的数据,就会使其他程序也崩溃,这对于需要安全稳定的计算环境的用户来说是不能容忍的。
      3. 用户希望他在使用计算机的时候,其中一个任务失败了,不会影响其他任务。
    2. 内存使用效率低下:
      1. 由于没有有效的内存管理机制,通常要一个程序执行时,监控程序就将整个程序装入内存中然后开始执行。
      2. 如果我们忽然要运行程序C,那么这时候内存空间其实就已经不够了,这时候我们可以用的一个办法是将其他程序的数据暂时写到磁盘里面,等到要用到的时候再读回来。
      3. 由于程序所需要的空间是连续的,那么这个例子里面,如果我们将程序A换出到磁盘所释放的内存空间是不够的,所以只能将B换出到磁盘,然后将C读入到内存开始运行。
      4. 可以看到整个过程有大量的数据在换入换出,导致效率低下。
    3. 程序运行的地址不确定:
      1. 因为程序每次需要装入内存运行,我们都需要给它从内存中分配一块足够大的空闲区域,这个空闲区域的位置是不确定的。
      2. 这给程序的编写造成了一定的麻烦,因为程序在编写时,它访问数据和指令跳转时的目标地址很多都是固定的,这涉及程序的重定位问题
  • 解决这三个问题的思路就是使用我们前文提到的法宝:增加中间层,即使用一种间接的地址访问方式。整个想法是这样的:我们把程序给出的地址看作是一种虚拟地址(Virtual Address),然后通过某些映射的方法,将这个虚拟地址转换成实际的物理地址。这样,只要我们能够妥善地控制这个虚拟地址到物理地址之间的映射过程,就可以保证任意一个程序所能够访问的物理内存区域跟另外一个程序相互不重叠,以达到地址空间隔离的效果。
1 0