本文主要是从存储的角度来介绍一个程序是怎么在操作系统中运行的,借以来对操作系统的内存管理做一个简单的了解。
1、以前是怎么做的?
在早期的时候,存储器是没有抽象的,都是通过命令来直接访问物理内存,在这种情况下,想要在内存中同时运行两个程序是根本不可能的,因为当两个程序同时操作同一地址时,它就可能崩溃了。
既然物理地址直接暴露给不同的进程非常危险,那聪明的人类是有办法的啦!如果想要解决多个应用程序同时处于内存中而相互之间不会影响,要解决两个问题:保护和重定位。于是,一个新的概念诞生了:地址空间。所谓地址空间,就是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(当然,有些时候不同的进程之间也会有共享的地址空间)。
如何让每个进程都能动态定位自己的地址空间呢?解决方法是给每个CPU配置两个特殊硬件寄存器:基址寄存器和界限寄存器。当一个进程运行的时,程序的起始物理地址装载到基址寄存器,程序的长度装载到界限寄存器。但是,由于软件越来越强大,大小也在不断的增加,我们会遇到内存不够用的情况啊。下面介绍两种解决方法。
最简单的就是交换技术,就是让一个进程在内存中运行一段时间,然后又放到硬盘。如果对IO有一定的了解,你肯定就想到,这个不断的硬盘读出写入,得多浪费时间啊!是的。于是,主角就要登场了!虚拟内存!!!说白了它就是把进程的一部分调入到内存运行。注意,我们程序在运行的时候,并不是要整个加载到内存才能运行的,部分加载,它就能跑,就是这么牛。
2、虚拟内存是怎么做的?
那么,虚拟内存是怎么做的呢?每个程序都拥有自己的地址空间(注意,这个地址空间应该叫做虚拟地址空间才对,对于32位的操作系统,它是4G,进程本身会认为它就是占用了4个G的物理地址,其实那个虚拟的),这个空间被分割成很多块,每个块我们称为一页(一般来说,对于3