濮阳杆衣贸易有限公司

主頁 > 知識庫 > 詳談Linux寫時拷貝技術(copy-on-write)必看篇

詳談Linux寫時拷貝技術(copy-on-write)必看篇

熱門標簽:400的電話一般從哪里辦理 益陽400電話申請辦理流程 怎么用百度地圖標注坐標 梧州防封電銷卡 江西全自動外呼系統(tǒng)報價 地圖標注人員分布 春運地圖標注app 昆明電銷機器人價格 上海機器人外呼系統(tǒng)哪家好

COW技術初窺

在linux程序中,fork()會產生一個和父進程完全相同的子進程,但子進程在此后多會exec系統(tǒng)調用,出于效率考慮,linux中引入了“寫時復制”技術,也就是只有進程空間的各段的內容要發(fā)生變化時,才將父進程的內容復制一份給子進程。

那么子進程的物理空間沒有代碼,怎么去取指令執(zhí)行exec系統(tǒng)調用呢??

在fork之后exec之前兩個進程用的是相同的物理空間(內存區(qū)),子進程的代碼段、數(shù)據(jù)段、堆棧都是指向父進程的物理空間,也就是說,兩者的虛擬空間不同,其對應的物理空間是一個。當父子進程中有更改相應段的行為發(fā)生時,再為子進程相應的段分配物理空間。如果不是因為exec,內核會給子進程的數(shù)據(jù)段、堆棧段分配相應的物理空間(至此兩者都有各自的進程空間,互不影響),而代碼段繼續(xù)共享父進程的物理空間(兩者的代碼完全相同)。而如果是因為exec,由于兩者執(zhí)行的代碼不同,子進程的代碼段也會分配單獨的物理空間。

在網上看到的還有個細節(jié)問題是:fork之后內核會將子進程排在隊列的前面,以讓子進程先執(zhí)行,以免父進程執(zhí)行導致寫時復制,而后子進程執(zhí)行exec系統(tǒng)調用,因無意義的復制而造成效率的下降。

COW詳述

現(xiàn)在有一個父進程P1,這是一個主體,那么它是有靈魂也是有身體的?,F(xiàn)在在其虛擬地址空間(有相應的數(shù)據(jù)結構表示)上有:正文段,數(shù)據(jù)段,堆,棧這四個部分,相應地,內核要為這四個部分分配給自的物理塊。即正文段塊、數(shù)據(jù)段塊、堆塊、棧塊。至于如何分配,這是內核去做的事,在此不詳述。

1. 現(xiàn)在P1用fork()函數(shù)為進程創(chuàng)建一個子進程P2

內核:

(1) 復制P1的正文段,數(shù)據(jù)段,堆,棧這四個部分,注意是其內容相同。

(2) 為這四個部分分配物理塊,P2的:正文段(為P1的正文段的物理塊,其實就是不為P2分配正文段塊,讓P2的正文段指向P1的正文段塊),數(shù)據(jù)段(P2自己的數(shù)據(jù)段塊,為其分配對應的塊),堆(P2自己的堆塊),棧(P2自己的棧塊)。如下圖所示,同左到右大的方向箭頭表示復制內容:

 2. 寫時復制技術

寫時復制技術:內核只為新生成的子進程創(chuàng)建虛擬空間結構,它們復制于父進程的虛擬空間結構,但是不為這些段分配物理內存,它們共享父進程的物理空間,當父子進程中有更改相應的段的行為發(fā)生時,再為子進程相應的段分配物理空間。

3. vfork

vfork的做法更加簡單粗暴,內核連子進程的虛擬地址空間也不創(chuàng)建了,直接共享了父進程的虛擬空間,當然了,這種做法就順水推舟的共享了父進程的物理空間

總結

傳統(tǒng)的fork()系統(tǒng)調用直接把所有的資源復制給新創(chuàng)建的進程。這種實現(xiàn)過于簡單并且效率低下,因為它拷貝的數(shù)據(jù)也許并不共享,更糟的情況是,如果新進程打算立即執(zhí)行一個新的映像,那么所有的拷貝將是無用功。

Linux的fork()使用寫時拷貝(copy-on-write)頁實現(xiàn)。寫時拷貝是一種可以推遲甚至免除拷貝數(shù)據(jù)的技術。內核此時并不復制整個地址空間,而是讓父進程和子進程共享一個拷貝。只有在需要寫入的時候,數(shù)據(jù)才會復制,從而使各個進程擁有各自的拷貝。也就是說,資源的復制只有在需要寫入的時候才進行,在此之前,只是以只讀方式共享。這種技術使地址空間的頁的拷貝被推遲到實際發(fā)生寫入的時候。

在頁根本不會被寫入的情況下,舉例來說,fork()之后立即調用exec(),它們就無需復制了,fork()的實際開銷就是復制父進程的頁表以及給子進程創(chuàng)建唯一的進程描述符。在一般情況下,進程創(chuàng)建后都會馬上運行一個可執(zhí)行的文件,這種優(yōu)化可以避免拷貝大量根本不會使用的數(shù)據(jù)(地址空間常常包含數(shù)十兆的數(shù)據(jù))。由于Unix強調進程快速執(zhí)行的能力,所以這個優(yōu)化是很重要的,注:Linux COW和exec沒有必然聯(lián)系

以上這篇詳談Linux寫時拷貝技術(copy-on-write)必看篇就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • linux采用scp命令拷貝文件到本地,拷貝本地文件到遠程服務器的方法
  • Linux使用scp命令進行文件遠程拷貝詳解
  • Linux中拷貝 cp命令中拷貝所有的寫法詳解
  • Virtualbox主機和虛擬機之間文件夾共享及雙向拷貝(Windows->Windows, Windows->Linux)
  • linux拷貝命令之高級拷貝scp命令詳解
  • linux使用scp命令備份文件 scp拷貝文件
  • 使用scp獲取遠程linux服務器上的文件 linux遠程拷貝文件
  • linux下如何實現(xiàn)快速拷貝大文件

標簽:懷化 亳州 贛州 新疆 惠州 九江 北京 河南

巨人網絡通訊聲明:本文標題《詳談Linux寫時拷貝技術(copy-on-write)必看篇》,本文關鍵詞  詳談,Linux,寫時,拷貝,技術,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳談Linux寫時拷貝技術(copy-on-write)必看篇》相關的同類信息!
  • 本頁收集關于詳談Linux寫時拷貝技術(copy-on-write)必看篇的相關信息資訊供網民參考!
  • 推薦文章
    镇江市| 祁东县| 乌拉特前旗| 达日县| 梧州市| 和平县| 娱乐| 施秉县| 边坝县| 开平市| 弋阳县| 伊川县| 南溪县| 苏尼特右旗| 从化市| 连城县| 西安市| 固原市| 瓦房店市| 伊金霍洛旗| 兰考县| 岐山县| 旺苍县| 濮阳市| 磐石市| 中牟县| 霸州市| 蓬安县| 安泽县| 双牌县| 习水县| 德化县| 青田县| 马公市| 道孚县| 仁怀市| 宁夏| 无为县| 嘉黎县| 澄江县| 吉木乃县|