虚拟地址

问题:
变量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;
}
//结果
[jwq@localhost memory]$ ./addr 
pa = 0x601040,pb = 0x601038,pc = 0x60103c
[jwq@localhost memory]$ ./addr 
pa = 0x601040,pb = 0x601038,pc = 0x60103c
[jwq@localhost memory]$ ./addr 
pa = 0x601040,pb = 0x601038,pc = 0x60103c

虚拟地址

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

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

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

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

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

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

发布了93 篇原创文章 · 获赞 11 · 访问量 5866

猜你喜欢

转载自blog.csdn.net/weixin_44997886/article/details/104518034