关于linux写时复制的一个疑问,C程序

问题描述

关于linux写时复制的一个疑问,C程序

linux写时复制的机制就是,当fork出一个子进程的时候,子进程并不立刻复制数据段,而是当子进程要修改数据时才分配相应内存给变量。按照这样的原理,我用C写了一个程序,声明一个全局变量并初始化,然后在进程里fork出一个进程,这时在父子进程输出全局变量的地址都是一样的,我在子进程修改变量值后,同样在父子进程输出变量地址,却地址还是一样的!这到底是为什么?写的时候不是要分配内存的吗?怎么地址值还是一样!路过的朋友帮我解解惑ˊ_>ˋ

解决方案

你这个都是虚拟地址,它这个修改的是地址的内容。地址没有变化

解决方案二:

考虑32位情况,linux内核为每个app分配0到3g的用户空间,而这3g用户空间是逻辑地址空间,而逻辑地址空间通过系统页式管理映射到物理空间,所以你打印出来的是逻辑地址空间,它们是可以一样的,毕竟映射时根据进程PCB的不同而映射到不同的物理地址空间。

解决方案三:

考虑32位情况,linux内核为每个app分配0到3g的用户空间,而这3g用户空间是逻辑地址空间,而逻辑地址空间通过系统页式管理映射到物理空间,所以你打印出来的是逻辑地址空间,它们是可以一样的,毕竟映射时根据进程PCB的不同而映射到不同的物理地址空间。

时间: 2024-10-30 11:17:30

关于linux写时复制的一个疑问,C程序的相关文章

Linux进程管理——fork()和写时复制

写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork(  )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程.这种行为是非常耗时的,因为它需要:   ·      为子进程的页表分配页面 ·      为子进程的页分配页面 ·      初始化子进程的页表 ·      把父进程的页复制到子进程相应的页中   创建一个地址空间的这种方法涉及许多内存访问,消耗许多CPU周期,并且完全破坏了高速缓存中的内容.在大多数情况下,这样做常常是毫无意义的,

reference counting:PHP源码分析-变量的引用计数、写时复制(Reference counting & Copy-on-Write)

PHP语法中有两种赋值方式:引用赋值.非引用赋值.<?php$a = 1;$b = $a; // 非引用赋值$c = &$b; // 引用赋值从表面看,通常会这样认为:"引用赋值就是两个变量对应同一个变量(在C中其实就是一个zval),非引用赋值则是直接产生的一个新的变量(zval),同时将值copy过来".这种认为在大部分情况下都是可以想通的.(#1)但有些情况下则会显得非常低效,例如:(#2)<?phpfunction print_arr($arr){//非引用

《C++面向对象高效编程(第2版)》——4.10 “写时复制”的概念

4.10 "写时复制"的概念 C++面向对象高效编程(第2版) 通过以上的讨论可知,TString类相当易懂和易实现.如果经常使用该类的对象作为函数参数和按值返回的值,会出现什么情况?因为TString类使用了深复制语义,如果TString 图4-12 类对象中的字符数目很多,将花费很长的时间来复制字符和删除动态分配内存.这也意味着,创建对象和销毁对象的开销很大.我们设计TString类的初衷,就是希望客户在使用字符串的地方,都能使用TString类对象.但是,如果创建.复制.赋值和销

PHP中copy on write写时复制机制介绍_php技巧

什么是写时复制(Copy On Write)? 答:在复制一个对象的时候并不是真正的把原先的对象复制到内存的另外一个位置上,而是在新对象的内存映射表中设置一个指针,指向源对象的位置,并把那块内存的Copy-On-Write位设置为1.这样,在对新的对象执行读操作的时候,内存数据不发生任何变动,直接执行读操作:而在对新的对象执行写操作时,将真正的对象复制到新的内存地址中,并修改新对象的内存映射表指向这个新的位置,并在新的内存位置上执行写操作. 这个技术需要跟虚拟内存和分页同时使用,好处就是在执行复

用户空间缺页异常pte_handle_fault()分析--(下)--写时复制【转】

转自:http://blog.csdn.net/vanbreaker/article/details/7955713 版权声明:本文为博主原创文章,未经博主允许不得转载.        在pte_handle_fault()中,如果触发异常的页存在于主存中,那么该异常往往是由写了一个只读页触发的,此时需要进行COW(写时复制操作).如当一个父进程通过fork()创建了一个子进程时,子进程将会共享父进程的页框.之后,无论是父进程还是子进程要对相应的内存进行写操作,都要进行COW,也就是为自己重新分

vsto 写 excel 外接程序,如何实现鼠标滑过一个单元格时,触发一个事件?

问题描述 vsto 写 excel 外接程序,如何实现鼠标滑过一个单元格时,触发一个事件? vsto 写 excel 外接程序,如何实现鼠标滑过一个单元格时,触发一个事件?

关于Linux启动时挂载rootfs的几种方式

一直对Linux启动时挂载根文件系统的过程存在着很多疑问,今天在水木精华区找到了有用的资料,摘录如下: 1.Linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等做准备,mount 根文件系统有这么几种方式: 1)文件系统已经存在于硬盘(或者类似的设备)的某个分区上了,kernel根据启动的命令行参数(root=/dev/xxx),直接进行mount. 这里有一个问题,在root文件系统本身还不存在的情况下,kernel如何根据/dev/xxx来找到对应的设

[20170407]关于增量检查点的一个疑问.txt

[20170407]关于增量检查点的一个疑问.txt --//oracle现在写脏块基本采用增量检查点,除非执行alter system checkpoint,或者shutdown immediate(normal)正常关闭数据库. --//别人的疑问,如果如果写增量检查点时,current log tail at RBA=Incremental checkpoint up to RBA时,如下情况 1.环境: SYS@book> @ &r/ver1 PORT_STRING         

[20160527]快速提交的一个疑问.txt

[20160527]快速提交的一个疑问.txt --这个是我前几天恢复update没有加where条件的恢复,记录不多,但是我发现一个"奇怪"的问题,或者讲我以前没有注意的问题, --我在itpub上问了,没人解答.链接http://www.itpub.net/thread-2060064-1-2.html Block header dump:  0x0180239c Object id on Block? Y seg/obj: 0x1da20  csc: 0x03.8fc12309