Linux写实拷贝技术

何为写时拷贝技术?这就得先讲讲linux的分页加载机制。
   分页加载机制就是linux把内存划分成很多的小块,进程中的数据按照某种对应关系(页表)放入内存中。
   这么做的目的是为了提高内存的使用率。可以不必让一个进程中的所有东西都连着放在一起。
  连着放在一起的弊端是。如果A进程释放后。假如A进程使用的内存非常少。其他进程都无法使用A进程占的这块内存,因为它太小了放不下。这样就存在内存利用率低下,每过段时间都要检测这种进程间的碎片空间。因此才有了分页加载,每个被划分的小块非常小,进程里的数据将被分割开来放进去,哪怕到时候释放了,下个进程可以通样将自己分割成小块放入刚被释放的内存中。
 

  学习过fork我们都知道是父进程创建出一个子进程,子进程作为父进程的副本, 是父进程的拷贝。
 可是每次fork出的子进程难道还要把父进程的各种数据拷贝一份?有人会说不是父子进程不共享各种数据段吗?如全局变量区 ,栈区 , 堆区 。如果不拷贝那不就成共享的吗?其实有关子进程拷贝父进程的数据是这样的。
如果子进程只是对父进程的数据进行读取操作,那么子进程用的就是父进程的数据。如果子进程需要对某数据进行修改,那么在修改前,子进程才会拷贝出需要修改的这份数据,对这份备份进行修改。这就满足了父子进程的数据相互独立,互不影响的要求。这么做的初衷也是为了节省内存。
 举个栗子如果一份代码中,定义了10个数据。父进程执行的部分对这10个数据全部进行修改,而子进程执行的部分只修改了一个数据,子进程明明用不到其他9个数据,那还何必让子进程拷贝全部数据,多占用9个永远使用不到的数据内存?
  因此创建子进程只是将原父进程的pcb拷贝了一份。父子进程的pcb全部指向的是父进程原本就有的数据,如果子进程里对数据进行了修改,那么子进程的pcb里指向 被修改的数据的指针会指向一个自己新开辟的内存,新开辟的内存里将父进程的数据拷贝过来,然后再进行修改。这就是写时拷贝技术,顾名思义,只在写的时候才拷贝的技术。厉害厉害

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章