进程的虚拟地址空间

Linux进程虚拟地址空间是linux内存管理的一个重要部分。总的虚拟地址空间通常按3:1的比例划分,其中1G分给内核,3G分给用户。

由低地址到高地址分别为: 
只读段:该部分空间只能读,不可写;(包括:代码段、rodata 段(C常量字符串和#define定义的常量) )
数据段:保存全局变量、静态变量的空间; 
堆:就是平时所说的动态内存, malloc/ralloc/calloc 大部分都来源于此,其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。;
栈:用于维护函数调用的上下文空间; 
内核虚拟空间:用户代码不可见的内存区域,由内核管理。


物理内存:当打开程序时,系统会将这些程序加载到物理内存上。

虚拟内存:虚拟的不是物理内存,而是代替物理内存行使存储的功能,物理内存的运行程序的功能是无法用虚拟内存来完成的。

物理内存与虚拟内存的关系:当运行程序过多,物理内存不够用时,系统会将一部分硬盘空间当内存使用,这部分空间就是虚拟内存。

虚拟地址空间作用:解决物理内存稀缺问题;系统为每个进程所分配的4GB虚拟地址空间(32位系统),用来存放进程的虚拟地址,再通过MMU(内存管理单元)将虚拟地址映射到物理内存地址。



虚拟内存和虚拟地址空间的区别:
windows下的虚拟内存指的是在硬盘上建一个文件,用来放置系统非活跃性内存数据或交换数据(怎么放,放多少由操作系统决定)。
虚拟地址空间,指windows下每个进程的私有内存空间,大小是4G,能访问的是不到2G的空间,其余是系统保留的。这2G是能访问的,但并不是立即分配的,当进程使用多少时,才从物理内存中划分给它多少,划分的的方式是"映射",操作系统将虚拟内存的起始地址做个标记,标记成对应的物理内存的某个地址上.在这里,只有操作系统知道,进程是没有任何办法知道的,这是windows的高级内存管理机制决定的。物理内存的地址空间,只有操作系统才能访问(硬件驱动也可以,但已经属于系统低层了,进程是属于用户层)进程虚拟内存空间和物理内存空间的关系仅仅是看不见的映射关系。
虚拟内存通常只在系统物理内存用完时,才会使用到,但这个时候系统已经非常卡了.但也不是一点用处没有,非活跃性进程的部分数据,系统是完全可以放在虚拟内存中的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值