1. 程式人生 > >Linux/UNIX寫時複製技術

Linux/UNIX寫時複製技術

前言

我們知道,早期的UNIX在fork()程序時,會將父程序的地址空間完整的複製一份,這個操作非常耗時,通常要進行如下步驟:

  • 為子程序的頁表分配頁面
  • 為子程序的頁分配頁面
  • 初始化子程序的頁表
  • 把父程序的頁複製到子程序對應的頁中

而現代的Unix及Linux採用了一種稱為寫時複製的技術,以達到推遲甚至避免複製資料的目的。

正文

寫時複製的做法是,子程序和父程序在fork()時並不馬上覆制,而是暫時共享記憶體空間,隨後只要父程序或者子程序試圖寫共享的記憶體就會產生一個異常, 這時核心才把記憶體空間程序複製。

如果fork()完子程序後,直接呼叫exec()執行新程式,這時則根本不會複製父程序的頁,而fork()完子程序後,直接呼叫exec()執行新程式,是一種很常用的做法,這樣寫時複製就大大提高了效率。
通常fork之後核心會通過將子程序放在佇列的前面,以讓子程序先執行,以免父程序執行導致寫時複製,而後子程序執行exec系統呼叫,因無意義的複製而造成效率的下降。

呼叫exec()執行新程式後,子程序的程式碼段,全域性變數區,堆疊段將是全新的,與父程序完全隔離開。

相關推薦

Linux/UNIX複製技術

前言 我們知道,早期的UNIX在fork()程序時,會將父程序的地址空間完整的複製一份,這個操作非常耗時,通常要進行如下步驟: 為子程序的頁表分配頁面 為子程序的頁分配頁面 初始化子程序的頁表 把父程序的頁複製到子程序對應的頁中 而現代的Unix及Li

Linux複製技術

 寫入時複製(Copy-on-write)是一個被使用在程式設計領域的最佳化策略。其基礎的觀念是,如果有多個呼叫者(callers)同時要求相同資源,他們會共同取得相同的指標指向相同的資源,直到某個呼叫者(caller)嘗試修改資源時,系統才會真正複製一個副本(pri

PHP複製技術

在PHP 核心中同樣使用了寫時複製機制來避免在賦值時導致記憶體增加 什麼是寫時複製 COW(Copy On Write)?答:在複製一個物件的時候並不是真正的把原先的物件複製到記憶體的另外一個位置上,而是在新物件的記憶體對映表中設定一個指標,指向源物件的位置,並把那塊記憶體的

Linux拷貝技術(copy-on-write)

但是 現在 進程地址空間 優化 如何 進程創建 http exe fork COW技術初窺: 在Linux程序中,fork()會產生一個和父進程完全相同的子進程,但子進程在此後多會exec系統調用,出於效率考慮,linux中引入了“寫時復制“技術,也就是只有進程

Linux缺頁異常(複製 請求調頁)

在程式的執行過程中,因為遇到某種障礙而使 CPU 無法最終訪問到相應的物理記憶體單元,即無法完成從虛擬地址到實體地址對映的時候,CPU 會產生一次缺頁異常,從而進行相應的缺頁異常處理。基於 CPU 的這一特性,Linux 採用了請求調頁(Demand Paging)和寫時複製(Copy On Write)的技

Linux拷貝技術fork

源於網上資料 COW技術初窺:       在Linux程式中,fork()會產生一個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了“寫時複製“技術,也就是隻有程序空間的各段的內容要發生變化時,才會將父程序的內容複製一份給子程序。       那麼子程序的物理

Linux拷貝技術(copy-on-write)及fork、vfork流程介紹

COW技術初窺:       在Linux程式中,fork()會產生一個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了“寫時複製“技術,也就是隻有程序空間的各段的內容要發生變化時,才會將父程序的內容複製一份給子程序。       那麼子程序的物理空間沒有程式碼

(轉)Linux拷貝技術(copy-on-write)

轉自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html COW技術初窺:       在Linux程式中,fork()會產生一個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了“

linux拷貝技術

COW技術初窺:       在Linux程式中,fork()會產生一個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了“寫時複製“技術,也就是隻有程序空間的各段的內容要發生變化時,才會將父程序的內容複製一份給子程序。       那麼子程序的物理空間沒有

Linux記憶體管理之程序建立的拷貝技術

Unix的程序建立很特別。許多其他的作業系統都提供了產生程序的機制,首先在新的地址空間建立程序,讀入可執行的檔案,最後開始執行。Unix採用了與眾不同的實現方式,它把上述步驟分解到兩個單獨的函式中去執行:fork()和exec()。(這裡的exec是指exec一族的函式,核

Copy-On-Write複製機制與Java中CopyOnWriteArrayList容器原始碼實現

Copy-on-Write機制簡稱COW,是一種併發設計策略。其基本思路是多執行緒同時共享同一個內容,當某個執行緒想要修改這個內容的時候,才會真正的把內容copy出去形成一個新的內容然後修改,其它的執行緒繼續讀舊的內容,直到修改完成。這是一種延時懶惰策略。 Copy-on-Write有

Java 中的複製 (Copy on Write, COW)

Background 寫時複製 (Copy on Write, COW) 有時也叫 "隱式共享", 顧名思義, 就是讓所有需要使用資源 R 的使用者共享資源 R 的同一個副本, 當其中的某一個使用者要對資源 R 進行修改操作時, 先複製 R 的一個副本 R' , 再進行修改操作; Problem 在 J

PHP7.0中的複製機制

LZ:PHP版本7.0 一、變數型別(資料型別) 標量型別:字串,整形,浮點型,布林型 複合型別:陣列,物件 特殊型別:資源,空 二、所需概念 引用:某一變數的別名,指向同一空間,類似給某人取外號 淺拷貝:除了第一層是另闢空間值拷貝之外,其餘層次都是

Java複製CopyOnWriteArrayList

Copy-On-Write是一種程式設計的優化方法,多執行緒在不修改物件時可以共享一個物件地址空間,如果某一個執行緒要求修改物件時,需要首先將原來物件複製一份,在新複製的物件地址空間上修改物件內容,其他執行緒訪問此物件時還是訪問之前的舊物件,當新物件修改完成後,再將舊物件的指

Copy-On-Write(寫入複製)技術

看google的hdfs論文時看到這個概念。 Copy-On-Write屬於邏輯快照的一種,還有一種物理快照,百度了一下 ,快照裡邊概念還挺多,主要是以前沒接觸過。以後再整理。 Copy-On-Write是寫入時才複製的意思,找到兩個例子 1.往磁碟寫資料,先寫到的是記憶體

【轉】Copy-On-Write技術 [ linux fork程序使用技術]

inux核心在使用fork建立程序時,基本上會使用Copy-On-Write(COW)技術。這裡解釋一下COW技術以及為什麼在fork中使用。 WIKI上對COW的解釋: Copy-on-write (sometimes referred to as "COW") is an optimization 

拷貝技術(copy-on-write)

 傳統的fork()系統呼叫直接把所有的資源複製給新建立的程序。這種實現過於簡單並且效率低下,因為它拷貝的資料也許並不共享,更糟的情況是,如果新程序打算立即執行一個新的映像,那麼所有的拷貝都將前功盡棄。Linux的fork()使用寫時拷貝(copy-on-write)頁實現

從win32中的複製(Copy on write )機制談起

我們知道,記憶體對映檔案的物理儲存器來自磁碟上已有的檔案,而不是來自也交換檔案。系統在載入exe和dll檔案的時候使用的是記憶體對映檔案來載入並執行exe和dll,這樣大大節省了頁交換檔案的空間以及應用程式的啟動時間。所以,實際上系統載入exe檔案的時候就是利用記憶體對映檔

理解php核心的 引用計數器與複製

zval結構中有以下兩個成員變數用於引用計數器:is_ref:BOOL值,標識變數是否是引用集合refcount:計算指向引用集合的變數個數寫時複製:就是當變數的值改變時才進行記憶體的複製。<?php$a = "this a test ";xdebug_debug_zval('a');$b = $a;x

Linux 檔案級實時複製技術

一、專案描述 Linux 檔案級實時複製技術 二、系統環境(linux)天翼雲   原機(/opt/david) 目標機(/opt/david) 彈性IP 49.75.185.142 837 14.18.