聊聊fork的那些事

2021-09-28 22:27:47 字數 1106 閱讀 6757

參加了一場面試 學會了乙個知識點 

fork之後發生了 什麼 ,我很正常的做出了回答,對父程序的記憶體進行了複製。

fork之後 ,在早期的unix的系統是通過複製的 

為系統分配 記憶體頁

初始化記憶體頁

將父程序的記憶體內容分配到子程序當中

這造成了什麼?這造成了cpu和記憶體的浪費,如果乙個父程序1個g占用,那麼子程序是否也就占用了乙個g呢?

當我讀書unix高階環境程式設計,被一端內容所誤解,卻沒有理解書中後面的內容,這段內容是,子程序是父程序的副本,父子程序不共享這些儲存空間,但是共享正文段。讀到這裡完全被誤解了!!!沒有看到書後面的寫時複製(cow)

書中後面說道,由於許多人在fork之後直接呼叫的exec,所以會造成嚴重的記憶體浪費,所以開始使用了 寫時複製cow,那麼什麼是cow呢?

我們先要明白乙個程序他的c程式儲存空間,乙個unix程序的c程式儲存空間是怎麼樣的?

unix高階環境程式設計裡面寫到,乙個程序的c儲存空間是由,堆、棧、資料區(未初始化資料,初始化資料)、正文段 這幾部分程式組成。

寫時複製是父子程序共享乙個儲存空間,而且都是唯讀的,父子程序任何乙個要做修改都會複製出一塊記憶體頁。fork之後子程序的資料段和堆疊都是指向父程序的物理空間的 也就是說父子程序的虛擬記憶體是不同的,當父子程序發生修改的時候再為子程序分配記憶體頁。

那我們繼續來說一下 vfork這個函式,vfork也是建立乙個新的程序,但是vfork函式的目的是為了執行exec,但是他不會把將父程序的位址空間完全複製到子程序位址空間中(意味著 資料區域 和 堆疊區域 都不會被複製到子程序的虛擬記憶體中),因為子程序會呼叫exec不會訪問父程序的位址空間,另乙個區別是vfork一定是確保子程序先執行的。

fork函式,子程序是在呼叫父程序呼叫fork函式之後生成的。上面說明了子程序將其終止狀態返回給父程序,但是如果父程序在子程序終止之前終止會出現什麼狀況呢?對於父程序已經終止的所有程序,他們的父程序變為init程序,我們稱這些程序由init程序領養。其操作過程如下:在乙個程序終止的時候,核心會逐個檢查所有活動的程序,以判斷是否是要正要終止的子程序,如果是則將這個程序的父程序更改為pid為1.這種方法保證了每乙個子程序都有乙個父程序.(注意在ubuntu上父程序死掉之後領養的程序不是init 是 systemd!!!!)

聊聊字元編碼那些事

計算機字元編碼的歷史 在windows作業系統下可以通過命令列模式檢視系統使用的字符集,如下圖所示 從圖中看到,活動頁 為936,代表gb2312 簡體中文 作者的個人計算機安裝的是windows10簡體中文版。microsoft visual studio整合開發環境採用的字元編碼是作業系統使用的...

聊聊UTC時間那些事

最近做了乙個微控制器的專案,採用外接rtc模組,而外接模組只有年月日時分秒暫存器,需要用到時間戳對發生的事件和日誌做記錄。於是就想做乙個使用在微控制器上的utc轉unix時間戳的庫。先說一下什麼是utc時間,utc是coordinated universal time縮寫,中文又稱協調世界時。在了解...

iOS 聊聊加密的那些事

情景 網頁載入快取可能會用到nsurlcache,每次請求會返回乙個urlcacheresponse.現在我們需要將每個url儲存在caches檔案中,為了加密,要對每個url使用md5加密技術。相應的 段是 const char cstr str utf8string unsigned char ...