寫時拷貝 --全篇來自chatgpt

fork是Unix和類Unix操作系統中用于創建進程的系統調用。fork會創建一個子進程,該子進程幾乎是父進程的完全拷貝,包括代碼段、數據段、堆和棧。然而,為了提高效率,fork使用了一種叫做寫時拷貝(Copy-On-Write, COW)的技術。

寫時拷貝(Copy-On-Write, COW)

基本原理

寫時拷貝的基本思想是:在創建子進程時,不立即復制父進程的內存空間,而是讓父子進程共享同一塊物理內存。只有當其中一個進程嘗試修改這塊內存時,操作系統才會在寫入時進行拷貝,為修改的那塊內存創建一個新的物理內存頁。這種方式節省了內存并提高了性能,特別是在很多情況下,子進程會很快調用exec類函數替換進程鏡像,而無需實際修改父進程的內存。

內存方面的詳細工作機制
  1. 內存頁標記為只讀: 當fork系統調用創建子進程時,父進程的內存頁會被標記為只讀(read-only)。父子進程共享這些只讀的內存頁。

  2. 頁表復制: 父進程的頁表(page table)會被復制到子進程中,但是這些頁表指向的是相同的物理內存頁。因為頁表項是只讀的,所以兩個進程都不能修改這些內存頁。

  3. 頁故障(Page Fault)處理: 當父進程或子進程嘗試寫入某個內存頁時,會觸發頁故障(page fault)。操作系統的頁故障處理程序會檢查這個頁是否標記為寫時拷貝。

  4. 實際拷貝: 在觸發頁故障后,操作系統會為該進程分配一個新的物理內存頁,并將原來的內容復制到這個新的頁中。然后,頁表會被更新,指向新的物理內存頁,并將這個頁標記為可寫(writable)。只有在這一時刻,實際的物理內存才會被復制。

  5. 內存保護更新: 新的頁表項指向了新分配的物理內存頁后,內存保護會被更新,允許對新內存頁的寫操作。

舉個例子

假設有一個進程P,它的內存布局如下:

+-----------+
| 代碼段     |  -> 共享且只讀
+-----------+
| 數據段     |  -> 寫時拷貝
+-----------+
| 堆         |  -> 寫時拷貝
+-----------+
| 棧         |  -> 寫時拷貝
+-----------+

當進程P調用fork創建子進程C時,初始情況下,父子進程共享所有的物理內存頁,并且這些頁都被標記為只讀。其頁表情況如下:

P 頁表:
+-----------+       +-----------+
| 代碼段     |  -->  | 物理頁1    |
+-----------+       +-----------+
| 數據段     |  -->  | 物理頁2    |
+-----------+       +-----------+
| 堆         |  -->  | 物理頁3    |
+-----------+       +-----------+
| 棧         |  -->  | 物理頁4    |
+-----------+       +-----------+C 頁表:
+-----------+       +-----------+
| 代碼段     |  -->  | 物理頁1    |
+-----------+       +-----------+
| 數據段     |  -->  | 物理頁2    |
+-----------+       +-----------+
| 堆         |  -->  | 物理頁3    |
+-----------+       +-----------+
| 棧         |  -->  | 物理頁4    |
+-----------+       +-----------+

當子進程C嘗試寫入堆時(假設是物理頁3),會觸發頁故障,操作系統執行寫時拷貝:

  1. 分配新的物理頁(物理頁5)。
  2. 將物理頁3的內容復制到物理頁5。
  3. 更新子進程C的頁表,使其堆指向物理頁5,并標記為可寫。

更新后的頁表情況如下:

P 頁表:
+-----------+       +-----------+
| 代碼段     |  -->  | 物理頁1    |
+-----------+       +-----------+
| 數據段     |  -->  | 物理頁2    |
+-----------+       +-----------+
| 堆         |  -->  | 物理頁3    |
+-----------+       +-----------+
| 棧         |  -->  | 物理頁4    |
+-----------+       +-----------+C 頁表:
+-----------+       +-----------+
| 代碼段     |  -->  | 物理頁1    |
+-----------+       +-----------+
| 數據段     |  -->  | 物理頁2    |
+-----------+       +-----------+
| 堆         |  -->  | 物理頁5    |  -> 新分配的頁,可寫
+-----------+       +-----------+
| 棧         |  -->  | 物理頁4    |
+-----------+       +-----------+

此時,子進程C對堆的修改不會影響到父進程P,確保了兩個進程的內存隔離。

優點
  1. 節省內存

    • 使用寫時拷貝技術,父進程和子進程在fork后共享相同的內存頁,直到需要寫入時才進行實際的物理頁拷貝。這種方式減少了內存使用,尤其在子進程迅速調用exec系列函數時優勢明顯。
  2. 提高效率

    • 避免了fork時對所有內存頁進行立即拷貝的昂貴操作,提高了進程創建的效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42970.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

企業四要素認證接口在金融行業發揮的作用

🎉🎉🎉企業四要素認證接口在金融行業發揮的作用 🌟🌟🌟隨著金融科技的飛速發展,越來越多的企業開始關注自身的網絡安全和數據保護。在這個背景下,企業四要素認證接口應運而生&#…

hnust 1966: 廣度優先搜索

hnust 1966: 廣度優先搜索 題目描述 輸入一個圖,用鄰接表存儲(實際上也可以選擇鄰接矩陣),并實現BFS操作。 拷貝前面已經實現的代碼,主函數必須如下,完成剩下的部分。 int main() { Graph g; CreateUDG(…

ffmpeg 文檔 - 未完

寫在前面: 筆記的目錄是為了總結他人的話, 從而讓自己更專注閱讀理解與框架思路整理, 忌大而詳細。 原文: ffmpeg 文檔 1 概要 ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...ffmpeg 是一個通用的 媒體轉換器. 讀…

ChatGPT對話:python程序模擬操作網頁彈出對話框

【編者按】單擊一網頁中的按鈕,彈出對話框網頁,再單擊其中的“Yes”按鈕,對話框關閉,請求并獲取新網頁。 可能ChatGPT第一次沒有正確理解描述問題的含義,再次說明后,程序編寫就正確了。 1問:pyt…

全網最全的接口文檔速成

文章目錄 接口文檔內容前言1. 前后端分離開發1.1 介紹1.2 開發流程1.3 前端技術棧 2. Yapi2.1 介紹2.2 使用2.2.1 準備2.2.2 定義接口2.2.3 導出接口文檔2.2.4 導入接口文檔 3. Swagger3.1 介紹3.2 使用方式3.3 查看接口文檔3.4 常用注解3.4.1 問題說明3.4.2 注解介紹3.4.3 注解…

Redis實戰—秒殺優化(Redis消息隊列)

回顧 我們回顧一下前文下單的流程,當用戶發起請求,此時會請求nginx,nginx會訪問到tomcat,而tomcat中的程序,會進行串行操作,分成如下幾個步驟。 1、查詢優惠卷 2、判斷秒殺庫存是否足夠 …

【代碼隨想錄算法訓練營第六十三天|卡碼網117.軟件構造、47.參加科學大會】

文章目錄 117.軟件構造47.參加科學大會 117.軟件構造 本體考察的是拓撲排序的思路,對于所有的有向無環圖進行拓撲排序后輸出的長度一定是和原結點數相同的。整體思路是找到當前所有的入度為0的結點,添加到結果中,并且查看對應的后續結點將其…

文獻筆記|綜述|When Large Language Model Meets Optimization

When Large Language Model Meets Optimization 題目:當大型語言模型遇到優化時 作者:Sen Huang , Kaixiang Yang , Sheng Qi and Rui Wang 來源:arXiv 單位:華南理工大學 文章目錄 When Large Language Model Meets Optimization…

springboot打包異常 Type org.springframework.boot.maven.RepackageMojo not present

解決: 項目在本地時可以正常啟動的,但是打包就報錯,經過分析得出,應該是打包依賴的問題,解決方法: 在pom文件中的build—>plugins---->plugin中添加spring-boot-maven-plugin依賴的版本號如下: 2.4.3 指定版本號即可。

IT審計必看!對比舊版,CISA考試改版升級亮點和重點內容是什么?

官方通知,今年8月1日,CISA新版考綱正式上線,舊版在7月23日后就無法約考了。 艾威培訓邀請了國內知名的IT審計CISA授課老師吳老師來為大家詳細講解CISA新版考綱的變化 目前第28th版教材只有英文版,中文版尚未發布。我們艾威經驗豐…

Jetson-AGX-Orin多網卡綁定網卡名

Jetson-AGX-Orin多網卡綁定網卡名 ? Jetson-AGX-Orin當通過USB接口或者Type-C口插入網卡設備后,重新上電Orin設備后,網卡設備的網卡名與Orin本身的以太網網卡名會發生交換。導致兩個網卡設備配置發生錯亂,兩個網卡都將不通。 可以通過將網…

出道即包攬多項榮譽,Shokz韶音OpenFit Air拿下日本VGP金獎

說到盛夏的日本,你會想到什么?花火大會?但對于消費電子行業來講,日本每年發布的VGP Summer獎項,才是每年盛夏時節行業內最大的慶典。而在今年的VGP 2024 Summer評選中,Shokz韶音在今年4月份剛發布的開放式耳…

開放式耳機音質哪個品牌的好?盤點幾款音質好品牌

在音樂的世界里,每一分貝的振動都承載著情感與故事。對于追求極致音質體驗的我們來說,耳機不僅是聆聽的工具,更是通往音樂靈魂深處的橋梁。而開放式耳機,以其獨有的聲學構造和聽覺享受,引領我們進入一個更為開闊的音樂…

ChatGPT 5.0:一年后的猜想

對于ChatGPT 5.0在未來一年半后的展望與看法,我們可以從以下幾個方面進行詳細探討: 一、技術提升與功能拓展 語言翻譯能力: ChatGPT 5.0在語言翻譯方面有望實現更大突破。據推測,新版本將利用更先進的自然語言處理技術和深度學習…

ONNX加載模型問題總結

輸入參數類型問題 run函數的參數列表如下: SessionImpl::Run(const Ort::RunOptions&, const char* const*, const Ort::Value*, size_t, const char* const*, Ort::Value*, size_t) 注意需要輸入輸出的參數名字形式是const char* const* 方式1 const char* 數…

vue中,圖片在div中按照圖片原來大小等比例顯示

圖片在div中按照圖片原來大小等比例顯示&#xff0c;可以保證web上顯示的圖片和實際圖片形狀一樣&#xff0c;保留原始圖片效果 實現代碼如下&#xff1a; <div style"padding: 0; width:400px;height:400px;position: absolute;border: 1px solid #eff2f6;">…

如何探索高效知識管理:FlowUs知識庫體驗很好

在當今信息爆炸的時代&#xff0c;有效的知識管理對于個人和團隊的發展至關重要。FlowUs 知識庫作為一款創新的知識管理工具&#xff0c;正逐漸成為眾多用戶的首選&#xff0c;為他們帶來了高效、便捷和有條理的知識管理體驗。 FlowUs 知識庫的一大特色在于其簡潔直觀的界面設計…

【ai_agent】從零寫一個agent框架(五)基于egui制作一個agent/workflow在線編輯器

前言 上篇我們實現了基礎節點&#xff0c;并暴露出grpc服務&#xff0c;但是手動編輯文本制作一個workflow實在強人所難。 所以本文我們做個webui自動生成workflow。 開搞之前先看看別人怎么做的。 Dify 的ui 效果如下圖示&#xff1a; 支持多種功能節點 但只能打開一個節…

【spark】Exception in thread “main“ ExitCodeException exitCode=-1073741701

在window上運行spark程序寫到本地文件的時候報錯。 val rdd sc.sparkContext.parallelize(list)val arr rdd.collect()arr.foreach(println)rdd.saveAsTextFile("test1")sc.close()錯誤信息: zhangsan lisi wangwu Exception in thread "main" ExitCode…

如何在電子文件上加蓋印章

在電子文件上加蓋印章&#xff0c;可以通過多種方法實現&#xff0c;主要包括使用專業軟件、在線工具以及圖片編輯軟件等。以下是一些具體步驟和方法&#xff1a; 一、使用專業軟件 PDF編輯工具&#xff1a; 啟動常用的PDF編輯軟件&#xff0c;如Adobe Acrobat、PhantomPDF等…