1、gb(163, 163, 163) data-darkmode-original-color-15935121063646=rgb(62, 62, 62) 虚拟内存空间划分 通过这张图你可以看到,用户空间内存,从低到高分别是 7 种不同的内存段:程序文件段,包括二进制可执行代码;已初始化数据段,包括静态常量;未初始化数据段,包括未初始化的静态变量;堆段,包括动态分配的内存,从低地址开始向上增长;文件映射段,包括动态库、共享内存等,从低地址开始向上增长(跟硬件和内核版本有关)栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提
2、供了参数,以便我们自定义大小;在这 7 个内存段中,堆和文件映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。六、总结为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套的虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。每个进程都有自己的虚拟空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会
3、通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)。那既然有了虚拟地址空间,那必然要把虚拟地址映射到物理地址,这个事情通常由操作系统来维护。那么对于虚拟地址与物理地址的映射关系,可以有分段和分页的方式,同时两者结合都是可以的。内存分段是根据程序的逻辑角度,分成了栈段、堆段、数据段、代码段等,这样可以分离出不同属性的段,同时是一块连续的空间。但是每个段的大小都不是统一的,这就会导致内存碎片和内存交换效率低的问题。于是,就出现了内存分页,把虚拟空间和物理空间分成大小固定的页,如在 Linux 系统中,每一页的大小为 4KB。由于分了页后,就不会
4、产生细小的内存碎片。同时在内存交换的时候,写入硬盘也就一个页或几个页,这就大大提高了内存交换的效率。再来,为了解决简单分页产生的页表过大的问题,就有了多级页表,它解决了空间上的问题,但这就会导致 CPU 在寻址的过程中,需要有很多层表参与,加大了时间上的开销。于是根据程序的局部性原理,在 CPU 芯片中加入了 TLB,负责缓存最近常被访问的页表项,大大提高了地址的转换速度。Linux 系统主要采用了分页管理,但是由于 Intel 处理器的发展史,Linux 系统无法避免分段管理。于是 Linux 就把所有段的基地址设为 0,也就意味着所有程序的地址空间都是线性地址空间(虚拟
5、地址),相当于屏蔽了 CPU 逻辑地址的概念,所以段只被用于访问控制和内存保护。另外,Linxu 系统中虚拟空间分布可分为用户态和内核态两部分,其中用户态的分布:代码段、全局变量、BSS、函数栈、堆内存、映射区。原文地址:真棒!20 张图揭开内存管理的迷雾本文来源网络整理,不代表本站观点。分享本文章目的在于学习,如有侵权,请邮件告知删除,本站将在收到删除告知信息的情况下,24小时内删除,并给予道歉,谢谢支持!文库网lt;/p 【报告】阿里商业白皮书:每个企业都要变成一个数据公司 阿里120页PPT诠释国家“智能2.0”战略(附下载) 培养自身的卓越运营能力,以管理风险和不确定性。鉴于监管及经济发展的不确定性,企业需要更加灵活以实现其价值定位。各国政府在跨境投资、并购以及技术和人员流动方面的 作用越发凸显。企业应该重视业务市场的当地情况,因为情况可能发生骤变,敏感性可能会 升高,在运营上犯下的错误将迅速升级,吸引利益相关者的关注。企业也不妨考虑调整运营 足迹,但这需要企业本身具备足够的敏捷性,也意味着要向风险管理投入更多资源。p style=max-width: 100%;line-height: 2em;m