Linux_12:进程地址空间

地址空间布局图

1.先写段测试代码

允许结构:

可以看到子进程对数据的改变,不影响父进程,因为写时拷贝进程具有独立性

进程=PCB(内核数据结构)+进程数据和进程代码(程序段和数据段)

2.得到结果

可以看到地址一样,如果这个地址是物理地址的话,可不可能两个进程在读取数据的时候,读到不一样的内容?

这是绝对不可能的

得出结论:

  • 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量

  • 但地址值是一样的,说明,该地址绝对不是物理地址!

  • 在Linux地址下,这种地址叫做 虚拟地址

  • 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

3.地址空间

地址空间是线性的!

主要做的就是对区域的划分

对线性区域进行指定start和end即可完成区域的划分

如果我们限定了区域,就是把一个线性区域的头和尾截出来,这些区域的数据叫做虚拟地址or线性地址

修改边界值就可以继续区域的调整

4.是什么?

我们的地址空间和物理空间之间存在一个页表

我们的程序通过页表的映射来找到对应的物理地址!

为什么子进程和父进程会指向的是同一个地址空间,但是读取的值却不一样?

由于fork()函数,子进程是父进程的一个拷贝
在子进程修改物理内存的时候,会被操作系统阻止,
操作系统会重新在物理内存中开辟一个空间,让子进程的页表去指向该物理地址
但是在修改页表指向的时候,只是改变了页表指向物理内存的V值
打印的地址是页表的K值
而子进程指向页表的K值不变,所以打印的地址不表,
所以我们才会看到父子进程指向同一块地址

历史遗留问题:在该段代码中,为什么两个死循环都能执行?

fork在返回的时候,父子都有了,return两次,返回的本质就是写入

谁先返回,谁就让OS发生写时拷贝

虚拟地址有什么用?

  • 1.防止地址随意的访问,保护物理内存与其他程序

  • 2.将进程管理和内存管理进行解耦合

  • 3.可以让进程以通过以的视角,看待自己的代码和数据

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值