您好,登錄后才能下訂單哦!
這篇文章主要講解了“Linux中深拷貝與淺拷貝以及寫時拷貝是什么意思”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Linux中深拷貝與淺拷貝以及寫時拷貝是什么意思”吧!
假設B復制了A,當修改A時,看B是否會發生變化。如果B也跟著變了,說明這是淺拷貝;如果B沒變,那就是深拷貝。
1、淺拷貝:將原對象的引用直接賦給新對象,新對象只是原對象的一個引用。
2、深拷貝:創建一個新的對象和數組,將原對象的各項屬性的“值”(數組的所有元素)拷貝過來,是“值”而不是“引用”。
淺拷貝只是對指針的拷貝,拷貝后兩個指針指向同一個內存空間,深拷貝不但對指針進行拷貝,而且對指針指向的內容進行拷貝,經深拷貝后的指針是指向兩個不同地址的指針。
3、寫時復制技術:最初產生于Unix系統,用于實現一種傻瓜式的進程創建:當發出fork( )系統調用時,內核原樣復制父進程的整個地址空間并把復制的那一份分配給子進程。這種行為是非常耗時的,因為它需要:
· 為子進程的頁表分配頁面
· 為子進程的頁分配頁面
· 初始化子進程的頁表
· 把父進程的頁復制到子進程相應的頁中
創建一個地址空間的這種方法涉及許多內存訪問,消耗許多CPU周期,并且完全破壞了高速緩存中的內容。在大多數情況下,這樣做常常是毫無意義的,因為許多子進程通過裝入一個新的程序開始它們的執行,這樣就完全丟棄了所繼承的地址空間。
現在的Unix內核(包括Linux),采用一種更為有效的方法稱之為寫時復制(或COW)。這種思想相當簡單:父進程和子進程共享頁面而不是復制頁面。然而,只要頁面被共享,它們就不能被修改。無論父進程和子進程何時試圖寫一個共享的頁面,就產生一個錯誤,這時內核就把這個頁復制到一個新的頁面中并標記為可寫。原來的頁面仍然是寫保護的:當其它進程試圖寫入時,內核檢查寫進程是否是這個頁面的唯一屬主;如果是,它把這個頁面標記為對這個進程是可寫的。
Linux的fork()使用寫時復制
傳統的fork()系統調用直接把所有的資源復制給新創建的進程。這種實現過于簡單并且效率低下,因為它拷貝的數據或許可以共享。更糟糕的是,如果新進程打算立即執行一個新的映像,那么所有的拷貝都將前功盡棄。Linux的fork()使用寫時拷貝(copy-on-write)頁實現。
寫時拷貝是一種可以推遲甚至避免拷貝數據的技術。內核此時并不復制整個進程的地址空間,而是讓父子進程共享同一個地址空間。只用在需要寫入的時候才會復制地址空間,從而使各個進行擁有各自的地址空間。也就是說,資源的復制是在需要寫入的時候才會進行,在此之前,只有以只讀方式共享。這種技術使地址空間上的頁的拷貝被推遲到實際發生寫入的時候。在頁根本不會被寫入的情況下—例如,fork()后立即執行exec(),地址空間就無需被復制了。fork()的實際開銷就是復制父進程的頁表以及給子進程創建一個進程描述符。在一般情況下,進程創建后都為馬上運行一個可執行的文件,這種優化,可以避免拷貝大量根本就不會被使用的數據(地址空間里常常包含數十兆的數據)。由于Unix強調進程快速執行的能力,所以這個優化是很重要的。
感謝各位的閱讀,以上就是“Linux中深拷貝與淺拷貝以及寫時拷貝是什么意思”的內容了,經過本文的學習后,相信大家對Linux中深拷貝與淺拷貝以及寫時拷貝是什么意思這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。