国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

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

2019-10-26 18:53:09
字體:
來源:轉載
供稿:網友

COW技術初窺

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

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

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

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

COW詳述

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

1. 現在P1用fork()函數為進程創建一個子進程P2

內核:

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

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

 2. 寫時復制技術

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

3. vfork

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沧源| 尉犁县| 色达县| 衡山县| 龙井市| 临安市| 兖州市| 泾源县| 荣成市| 和硕县| 三台县| 岳普湖县| 桃源县| 新津县| 大邑县| 米易县| 烟台市| 磐石市| 花莲市| 织金县| 聂拉木县| 定安县| 固安县| 自贡市| 陕西省| 陈巴尔虎旗| 东城区| 宿迁市| 重庆市| 宕昌县| 清苑县| 禹城市| 磐石市| 墨江| 通渭县| 荥阳市| 五指山市| 澜沧| 蒙自县| 文山县| 克拉玛依市|