linux 进程的虚拟内存

参考:https://blog.csdn.net/fengxinlinux/article/details/52071766

 

# 我要知道:程序是如何加载到内存中去的
how 

每个进程都有自己的4G内存空间,内存空间具有类似结构
每个进程的内存空间都只是虚拟空间
所有进程都共享同一物理内存
每个进程只把自己目前需要的虚拟内存映射并存储到物理内存中

when 

一个新的进程建立的时候,会建立自己的内存空间
每个进程创建加载时,内核只是为进程创建了虚拟内存的布局,具体就是进程控制表中内存的相关链表,实际上不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好,等到运行到对应的程序时,才会通过缺页异常来拷贝数据
程序运行过程中要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表做相应设置,当进程真正访问到此数据时,才引发缺页异常


where

程序的数据、代码会从磁盘拷贝到自己的进程空间
哪些数据放在哪里,都由进程控制表中的task_struct记录
task_struct中记录一条链表(哪些地址有数据,哪些地址可读,都通过这个链表记录)
进程已经分配的内存空间都与对应的磁盘空间映射
进程通过页表记录哪些内存上的数据在物理内存上
页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存的地址
当进程访问某个虚拟地址,去看页表,如何发现对应的数据不再物理内存中,则缺页异常
缺页异常的处理过,就是把进程需要的数据从磁盘上拷贝到物理内存中,如果内存已经满了那就找一个页覆盖,如果被覆盖的页曾经被修改过,需要将此页写回磁盘


应用虚拟内存机制有很多优点:

1.既然每个进程的内存空间都是一致而固定的,所有链接器在链接可执行文件时,可以设定内存地址。而不去管这些数据最终实际的内存地址,这是独立内存空间的好处
2.当不同的进程使用相同的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了
3.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值