fork()虚拟地址--写时拷贝

 地址:对内存单元的编号
程序是不占用内存的,运行起来的程序才会被加载到内存,才会占用空间。所以程序地址空间也叫做进程地址空间

 实际上进程中访问的地址都是虚拟地址,而我们所说的程序地址空间实际上就是一个进程的虚拟地址空间

为什么不让进程直接去访问物理内存呢?
1、进程中代码数据的使用都是连续的地址,若直接使用连续的物理内存会造成内存的浪费
2、如果一个进程中存在一个野指针,会访问到另一个进程中的数据。直接访问物理内存会因为缺乏内存访问控制导致进程的不安全

 虚拟地址空间是进程的虚拟地址空间,是操作系统为每个进程对于内存空间的虚拟描述,在linux下是一个结构体mm_struct

物理地址是我们用户看不到的,我们所看到的地址a1c463e0就是一个虚拟地址,但是我们真正存放的那个数据是存放到物理内存当中的。那我们如何通过虚拟地址访问到对应的物理地址呢?–页表,通过虚拟地址映射到页表中,再通过映射到页表中的位置再映射到物理内存中,从而找到相对应的数据。

写时拷贝

但是我们要知道一个问题,子进程在复制父进程的时候也复制了父进程的页表,那页表相同,虚拟内存地址也相同,映射的物理地址为什么不同呢?

解:Linux下的fork()函数利用了写时拷贝技术,子进程复制了父进程的页表,进程“读”操作的时候也能访问到同一个数据,那是因为他们映射到的物理内存上都是一块相同的空间。但是当有一个进程要进行“写”操作时,系统会在物理内存中复制出一块内存,然后将数据写进去,进行“写”操作的进程通过虚拟地址访问时就不是访问之前的那个数据,而是访问进行“写”操作后复制过来并写入数据的那块数据----写时拷贝技术:两个进程一开始指向同一块空间,等有进程进行“写”操作时候,再给进行“写”操作的进程重新开辟空间,目的就是提高子进程创建效率,保证进程的独立性

父进程创建子进程,子进程复制父进程的信息都是可读的,父子进程访问的都是同一块物理内存,只有当有进程进行写操作时,才会给子进程开辟新的内存空间来保存数据这也保证了进程之间的独立性。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值