进程虚拟空间分布
【进程虚拟空间分布】
目录
- 进程虚拟空间分布,全局变量放哪里?
- 1.用户空间
- 1.1只读数据段
- 1.2代码段(.text)
- 1.3.数据段(.data,.bss)
- 1.4.堆
- 1.5.内存映射段
- 1.6.栈
- 1.7栈与堆的区别
- 2.内核空间
- 2.1内核代码段
- 2.2与进程有关的数据结构段
- 1.用户空间
进程虚拟空间分布,全局变量放哪里?
文章图片
文章图片
1)在linux下内存分配是以页为单位的,而页是通过段管理
2)一个linux进程的虚拟地址空间分布如上图所示,分为用户空间和内核空间初始化的全局变量分配在.data段(Section)内
未初始化的全局变量分配在.bss段(Section)内
1.用户空间 1.1只读数据段
只读数据段(也叫常量段,.rodata,Read Only之意,未在图中标出)
1)存放只读数据:字符串常量(如"hello")和const修饰的全局变量2)不是所有的只读数据都是放在只读数据段,有些可以通过立即数(在立即寻址方式指令中给出的数称为立即数;立即寻址方式:操作数紧跟在操作码的后面,与操作码一起放在指令代码中)来实现的常量(如“int i=5”中的“5”)不存放在只读数据段,而是直接编码在指令里,存放在在正文段3)const修饰的全局变量是存放在常量段的,但是使用const修饰的局部变量不存放在常量段,存放在栈段4)对于字符串常量,编译器会在常量段中自动去重,让每种字符串常量只有一份5)为了提高空间的利用率,有些系统中.rodata段是多个进程共享的6)程序加载运行时,.rodata和.text通常合并到一个段(Text Segment)中,操作系统将这个段只读保护起来,防止意外的改写
1.2代码段(.text)
代码段(.text),也叫正文段,存放代码
1.3.数据段(.data,.bss)
1)存放全局变量和静态变量2)初始化数据段(.data):存放已经初始化的3)未初始化数据段(.bss):存放未初始化的4).data和.bss在程序加载时合并到一个段(Data Segment)中,这个段是可读可写的5)c++不区分初始化的和未初始化的,它们占同一块区域
1.4.堆
动态内存的分配
1.5.内存映射段
1)常被用来加载共享库(动态库)2)内存映射:将虚拟内存空间与磁盘上的文件关联起来,这个过程叫内存映射
1.6.栈
存放局部变量
1.7栈与堆的区别
1)管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存泄露2)空间大小:一般来讲在32位系统下,堆内存可以达到3G的空间(4G有1G要给内核);而栈的最大容量是事先规定好的(例如,在VC6下面,默认的栈空间大小是1M,可修改)3)碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低;对于栈来讲,则不会存在碎片,因为栈是先进后出的结构,一个内存块要从栈中弹出,在它上面的后进的内存块肯定要先被弹出4)生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长;5)分配方式:堆都是动态分配的;而栈有2种分配方式:静态分配和动态分配,静态分配是编译器完成的,比如局部变量的分配,动态分配由alloca函数(类似于malloc,专门在栈中申请空间的函数)进行分配,但是即使是动态分配,它也和堆是不同,栈的动态分配是由编译器进行释放,无需我们手工释放6)分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高;堆则是C/C++函数库提供的,它的机制是很复杂,例如:为了分配一块内存,库函数会在堆内存中搜索连续的足够大小的空间,如果没有足够大的空间(可能是由于内存碎片太多),就需要操作系统重新整理内存空间,这样就有机会分到足够大的内存,然后进行返回。显然,堆的效率比栈要低得多
2.内核空间 2.1内核代码段
存放内核的代码和数据,所有进程的内核代码段都映射到同样的物理内存,并在内存中**持续存在**
2.2与进程有关的数据结构段
页表:操作系统不是以字节为单位管理内存的,而是以页为单位管理内存,一页通常为4KB。
PCB: 进程控制块
存放进程都各自的[PCB]和[页表],并映射到不同的物理内存
推荐阅读
- “创新雷神号”卫星成功发射,华为云分布式云原生“天地一体”首次组网成功
- 分布式系统中的降级熔断设计问题面试
- 分布式边缘容器项目 SuperEdge v0.7.0 版本来袭!
- 分布式边缘容器项目|分布式边缘容器项目 SuperEdge v0.7.0 版本来袭!
- 分布式|服务端渲染(SSR) 通用技术解决方案
- 分库分表|香,聊聊TiDB的分布式事务模型
- 联邦学习(按混合分布划分Non-IID样本)
- java分布式面试系统限流最佳实践
- 分布式架构Redis中有哪些数据结构及底层实现原理
- 操作系统面试总结