更新時間:2025-08-13 17:46:19作者:佚名
例如 環(huán)境變量 公共結(jié)構(gòu)
代碼地址:
wang@localhost fork
$ ./a.out
ptr index=0 value= 1
ptr index=1 value= 2
ptr index=2 value= 0
子進程標識為25994, 全局整數(shù)值等于2, 指針地址為十六進制1c26010,
ptr index=0 value= 3
ptr index=1 value= 4
ptr index=2 value= 0
父進程標識為二十五九九三,全局整數(shù)值為一,指針地址為零乘以十六進制的二六二六一零,
Q1 為什么父子進程打印的ptr地址是一樣的
A1:
觀察到一個情況fork是什么意思起步網(wǎng)校,父進程調(diào)用malloc函數(shù)后,其返回的指針指向地址0x12345678,當執(zhí)行fork操作產(chǎn)生子進程時,子進程中的相同指針也指向0x12345678,盡管這兩個地址值相同,但它們都屬于虛擬內(nèi)存地址范疇,通過地址轉(zhuǎn)換機制映射后,實際對應(yīng)的物理內(nèi)存位置并不相同。
所以兩個進程中的這兩個地址相互之間沒有任何關(guān)系。
在分叉后,這兩個看似相同的邏輯地址,實際對應(yīng)著不同的物理內(nèi)存空間,這樣有助于明白子進程與父進程之間的隔離性
注2:事實上,Linux系統(tǒng)為提升分叉性能,運用了寫時復制機制,分叉過程中,兩個進程的虛擬地址初始時指向同一物理內(nèi)存頁,當其中任一進程嘗試改動該內(nèi)存頁數(shù)據(jù)時,該頁才會被復制,各自形成獨立的物理地址副本,存放不同的數(shù)據(jù)內(nèi)容
虛擬地址里映射到真實的物理地址
驗證2 共享數(shù)據(jù)塊
fork 之后 父子進程之間什么樣的數(shù)據(jù)是相同的?
驗證3 共享內(nèi)存是進程本身的資源嗎?
不是
共享內(nèi)存有持續(xù)性: 隨內(nèi)核fork是什么意思,
即進程重啟共享內(nèi)存中數(shù)據(jù)不會丟失
本身不具備協(xié)作能力 需要互斥鎖 信號量等完成