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