本篇内容主要讲解“什么是虚拟内存与进程地址空间”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是虚拟内存与进程地址空间”吧!
虚拟内存
虚拟内存,是操作系统物理内存和进程之间的中间层,它为进程隐藏了物理内存这一概念,为进程提供了更加简洁和易用的接口以及更加复杂的功能。
虚拟内存使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
使用虚拟内存的好处
虚拟内存技术使得每个进程都可以独占整个内存空间,地址从零开始,直到内存上限。
程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。
不同进程使用的虚拟地址彼此隔离。
进程地址空间的划分
现代操作系统对每个进程都分配了完整的虚拟内存地址空间,所谓的进程地址空间,也就是用户空间,用户态。
进程地址空间,分为几个区域,分别是代码段(code/text)、数据段(data/gvar)、BSS段、堆区和栈区。
每个进程都将这部分空间(从低地址到高地址)分为六个部分:
TEXT段:整个程序的代码,以及所有的常量;这部分内存是是固定大小的,只读的
DATA段,又称GVAR:初始化为非零值的全局变量
BSS段:初始化为0或未初始化的全局变量和静态变量
HEAP(堆空间):动态内存区域,使用malloc或new申请的内存
未使用的内存
STACK(栈空间):局部变量、参数、返回值都存在这里,函数调用开始会参数入栈、局部变量入栈;调用结束依次出栈
其中堆空间和栈空间的大小是可变的,堆空间从下往上生长,栈空间从上往下生长。
由于常量存储在TEXT段中,所有对常量的赋值都将产生segment fault异常。
可以认为BSS段中的所有字节都是0。因为未初始化的全局变量、静态变量都在BSS段中, 所以它们都会被初始化为0,同时类的成员变量也会被初始化为0,但编译器不保证局部变量的初始化。
上面说栈(STACK)是从上到下(高地址到低地址)分配的,而且我们知道, 函数的局部变量的空间是在进入函数体后才分配的,在栈空间里。
CPU寻址
现代的操作系统都引入了虚拟内存,虚拟内存的寻址需要硬件与操作系统之间互相合作。
CPU中含有一个被称为内存管理单元(Memory Management Unit, MMU)的硬件,它的功能是将虚拟地址转换为物理地址。
MMU需要借助存放在内存中的页表来动态翻译虚拟地址,该页表由操作系统管理。
页面置换算法
操作系统以页为单位管理内存,当进程发现需要访问的数据不在内存时,操作系统可能会将数据以页的方式加载到内存中。
当发现要访问的页面不在内存中时就会产生缺页中断,如果内存中没有空闲的内存,操作系统就需要选择一个页面移出内存,为新的页面腾出空间。
页面置换算法的作用就是实现虚拟存储管理。
常见的页面置换算法
OPT页面置换算法(最佳页面置换算法)
FIFO页面置换算法(先进先出页面置换算法)
LRU页面置换算法(最近未使用页面置换算法)
LFU页面置换算法(最少使用页面排序算法)
内核空间和用户空间
下图以64位系统为例,虚拟内存空间的划分如下:
从0x0000000000000000到 0x00007FFFFFFFFFFF为用户空间。
从0xFFFF800000000000 到0xFFFFFFFFFFFFFFFF为内核空间。
到此,相信大家对“什么是虚拟内存与进程地址空间”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。