linux中fork()函數的小問題

問題描述:分析下列代碼,分別能產生多少a?

//  1
for(int i=0; i<3; i++){
printf("a\n");
fork();
}// 2
for(int i=0; i<3; i++){
fork();
printf("a\n");
}// 3
for(int i=0; i<3; i++){
fork();
printf("a");
}
fflush(stdout);// 4
for(int i=0; i<3; i++){
printf("a");
fork();
}

分析:

【問題1】第0次循環:此時只有p0主進程,直接輸出a,然后執行fork();產生一個子進程p1;現在有一個a

? ? ? ? 第1次循環:此時有兩個進程p0,p1;都輸出一個a ,共兩個a;然后執行fork();分別產生p2,p3,兩個子進程;目前終端輸出三個a,有四個進程p0,p1,p2,p3;

? ? ? ? 第2次循環:此時四個進程各輸出一個 a ;隨后產生四個進程,程序結束;終端上一共有1+2+4 = 7 個a。

【問題2】第0次循環:此時只有p0主進程,執行fork(),生成子進程p1,兩個進程各自在終端輸出一個a,此時終端共兩個a;

? ? ? ? 第1次循環:此時有p0,p1進程,執行fork(),生成子進程p2,p3,共四個進程,各自輸出一個a,此時終端共有 2+4 = 6 個a;

? ? ? ? 第2次循環:此時有p0,p1,p2,p3進程,執行fork(),生成四個子進程,共八個子進程,各自在終端輸出8個子進程,此時共有 2+ 4+8 = 14個a;

? ? ? ? 但是在終端上出現如下情況,原因為各進程間結束時間不一致,當主進程結束時,部分子進程還未結束,會繼續向終端輸出a;

?此時只要在for循環后加sleep();等待進程全結束即可得到規整的輸出:

 void test2(){12     printf("[test2] 預測有 14個\n");13     for(int i=0;i<3;i++){14        fork();15         printf("[test2] : a\n");16     }17 18     sleep(1);                                                                               19 }   

?【問題3】(注:本題以及問題4涉及緩存相關知識)

? ? ? ? 第0次循環:主進程p0執行fork()后產生子進程p1,隨后執行滿緩存輸出,此時將a輸出當進程p0、p1的緩沖區中,并不直接輸出到終端(后兩次循環也是一樣);

? ? ? ? 第1次循環:p0,p1執行fork()后產生p2,p3子進程,隨后執行printf(),將a輸出到各進程的緩沖區中,此時p0,p1,p2,p3中的緩沖區都存在兩個但還未輸出;

? ? ? ? 第2次循環:同理第1次循環,會產生四個子進程,共八個進程,隨后的printf()在各自的進程緩存空間中輸出a,當進程結束時,標準輸出會刷新緩存,將每個進程中的三個a輸出到終端;程序結束后,終端上會顯示 3*8 = 24個 a;

?若出現輸出在命令行之后的情況,原因同問題2,各個進程結束時間不一致導致,使用sleep()就可以解決。

【4】

? ? ? ? 第0次循環:主進程p0執行printf()后并未直接輸出,而是將a輸出到p0的緩存中。隨后執行fork(),產生的子進程p1會復制p0的用戶態地址空間;這里有個小知識點fork()采用寫時復制,在隨后對共享頁中i++時候才真正復制p0的棧堆數據等,此時才將p0中的緩存復制一份,這是區別與問題3的;問題3是在各自緩存中加了一個a,問題4是在父進程緩存中先加了一個a,隨后復制到各子進程(后兩次不作過多贅述,fork()寫時復制策略放在最后);此時p0,p1緩存中各有一個a;

? ? ? ? 第1次循環:p0,p1執行printf(),將a輸出到各進程的緩沖區中,緩存中各自有兩個a,執行fork(),產生p2,p3,此時p0,p1,p2,p3中的緩沖區都存在兩個a但還未輸出;

? ? ? ? 第2次循環:同理上次循環,會產生四個子進程,共八個進程,并且在fork()前的printf()在各自的進程緩存空間中輸出a,各個進程緩存中存在3個a,當進程結束時,標準輸出會刷新緩存,將每個進程中的三個a輸出到終端;程序結束后,終端上會顯示 3*8 = 24個 a;

?

寫時復制

為了減少數據復制的開銷, 優化內存管理, fork采用是寫時復制(Copy-On-Write,簡稱COW)的策略

  1. 在fork()執行時,操作系統并不立即復制父進程的整個內存空間給子進程。操作系統使父進程和子進程暫時共享相同的物理內存頁。
  2. 這些共享的頁面在內存中被標記為只讀。如果父進程或子進程嘗試寫入這些共享的頁面(以頁為單位),操作系統會為發起寫操作的進程(父進程或子進程)分配一個新的物理內存頁, 并復制數據到這個頁。

寫時復制機制確保只有在必要時才復制數據頁,這極大地減少了內存使用和提高了效率。

?

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

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

相關文章

阿克曼-幻宇機器人系列教程2- 機器人交互實踐(Topic)

在上一篇文章中&#xff0c;我們介紹了兩種登錄機器人的方式&#xff0c;接下來我們介紹登錄機器人之后&#xff0c;我們如何通過topic操作命令實現與機器人的交互。 1. 啟動 & 獲取topic 在一個終端登錄樹莓派后&#xff0c;執行下列命令運行機器人 roslaunch huanyu_r…

51c嵌入式~電路~合集27

我自己的原文哦~ 一、7805應用電路 簡介 如上圖&#xff0c;7805 集成穩壓電路。 7805是串聯式三端穩壓器&#xff0c;三個端口分別是電壓輸入端&#xff08;IN&#xff09;&#xff0c;地線&#xff08;GND&#xff09;&#xff0c;穩壓輸出&#xff08;OUT&#xff09;…

Vitrualbox完美顯示系統界面(只需三步)

目錄 1.使用vitrualbox的增強功能&#xff1a;?編輯 2.安裝增強功能&#xff08;安裝完后要重啟虛擬機&#xff09;&#xff1a; 3. 調整界面尺寸&#xff08;如果一個選項不行的話&#xff0c;就多試試其他不同的百分比&#xff09;&#xff1a; 先看看原來的&#xff0c;…

2025年第十六屆藍橋杯軟件賽省賽C/C++大學A組個人解題

文章目錄 題目A題目C&#xff1a;抽獎題目D&#xff1a;紅黑樹題目E&#xff1a;黑客題目F&#xff1a;好串的數目 https://www.dotcpp.com/oj/train/1166/ 題目A 找到第2025個素數 #include <iostream> #include <vector> using namespace std; vector<i…

電機控制儲備知識學習(一) 電機驅動的本質分析以及與磁相關的使用場景

目錄 電機控制儲備知識學習&#xff08;一&#xff09;一、電機驅動的本質分析以及與磁相關的使用場景1&#xff09;電機為什么能夠旋轉2&#xff09;電磁原理的學習重要性 二、電磁學理論知識1&#xff09;磁場基礎知識2&#xff09;反電動勢的公式推導 附學習參考網址歡迎大家…

JMeter同步定時器 模擬多用戶并發訪問場景

同步定時器 JMter同步定時器的作用主要在于模擬多用戶并發訪問的場景&#xff0c;確保多個線程能夠同時執行某個操作&#xff0c;達到真正的并發效果。 當多個線程同時啟動時&#xff0c;它們可能會在不同的時間間隔內執行&#xff0c;這樣就無法達到真正的并發效果。&#xff…

C++11異步編程 --- async

C11異步編程 — async和future C11引入了async和future機制&#xff0c;用于簡化異步編程和并發操作。這兩個組件位于<future>頭文件中&#xff0c;提供了高級的異步任務管理接口。 一、async 1.定義 std::async std::async是一個函數模板&#xff0c;用于啟動一個異…

(七)深度學習---神經網絡原理與實現

分類問題回歸問題聚類問題各種復雜問題決策樹√線性回歸√K-means√神經網絡√邏輯回歸√嶺回歸密度聚類深度學習√集成學習√Lasso回歸譜聚類條件隨機場貝葉斯層次聚類隱馬爾可夫模型支持向量機高斯混合聚類LDA主題模型 一.神經網絡原理概述 二.神經網絡的訓練方法 三.基于Ker…

[Java實戰]Spring Boot 整合 Swagger2 (十六)

[Java實戰]Spring Boot 整合 Swagger2 &#xff08;十六&#xff09; 一、Swagger 的價值與痛點 為什么需要 API 文檔工具&#xff1f; 開發階段&#xff1a;前后端高效協作&#xff0c;實時驗證接口測試階段&#xff1a;提供標準化測試用例維護階段&#xff1a;降低新人理解…

系統穩定性之上線三板斧

&#x1f4d5;我是廖志偉&#xff0c;一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》&#xff08;基礎篇&#xff09;、&#xff08;進階篇&#xff09;、&#xff08;架構篇&#xff09;清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…

題海拾貝:P1833 櫻花

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》、《C修煉之路》 歡迎點贊&#xff0c;關注&am…

擺脫拖延癥的詳細計劃示例

以下是一個以一周為周期&#xff0c;幫助你擺脫拖延癥的詳細計劃示例&#xff0c;你可以根據自己的實際情況進行調整和完善。 --- # 擺脫拖延癥一周計劃 ## 一、計劃目標 通過一系列有針對性的方法和行動&#xff0c;逐步克服拖延習慣&#xff0c;提高任務執行效率和自我管理…

實物工廠零件畫圖案例(上)

文章目錄 滑臺氣缸安裝板旋轉氣缸安裝板張緊調節塊長度調節塊雙軸氣缸安裝板步進電機安裝板梯形絲桿軸承座 簡介&#xff1a;案例點擊此處下載&#xff0c;這次的這幾個案例并沒有很大的難度&#xff0c;練習這幾個案例最為重要的一點就是知道&#xff1a;當你拿到一個實物的時…

【Nova UI】十六、打造組件庫之滾動條組件(中):探秘滑塊的計算邏輯

序言 在上篇文章中&#xff0c;我們完成了滾動條組件開發的前期準備工作&#xff0c;包括理論推導、布局規劃和基礎設置。現在&#xff0c;我們將把這些準備轉化為實際代碼&#xff0c;開啟滾動條組件的具體開發之旅&#x1f31f;。我們會詳細闡述如何實現各項功能&#xff0c…

laravel 使用異步隊列,context帶的上下文造成反序列化出問題

2025年5月8日17:03:44 如果你是單個應用&#xff0c;異步遞交任務&#xff0c;是在應用內部使用&#xff0c;一般不會發生這樣的問題 但是現在app項目是 app是一個應用&#xff0c;admin是一個應用&#xff0c;app吧為了接口性能吧異步任務丟給admin去執行&#xff0c;如果兩個…

深入剖析 MyBatis 位運算查詢:從原理到最佳實踐

深入剖析 MyBatis 位運算查詢&#xff1a;從原理到最佳實踐 引言 在數據庫設計中&#xff0c;位運算是一種高效存儲和查詢多選字段的常用技術。然而&#xff0c;在實際開發中&#xff0c;特別是在使用 MyBatis 這樣的 ORM 框架時&#xff0c;位運算查詢往往會遇到一些意想不到…

01 | 大模型微調 | 從0學習到實戰微調 | AI發展與模型技術介紹

一、導讀 作為非AI專業技術開發者&#xff08;我是小小爬蟲開發工程師&#x1f60b;&#xff09; 本系列文章將圍繞《大模型微調》進行學習&#xff08;也是我個人學習的筆記&#xff0c;所以會持續更新&#xff09;&#xff0c;最后以上手實操模型微調的目的。 (本文如若有…

代碼隨想錄算法訓練營第三十八天|動態規劃part6(完全背包2)

322. 零錢兌換 題目鏈接&#xff1a; 322. 零錢兌換 - 力扣&#xff08;LeetCode&#xff09; 文章講解&#xff1a; 代碼隨想錄 思路&#xff1a; 確定遞推公式&#xff1a; dp[j]min(dp[j],dp[j-coins[i]]1); 由于是完全背包 &#xff0c;所以遍歷順序是正序 還存在另一…

使用 ECharts GL 實現交互式 3D 餅圖:技術解析與實踐

一、效果概覽 本文基于 Vue 3 和 ECharts GL&#xff0c;實現了一個具有以下特性的 3D 餅圖&#xff1a; 立體視覺效果&#xff1a;通過參數方程構建 3D 扇形與底座動態交互&#xff1a;支持點擊選中&#xff08;位移效果&#xff09;和懸停高亮&#xff08;放大效果&#xff…

Transformer Decoder-Only 參數量計算

Transformer 的 Decoder-Only 架構&#xff08;如 GPT 系列模型&#xff09;是當前大語言模型的主流架構&#xff0c;其參數量主要由以下幾個部分組成&#xff1a; 嵌入層&#xff08;Embedding Layer&#xff09;自注意力層&#xff08;Self-Attention Layers&#xff09;前饋…