虚拟地址空间,一个进程中的内存分段,全网最详细

1519720bd5a645fe86f51ee28de48b24.png

 

虚拟地址空间:传统的进程管理每个进程都占连续的物理内存空间,如果内存爆满需要将很久没用的但还在内存中的整个进程拷贝到硬盘中,等需要用时重新加载回内存。现代计算机使用虚拟地址空间,虚拟地址空间每个进程的4g并不是真的有,像是老板给员工画大饼,如果努力有可能达到,职位可能只有两个,因为整个计算机实际运行内存才8g。为了减少内存移动,提高利用率,隔离进程保护安全,加入了虚拟的地址,把内存分割成很多页(一个页4k)映射存储,需要经过MMU芯片转换才能访问实际物理内存。因为4k很小,所以可以嵌入很多被使用的内存块中间,而不像传统的进程那样即使夹在进程A和B有100mb,但我需要150mb,而E和F之间也有60mb,如果分开存储那够了,但不好意思一个进程内存不允许切开,C得暂时避让。

  虚拟地址空间包括内核区和用户区,用户区从上到下是栈、映射区、堆、未初始化默认为0的全局区(static静态区)、已初始化的全局区、常量区(字符串以及const常量)、代码区。全局变量区、堆区是每个应用进程独享的内存。内核区是系统管理的代码,每台电脑只有一个实体(物理内存),共享区是动态链接库代码,把常用的功能都集成在里面多个应用可共用。

  而代码区是进程共享的,即函数的语句,指使着如何运算,他们之间的逻辑关系,运用哪个数据进行怎样的操作,比如y=x*x+3;全部都是已知指令,但是该数据可以是地址间接引用如变量x,具体的内容是变化的,到栈区去找,也可以是固定的立即数3。栈区是每个线程独享,是函数的运行地。

 函数调用时栈中的内存的变化:先用push指令把参数压栈,然后调用call指令,call指令包含两个操作:把下一条语句的地址压栈,为了保证调用的函数退出时能找到之前函数的地址,接着跳转到函数起始地址处。调用的函数开头的指令:把上一个函数函数的栈基地址压栈,新的函数的栈基寄存器ebp赋值为旧的栈顶,最后新的栈顶减去一个数,这个数在编译时已经确定了即为该函数临时变量的总大小,扩大到足够的栈帧空间。个人感觉只需一个栈顶寄存器就能完成功能。

 

堆区是隐式链表,由block组成,每个块由三部分组成,状态位0、1表示使用和未使用,大小位,表示这个块空间多大,剩下的是存放数据可使用的块,malloc的原理,寻找原理:有最佳适配,就是选定需要开辟的内存与前后已用块之间夹着的空闲块相差最小的块,提高空间利用率;首次适配算法:从头开始扫描,一有空闲块大于将要开辟的大小就立即占用,时间较短但可能造成空隙大浪费空间。因为堆区一开始不知道要使用多少内存,需要动态开辟,堆区一开始向系统申请一块大内存(128k到几mb),然后零售给程序中的各函数使用。调用malloc时,只是分配了对应的虚拟地址空间。只有当访问该部分内存时产生缺页反应才会真正分配物理内存并将物理内存和虚拟内存建立映射关系。free只是归还给虚拟空间,更改下状态位为0,并未真正释放,如果有malloc函数扫描到之前的释放的块那可直接使用,而不用向系统频繁申请空间。free有两种策略,一是立马合并左右块,如果右边也是空闲块的话,如果双向链表还会检查左边是否空闲之后三块合并;第二种空闲时系统才扫描下有没有需要合并的。合并空闲块是避免产生过多碎片化空间,让它们变大,以后的malloc调用才不会产生都不够大的情况。如果调用malloc函数时查找块从头到尾遍历完了实在没有空闲块就会移动堆区有效指针break以实现扩容,是内核调用,花费时间。如果用到了新的页面就要分配物理页。如果指针在同一个页面里面移动就不用。

在虚拟地址空间中文件映射段(动态库/共享区)mmap是用来将硬盘中的文件映射到内存中以加快效率,直接在内核缓冲区操作减少复制在用户缓冲区的过程。2.也可以作为dll系统库共享区3.还可以作为堆的功能,如果heap堆区满了再向上推break指针以实现真正的扩容,但是当要申请的空间大于128k,直接使用mmap申请开辟,释放时不是归还给程序管理,而是可以直接单独释放对应的物理内存。堆区高地址部分的块释放后还有堆顶指针brk附近的连续空闲内存大于128K时,将进行真正意义上的内存回收,才把堆指针往下降;如果高地址的块还没free,在它下面的块即使free也不会单独释放

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值