copy on write机制

  “copy on write”翻译成中文即“写时拷贝”,他的主要思想为,在做对象赋值的时候,刚开始,目标变量和源变量使用同一个内存地址,在目标变量或者源变量中的至少一个变量的数据进行修改的时候,再进行数据的内存拷贝(此处拷贝,不一定是给目标变量开辟内存空间,而是谁在进行修改,就给哪一个变量开辟一块新的内存空间),并且在新内存的基础上进行数据的修改;copy-on-write机制,是一种程序设计的优化策略;将变量的拷贝过程推后,可以提高系统性能,减少不必要的损耗;


      在上图示例中,str1为我们的源变量,str2为目标变量,在进行变量拷贝的时候,我们可以看出,str1的地址和str2的地址相同,在str2进行追加操作之后,str2为一个新的地址空间,说明这个时候,操作系统为str2分配了一个新的地址空间,并将str1的内容copy了一份到str2的空间中,此时str1与str2不在共享同一份地址空间,而是各自都有属于自己的专用空间;后续大家修改的为各自空间上的值;

      在linux操作系统层面上也是支持copy-on-write机制的,我们在创建子进程的时候,会调用fork函数,在fork函数的接口描述中,说该函数会复制出一个和父进程一模一样的子进程


我们在创建子进程后,一般希望子进程的工作和父进程不一样,所以我们在子进程中会调用其他的方法;在调用系统fork函数后,创建出一个子进程,该子进程与父进程共享内存空间,在子进程发生数据修改的时候,会系统会为子进程复制一份内存空间(我们如果在子进程中打印变量地址的话,会发现变量修改前的地址和变量修改后的地址是一致的,这是由于我们输出的地址其实是虚拟地址,由于变量是在fork之前就创建出来的,fork方法是复制一个和老进程一样的新进程,所以其虚拟空间地址也会相同);如果子进程在这个时候仅仅是针对于数据进行修改,或者调用不同的函数,则父子进程将会共享代码段空间,如果此时子进程使用exec组函数加载其他的进程,操作系统将会为子进程分配新的代码段空间、数据段和堆栈空间。

你可能感兴趣的:(copy on write机制)