Linux寫實拷貝技術

何爲寫時拷貝技術?這就得先講講linux的分頁加載機制。
   分頁加載機制就是linux把內存劃分成很多的小塊,進程中的數據按照某種對應關係(頁表)放入內存中。
   這麼做的目的是爲了提高內存的使用率。可以不必讓一個進程中的所有東西都連着放在一起。
  連着放在一起的弊端是。如果A進程釋放後。假如A進程使用的內存非常少。其他進程都無法使用A進程佔的這塊內存,因爲它太小了放不下。這樣就存在內存利用率低下,每過段時間都要檢測這種進程間的碎片空間。因此纔有了分頁加載,每個被劃分的小塊非常小,進程裏的數據將被分割開來放進去,哪怕到時候釋放了,下個進程可以通樣將自己分割成小塊放入剛被釋放的內存中。
 

  學習過fork我們都知道是父進程創建出一個子進程,子進程作爲父進程的副本, 是父進程的拷貝。
 可是每次fork出的子進程難道還要把父進程的各種數據拷貝一份?有人會說不是父子進程不共享各種數據段嗎?如全局變量區 ,棧區 , 堆區 。如果不拷貝那不就成共享的嗎?其實有關子進程拷貝父進程的數據是這樣的。
如果子進程只是對父進程的數據進行讀取操作,那麼子進程用的就是父進程的數據。如果子進程需要對某數據進行修改,那麼在修改前,子進程纔會拷貝出需要修改的這份數據,對這份備份進行修改。這就滿足了父子進程的數據相互獨立,互不影響的要求。這麼做的初衷也是爲了節省內存。
 舉個栗子如果一份代碼中,定義了10個數據。父進程執行的部分對這10個數據全部進行修改,而子進程執行的部分只修改了一個數據,子進程明明用不到其他9個數據,那還何必讓子進程拷貝全部數據,多佔用9個永遠使用不到的數據內存?
  因此創建子進程只是將原父進程的pcb拷貝了一份。父子進程的pcb全部指向的是父進程原本就有的數據,如果子進程裏對數據進行了修改,那麼子進程的pcb裏指向 被修改的數據的指針會指向一個自己新開闢的內存,新開闢的內存裏將父進程的數據拷貝過來,然後再進行修改。這就是寫時拷貝技術,顧名思義,只在寫的時候才拷貝的技術。厲害厲害

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