例如,你在进行C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当前进程数据段的地址,不和绝对物理地址相干。
您需要了解一下操作系统的虚拟内存机制。
操作系统会为新建立的每一个进程开辟一个独立却完整的地址空间(32位机器是4GB),其中除了一部分地址要交给操作系统的内核或用于某些特殊功用,程序可以自由地使用这些内存,就好像每个进程可以独自使用一台4GB内存的机器一样。但是要注意这是由操作系统虚拟出来的,系统的内存管理器要负责把这些虚拟的内存映射到真实的物理内存中。系统往往同时运行很多进程,要把真实的内存给每个进程都分配4GB当然不可能,所以系统往往还要借用硬盘来存放物理内存存不下的内容,协助虚拟内存的实现。实际的物理内存的状况是:零散无规律地分布着各个进程的内存页面。
当一个新进程启动时,操作系统首先为该进程创建虚拟内存空间,然后把程序的代码段和一部分数据放在固定的虚拟内存地址上。你说的那个变量A就是被包含这部分数据中,每次启动程序都可以看到它在一个固定的地址上,但是这个地址是在虚拟内存中的,实际它所对应的真实物理内存的地址是未知的,只有管理内存的系统内核知道。
当然,还有一部分数据在你的虚拟内存空间的地址也是未知的,这就是堆,堆允许程序在运行过程中动态分配和释放内存(其他的内存分配方式在程序启动时就在固定位置分配,不能改变),堆的分配和释放由C运行时库和操作系统协同管理,分配的内存地址是随机的。你说的那个变量A不是堆中的。
你说的逻辑地址就是在虚拟内存中的地址,物理地址就是在真实的物理内存中的地址。
对于以上有不懂的概念名词可百度查资料。收起
操作系统会为新建立的每一个进程开辟一个独立却完整的地址空间(32位机器是4GB),其中除了一部分地址要交给操作系统的内核或用于某些特殊功用,程序可以自由地使用这些内存,就好像每个进程可以独自使用一台4GB内存的机器一样。但是要注意这是由操作系统虚拟出来的,系统的内存管理器要负责把这些虚拟的内存映射到真实的物理内存中。系统往往同时运行很多进程,要把真实的内存给每个进程都分配4GB当然不可能,所以系统往往还要借用硬盘来存放物理内存存不下的内容,协助虚拟内存的实现。实际的物理内存的状况是:零散无规律地分布着各个进程的内存页面。
当一个新进程启动时,操作系统首先为该进程创建虚拟内存空间,然后把程序的代码段和一部分数据放在固定的虚拟内存地址上。你说的那个变量A就是被包含这部分数据中,每次启动程序都可以看到它在一个固定的地址上,但是这个地址是在虚拟内存中的,实际它所对应的真实物理内存的地址是未知的,只有管理内存的系统内核知道。
当然,还有一部分数据在你的虚拟内存空间的地址也是未知的,这就是堆,堆允许程序在运行过程中动态分配和释放内存(其他的内存分配方式在程序启动时就在固定位置分配,不能改变),堆的分配和释放由C运行时库和操作系统协同管理,分配的内存地址是随机的。你说的那个变量A不是堆中的。
你说的逻辑地址就是在虚拟内存中的地址,物理地址就是在真实的物理内存中的地址。
对于以上有不懂的概念名词可百度查资料。收起
poseidon_k | 发布于2012-08-02 16:04
4