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

虚拟内存管理

程序员文章站 2024-03-24 14:17:40
...

定义
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
我的理解
进程实例在用户态并不直接操作物理内存地址,实际物理内存是可能是零散的,用户管理起来绝对要疯,所以,用户可见的实际上是一段连续的虚拟地址空间。
并且,虚拟内存遵循用到时才申请的原则,不会说你开辟了G级空间,就需要分配G级物理内存。

int main()
{
    char* test = (char*)malloc((unsigned long long)64*1024*1024*1024) ;
    test[0] = '1';
    cout<<test[0]<<endl;
    return 0;
}

虚拟内存管理
可以看到实际使用的物理内存才1092个字节

虚拟内存段式管理
下图是进程实例中各段内存布局。
虚拟内存管理
这张图其实还少了一部分,就是地址随机化

配置在 /proc/sys/kernel/randomize_va_space
0:不开启ASLR
1:运行栈和共享库以及部分堆的随机化
2:在1的基础上包括所有堆的随机化
开启klaslr后,.text/.rodata/.init/.data/.bss这些段相对于基地址都加上了一个offset

虚拟内存页式管理
一般一页4K,由内存管理部件MMU负责统一管理。
有几点需要注意
1 进程开辟的虚拟内存并不全部加载进来,就像课本一样,用到哪一页就加载哪一页。
2 当发现需要用到的页不在内存时,会触发缺页中断,执行加载
3 当发现物理内存不够用时,会触发页面置换,通过一些算法,淘汰一个页进入swap,然后加载需要的页。
可参考:https://blog.csdn.net/weixin_44682507/article/details/103587653

相关标签: 笔记 操作系统