欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

虚拟地址

程序员文章站 2022-06-03 22:47:10
...

问题:
变量a b c是全局变量,其内存地址在链接时就应经决定了,以后也不会再改变,因此其输出结果无论何时都应该是一样的,那么如果物理内存中地址被别的程序占用了,那程序是不是就不能运行了?

//代码
#include<stdio.h>
#include<stdlib.h>
int a,b,c;
int main()
{
    a = b = c = 0;
    printf("pa = %p,pb = %p,pc = %p\n",&a,&b,&c);
    return 0;
}
//结果
[[email protected] memory]$ ./addr 
pa = 0x601040,pb = 0x601038,pc = 0x60103c
[[email protected] memory]$ ./addr 
pa = 0x601040,pb = 0x601038,pc = 0x60103c
[[email protected] memory]$ ./addr 
pa = 0x601040,pb = 0x601038,pc = 0x60103c

虚拟地址

实际上,这些内存地址都是假的,不是真实的物理内存地址,而是虚拟地址

虚拟地址通过cpu的转换才能对应到物理地址,而且每次运行程序时,
操作系统都会从新安排虚拟地址和物理内存的对应关系。
虚拟地址通过设定的内存映射机制找到对应的物理内存。

对于程序而言,它并不关心内存是如何管理的,它只需要一个可执行的环境,有自己的内存、cpu。好像自己占用了整个计算机一样,实际上程序在运行的时候也正是如此。以内存为4g的计算机为例子,每个程序都会假设有4g的内存空间(虚拟内存),其中的前1g(linux)/2g(windows) 由内存控制,后面的部分包括:栈 堆 代码区 字符常量区 共享区由用户控制。

虚拟地址的优点:除了可以固定内存地址外,还可以是不同程序的地址空间相互隔离,提高内存的使用效率,增加安全性

提高安全性
如果所有程序都直接使用物理内存,程序的内存可以会被别的程序修改。

提高性能
使用虚拟地址后,操作系统可以更好的介入到内存管理中,可以控制内存的权限,提高内存的使用率。

相关标签: 内存