最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

講解linux寫時復制機制原理

2022-09-08 17:47 作者:補給站Linux內(nèi)核  | 我要投稿

在linux系統(tǒng)中,調(diào)用fork系統(tǒng)調(diào)用創(chuàng)建子進程時,并不會把父進程所有占用的內(nèi)存復制一份,而是與父進程公用相同的內(nèi)存頁,而當子進程或者父進程對內(nèi)存頁進行修改時才會進行復制----這就是著名的 寫時復制 機制

  虛擬內(nèi)存與物理內(nèi)存

  進程的內(nèi)存可以分為:虛擬內(nèi)存 與 物理內(nèi)存

  •   物理內(nèi)存:就是電腦安裝的內(nèi)存條,如果電腦安裝了2GB的內(nèi)存條,那么系統(tǒng)就用于0-2GB的物理內(nèi)存空間。

  •   虛擬內(nèi)存:虛擬內(nèi)存是使用軟件虛擬的,在32位操作系統(tǒng)中,每個進程都獨占4GB的虛擬內(nèi)存空間。

 應用程序使用的虛擬內(nèi)存,比如C語言取地址操作符號& 所得到的地址就是虛擬內(nèi)存地址。而虛擬內(nèi)存地址 需要映射到物理內(nèi)存地址 才能使用,如果使用沒有映射的 虛擬內(nèi)地址 ,將會導致 缺頁異常 。

 虛擬內(nèi)存地址 映射到物理內(nèi)存地址如圖所示:




如上圖所示,進程A 與進程B的相同虛擬內(nèi)存地址 映射到不通的物理內(nèi)存地址,這就是不通進程的相同虛擬內(nèi)存地址互不影響的原因。


【文章福利】小編推薦自己的Linux內(nèi)核技術交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ?

寫時復制原理

前面介紹了 虛擬內(nèi)存 與 物理內(nèi)存的概念,接下來將會介紹 linux 寫時復制的原理。

前面說過,虛擬內(nèi)存需要與物理內(nèi)存進行映射才能使用,如果不同進程的 虛擬內(nèi)存地址映射到相同的物理內(nèi)存地址,那么就實現(xiàn)了共享內(nèi)存的機制,如下圖所示:


由于進程A的虛擬內(nèi)存M 與進程B的虛擬內(nèi)存M' 映射到相同的 物理內(nèi)存G,所以當修改進程A虛擬內(nèi)存M的數(shù)據(jù)時,進程B 虛擬內(nèi)存M'的數(shù)據(jù)也會跟著改變。

linux為了加速創(chuàng)建子進程過程與節(jié)省內(nèi)存使用的原因,實現(xiàn)了 寫時復制 的機制。

寫時復制 的原理大概如下:

  •   創(chuàng)建子進程時,將父進程的虛擬內(nèi)存與物理內(nèi)存映射關系復制到子進程中,并將內(nèi)存設置為只讀()

  •   當子進程或者父進程對內(nèi)存數(shù)據(jù)進行修改時,便會觸發(fā)寫時復制機制:將原來的內(nèi)存頁復制一份新的,并重新設置其內(nèi)存映射關系,將父子進程的內(nèi)存讀寫權限設置為可讀寫。

寫時復制 過程如下圖所示:



從上圖可知,當創(chuàng)建子進程時,父子進程指向相同的 物理內(nèi)存,而不是將父進程所占用的 物理內(nèi)存 復制一份。這樣做的好處有兩個:

  • 加速創(chuàng)建子進程的速度。

  • 減少進程對物理內(nèi)存的使用。

但這個時候只能對內(nèi)存進行讀操作,如果父進程或子進程對內(nèi)存進行寫操作,那么將會觸發(fā) 缺頁異常,而在 缺頁異常 處理中會對物理內(nèi)存進行復制,并且重新映射其內(nèi)存映射關系。

復制并重新映射到新的物理內(nèi)存后,父子進程的虛擬內(nèi)存就映射到不同的物理內(nèi)存上,這時父子進程都可以對內(nèi)存進行寫操作而互不影響,所以需要把父子進程的內(nèi)存讀寫權限設置為可讀寫。





講解linux寫時復制機制原理的評論 (共 條)

分享到微博請遵守國家法律
星座| 双鸭山市| 平乐县| 孙吴县| 桐梓县| 乐东| 庐江县| 凤冈县| 汾阳市| 临颍县| 宜都市| 财经| 滕州市| 锡林浩特市| 林州市| 涡阳县| 济源市| 富民县| 大安市| 宜阳县| 东兴市| 高安市| 廊坊市| 沈阳市| 隆德县| 庆城县| 封开县| 安达市| 东至县| 鄱阳县| 古丈县| 竹山县| 伊通| 紫阳县| 万源市| 巫溪县| 宜良县| 双流县| 九江县| 德江县| 石楼县|