一、逻辑地址,物理地址
首先谈谈物理地址。物理地址就是我们平时所说的内存(主存)。我们可以把内存想象成一个长条状的旅馆,里面有一间一间的小房间,称为字节 。也就是说,字节是内存的基本单元,一个字节包括8个比特。
我们现在经常听说到32位操作系统,那么这是什么意思呢?
实际上32位,就表示主存地址表示范围是0—2^32 - 1。
因为在计算机中都是比特位,所以32位只能表示2^32个不同的状态。
进一步说明,主存只有2^32个Byte(小单元)。所以主存大小不可能超过4GB。
内存条模拟图:
再来说说逻辑地址
为什么会有逻辑地址的存在?
因为程序在编写的时候,会用地址操作。怎么理解呢?比如我们编程时书写:int a = 3; int b = a;
这条指令里面肯定是涉及到地址操作的,我们需要把3这个数移到a地址中;后面我们又要把a里面存的数移到b这个地址单元里面去存起来!
但是这里的地址不可能是物理地址,因为你的程序还没有跑起来,我怎么知道要放到哪片内存中去呢?因此逻辑地址的概念就出来了。
因此,每个程序都有自己对应的逻辑地址,都是从0开始的。但是最后存到物理地址上就不一定是从0开始了。
当然,这里面还有地址映射的问题。简单来说就是逻辑地址和物理地址的映射。这样CPU才能运行该进程。
图示:
二、程序的装入
我们都见过电脑上的.exe
文件,这我们一般称之为可执行文件,我们也可以称之为可装入文件
当我们点击.exe文件开始运行的时候,这时候就产生了该程序的进程。相当于该程序从磁盘上装进了内存,这个过程我们称为程序的装入。
三、内存分配
我们知道,程序是躺在磁盘上的,要让它运行起来,必须进入内存。那么这就涉及到操作系统的内存分配问题了。如何给进程分配合适的内存空间呢?如何保证进程分配的空间是可用的、空闲的呢?如何保证分配的策略是最高效的呢?
这里有两大类内存分配方式:
1、连续型分配方式
2、非连续型分配方式
连续型分配方式
为什么叫连续型分配方式呢?因为在这种分配方式中,进程是以一个完整的状态来分配的,不会对进程进行划分。类似于原子性。
连续型分配方式包括三种:
1、单一连续分配
2、固定分区
3、动态分区
单一连续和固定分区都是不可行的。为什么呢?
单一连续:它的思想是,每次就把所有的内存空间分配给一个要执行的进程。
这种方式,一听就是不可能实用的。现在都是多道程序设计,进程是并发的,你这样分配的话,进程并发基本不可能!
固定分区:它的思想是,把内存分成若干个分区,每一块规定上大小。
那么,问题也来了。我要跑五个进程怎么办?或者说,我要跑的进程占据的空间比分区划分的空间大,怎么办呢?因此,固定分区也是不实用的。
因此,关于连续分配的话,我们重点要讨论的是动态分区
接下来,再大概介绍一下非连续分配方式
非连续分配方式是我们要重点掌握的,也是现在最常用的内存分配方式。
其中又包括三种分配方式:
1、页式存储管理
2、段式存储管理
3、段页式存储管理
页式和段式都有一定的缺陷,所以有了段页式,集合二者的优点。段页式是现在操作系统常用的内存管理方法。
关于动态分区内存分配的几种算法、非连续分配的详细解释,详见后续。