新聞資訊  快訊  焦點  財經  政策  社會
互 聯 網   電商  金融  數據  計算  技巧
生活百科  科技  職場  健康  法律  汽車
手機百科  知識  軟件  修理  測評  微信
軟件技術  應用  系統  圖像  視頻  經驗
硬件技術  知識  技術  測評  選購  維修
網絡技術  硬件  軟件  設置  安全  技術
程序開發  語言  移動  數據  開源  百科
安全防護  資訊  黑客  木馬  病毒  移動
站長技術  搜索  SEO  推廣  媒體  移動
財經百科  股票  知識  理財  財務  金融
教育考試  育兒  小學  高考  考研  留學
您當前的位置:首頁 > IT百科 > 軟件技術 > 操作系統 > linux

Linux到底怎樣實現「寫時拷貝」?其實很簡單

時間:2019-06-18 09:52:04  來源:  作者:

背景

在多進程編程中,我們都知道fork()會產生一個子進程,而且子進程就是父進程的一個副本。按照傳統fork的方式,子進程獲得父進程數據空間、堆和棧的副本。這種實現方式實在過于簡單,粗暴,效率低下。為什么這么說呢?因為在fork之后,往往緊接著就會跟隨exec。exec之前拷貝完全是無意義的,而且會極大的限制創建進程的速度。

所以linux引入了寫時拷貝技術(copy-on-write),簡稱COW。它是一種可以推遲甚至可以免除拷貝數據的技術。fork時,內核此時并不復制整個進程的地址空間,而是讓父進程和子進程共享同一個拷貝。只有在需要寫入的時候,數據才會被復制,從而使各個進程擁有各自的拷貝。也就是說在此之前都是以只讀的方式訪問。這種技術使地址空間上的頁的拷貝被推遲到真正需要寫入的時候。例如我之前說的情況,fork之后立即調用exec,他們就不要拷貝。

 

Linux到底怎樣實現「寫時拷貝」?其實很簡單

 

現在fork之后的實際開銷就是復制進程的頁表和子進程創建唯一的進程描述符。這是一種極大的優化,避免了大量的無意義的拷貝。對于Linux這種強調快速切換的操作系統來說,這個優化有著重大的意義。

 

Linux到底怎樣實現「寫時拷貝」?其實很簡單

 

注意:fork之后內核會通過將子進程放入到運行隊列前面,以讓子進程先運行。以避免父進程先寫入,產生拷貝,而后子進程執行exec,導致因而無意義的拷貝。

詳解

在我之前的【Linux內存管理】中我已經講到了,每個進程都有獨立的進程地址空間。我們現在考慮一種實際情況,有一個父進程PID1。它的虛擬地址空間大致有:代碼段,數據段,堆,棧。內核通過頁表為他們映射了虛擬地址到物理地址,為了方便表示,就用物理地址塊表示吧。(4G地址空間)。

原始fork()

PID1 通過fork()系統調用創建了一個子進程PID2。下圖簡單的直接的表示,可以看出直接為PID2復制了PID1的地址空間數據。

 

Linux到底怎樣實現「寫時拷貝」?其實很簡單

 

COW技術

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

 

Linux到底怎樣實現「寫時拷貝」?其實很簡單

 

總結

通過上面的分析,相信大家對寫時拷貝技術有了一個比較深入的認識了。如果在本文中對這些專業術語不是很清楚,建議去看我之前的文章【Linux內存管理】。
 



Tags:Linux   點擊:()  評論:()
聲明:本站部分內容來自互聯網,內容觀點僅代表作者本人,如有任何版權侵犯請與我們聯系,我們將立即刪除。
▌相關評論
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
▌相關推薦
1 概述最近在部署項目,要求在Linux服務器上同時部署多個Tomcat,一個項目對應一個tomcat,由于以前沒有部署經驗,剛開始工作嗎,在部署的時候以為直接ootb就可以的,所有在部署的時候...【詳細內容】
2019-10-10   Linux  點擊:(2)  評論:(0)  加入收藏
簡單有效的linux命令監測網址是否正常訪問 run.sh#!/bin/bashresult_code=`curl -I -m 10 -o /dev/null -s -w %{http_code} http://abc.com/info.do`echo $result_code#這...【詳細內容】
2019-10-09   Linux  點擊:(5)  評論:(0)  加入收藏
如果這篇文章對您有幫助,請關注并點贊,感謝您的支持,如果還有其他問題,請私信給我Pwd命令的作用為顯示用戶的當前工作目錄Pwd命令示例如下:顯示目前所在的工作目錄的絕對路徑...【詳細內容】
2019-10-09   Linux  點擊:(3)  評論:(0)  加入收藏
在某些情況下,我們要檢查上一個會話的命令輸出,并希望將其與當前會話進行比較。因此在這種情況下,script 命令就變得很方便。-- Pradeep Kumar(作者)通常,Linux 管理員們都使用 h...【詳細內容】
2019-10-08   Linux  點擊:(2)  評論:(0)  加入收藏
學習如何使用 chown 命令更改文件或目錄的所有權。-- Alan Formy-duval(作者)Linux 系統上的每個文件和目錄均由某個人擁有,擁有者可以完全控制更改或刪除他們擁有的文件。除...【詳細內容】
2019-10-08   Linux  點擊:(5)  評論:(0)  加入收藏
日志的三種類型# 內核及系統日志:這種日志數據由系統服務rsyslog統一管理,根據其主配置文件/etc/rsyslog.conf中的設置決定將內核消息及各種系統程序消息記錄到什么位置。系統...【詳細內容】
2019-10-08   Linux  點擊:(4)  評論:(0)  加入收藏
# leafpad /etc/apt/sources.list#中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contribdeb-src http://mirrors.ustc.edu.cn/kali kali-rolli...【詳細內容】
2019-09-29   Linux  點擊:(25)  評論:(0)  加入收藏
1、查看是否安裝SVNsvn --versionCentOS下SVN服務的啟動與關閉2、啟動SVN服務:svnserve -d -r /home/svn/home/svn 為版本庫的根目錄;3、關閉SVN服務:killallsvnserve #關閉svn...【詳細內容】
2019-09-29   Linux  點擊:(7)  評論:(0)  加入收藏
bug沒有愛安裝Nginx1.安裝軟件包epel-release并更新,它會幫我們自動配置好yum的軟件倉庫。yum -y install epel-releaseyum update2.安裝nginx,一般的項目不建議wget下載包編...【詳細內容】
2019-09-29   Linux  點擊:(6)  評論:(0)  加入收藏
磁盤分為機械硬盤和固態硬盤;塊設備:block ,存取單位“塊”,磁盤;字符設備:char ,存取單位“字符”,鍵盤1、機械硬盤(HDD )即是傳統普通硬盤,主要由:盤片,磁頭,盤片轉軸及控制電機,磁頭控制...【詳細內容】
2019-09-29   Linux  點擊:(8)  評論:(0)  加入收藏
在Linux系統中,我們經常用free命令來查看系統內存的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態: 這里的默認顯示單位是kb,我的服務器是128G內存,所以...【詳細內容】
2019-09-29   Linux  點擊:(4)  評論:(0)  加入收藏
MBR分區MBR概述:全稱為Master Boot Record,即硬盤的主引導記錄。主引導記錄(MBR,Master Boot Record)是位于磁盤最前邊的一段引導(Loader)代碼。它負責磁盤操作系統(DOS)對磁盤進行...【詳細內容】
2019-09-27   Linux  點擊:(7)  評論:(0)  加入收藏
上一篇我們了解了內存在內核態是如何管理的,本篇文章我們一起來看下內存在用戶態的使用情況,如果上一篇文章說是內核驅動工程師經常面對的內存管理問題,那本篇就是應用工程師常...【詳細內容】
2019-09-27   Linux  點擊:(3)  評論:(0)  加入收藏
“回車”字符可以往回追溯很長一段時間 —— 早在打字機上就有一個機械裝置或杠桿將承載紙滾筒的機架移到右邊,以便可以重新在左側輸入字母。他們在 Windows 上的文本文件上保留了它,但從未在 Linux 系統上使用過。當你...【詳細內容】
2019-09-27   Linux  點擊:(4)  評論:(0)  加入收藏
我一直覺得黑客就應該把圖形畫界面丟棄,這一直是我的堅持,所以我就學寫一些腳本,畢竟自己寫腳本也有樂趣,還能寫寫一些文章,挺好玩的。在internet中最火熱的應用就是文件傳輸,其中...【詳細內容】
2019-09-27   Linux  點擊:(9)  評論:(0)  加入收藏
加密貨幣挖掘惡意軟件是一種普遍存在網絡威脅,不止是Windows系統,如今你在移動設備、Unix和類Unix系統,甚至是服務器和云環境中,都可以見到它們的身影。此外,它們的反檢測能力也...【詳細內容】
2019-09-26   Linux  點擊:(7)  評論:(0)  加入收藏
何為挖礦,這里稍微普及一下:所謂”挖礦”實質上是用計算機解決一項復雜的數學問題,是用于賺取比特幣的一個程序,挖礦是消耗計算資源來處理交易,確保網絡安全以及保持網絡中每個人...【詳細內容】
2019-09-26   Linux  點擊:(8)  評論:(0)  加入收藏
如何在Linux中配置Redis服務并設置為開機自啟廢話不多說,咱們直接開始。1、修改redis.conf配置文件配置redis.conf中daemonize為yes,確保守護進程開啟。大概在148行,當然你也可...【詳細內容】
2019-09-26   Linux  點擊:(9)  評論:(0)  加入收藏
紅帽和CentOS項目今天宣布了一個新的名為CentOS Stream的GNU / Linux發行版本,為開發人員和貢獻者提供了滾動發布的操作系統。 CentOS Linux一直是商業上可用于企業的Red Hat...【詳細內容】
2019-09-25   Linux  點擊:(1253)  評論:(0)  加入收藏
如果你跟我一樣,整天要花大量的時間使用Linux命令行,而且正在尋找一些可替代系統自帶的老舊且乏味的終端軟件,那你真是找對了文章。我這里搜集了一些非常有趣的終端軟件,可以用...【詳細內容】
2019-09-25   Linux  點擊:(11)  評論:(0)  加入收藏
推薦資訊
相關文章
欄目更新
欄目熱門
31选7开奖11185