fork 記憶體洩漏 程序

2021-08-09 22:54:11 字數 1202 閱讀 4064

1.系統呼叫  fork:複製程序

pid_t  fork(void);

pid_t:int    pid:程序的編號(id識別符號)

父子程序併發執行

並行:一種特殊的併發,不是交替,我在執行的同時,你也在執行。兩個處理器

併發執行:乙個處理器。在一段時間內交替執行,從長遠角度看是同時執行。

fork:

先複製pcb,再把實體複製乙份;

父程序返回的fork值是子程序的pid,子程序返回的fork值是0,子程序複製過來的fork不再對子程序起作用。

2.寫時拷貝:為了提高效率,以頁為單位拷貝,如果全部複製,那麼會延時拷貝。在複製時,將修改的頁面拷貝,不修改的,不拷貝,與原來的共享。

3.問題

(1)阿里面試題:

int  main()

問:有幾個程序?(a列印幾次?)   3次

(2)int main()

}問:a列印幾次?6次

(3)int main()

}問:a列印幾次?8次

注意printf緩衝區問題

4.關於在程式中列印的變數位址,父子程序列印的某個變數的位址是邏輯位址,不是實體地址

5.malloc,申請的堆區空間,fork以後,父子程序的空間是不是指向乙個空間?

這個問題呢,是這樣考慮嘀,首先,如果先用malloc申請記憶體空間,再呼叫fork,那麼子程序在執行時就會將父程序的malloc申請的空間拷貝過來,在父程序呼叫fork時,子程序又會複製同樣的空間給自己,所以為了避免浪費空間,我們在fork之後再呼叫malloc

1.記憶體洩漏,能申請多大記憶體空間? 

如果所申請的記憶體塊大於目前堆上剩餘記憶體塊(整塊),則記憶體分配會失敗,函式返回null。注意這裡說的「堆上剩餘記憶體塊」不是所有剩餘記憶體塊之和,因為malloc函式申請的是連續的一塊記憶體。既然malloc函式申請記憶體有不成功的可能,那我們在使用指向這塊記憶體的指標時,必須用if(null!=p)語句來驗證記憶體確實分配成功了,如果失敗,返回null。

比如,我的linux的swap分割槽記憶體是2g,那麼申請的記憶體不可能超過2g。

一點感悟:

malloc在fork之前,子程序會把父程序用malloc建立的記憶體複製過來,然後自己有乙個記憶體空間,那麼不管執不執行子程序,子程序都會有記憶體洩露;若malloc在fork之後,那麼父程序在執行fork這一句(還沒來得及執行自己的malloc)已經把子程序複製出來了,那麼子程序就不會存在記憶體洩露啦~

利用程序資訊追查記憶體洩漏

一 問題現象 bigpipe是baidu公司內部的分布式傳輸系統,其伺服器模組broker採用非同步程式設計框架來實現,並大量使用了引用計數來管理物件資源的生命週期和釋放時機。在對broker模組進行壓力測試過程中,發現broker長時間執行後,記憶體占用逐步變大,出現了記憶體洩漏問題。二 初步分析...

Linux程序記憶體分析和記憶體洩漏定位

在linux產品開發過程中,通常需要注意系統記憶體使用量,和評估單一程序的記憶體使用情況,便於我們選取合適的機器配置,來部署我們的產品。linux本身提供了一些工具方便我們達成這些需求,檢視程序實時資源top工具,更詳細的程序記憶體堆疊情況,pmap工具,linux程序執行時狀態資訊也會儲存在pro...

linux程序之記憶體洩漏分析

目的 總結linux程序記憶體洩漏導致crash的分析方法及解決過程 問題背景 插入usb裝置並配置啟動dlna功能,測試較長一段時間後會導致cpu和記憶體佔用率很高以致開發板crash,有ps下的程序狀態截圖和crash日誌 關鍵節點 1.問題crash復現 2.在陌生的原始碼中尋找突破口 3.分...