進(jìn)程:是一個(gè)正在運(yùn)行的程序
PCB : 即是進(jìn)程控制塊,是進(jìn)程存在的唯一標(biāo)志。用來(lái)描述進(jìn)程的屬性信息,如進(jìn)程的pid。
在執(zhí)行fork之后,先將PCB復(fù)制一份給子進(jìn)程,復(fù)制之前先申請(qǐng)一個(gè)pid,將復(fù)制給子進(jìn)程的PCB中的pid修改為申請(qǐng)成功的pid;然后把當(dāng)前的進(jìn)程復(fù)制一份給子進(jìn)程。父子進(jìn)程并發(fā)運(yùn)行。
以32位為例:
通常定義一個(gè)空指針時(shí)int *p = NULL;
,這個(gè)指針p指向的空就是指向的上圖中的0x0000 0000
。
內(nèi)核和用戶使用空間的分界線的上限為0xc000 0000
,下限為0xbfff ffff
:
1.定義在棧上的變量
2.在堆上申請(qǐng)動(dòng)態(tài)內(nèi)存
(1)malloc申請(qǐng)的內(nèi)存空間當(dāng)程序結(jié)束后會(huì)被系統(tǒng)自動(dòng)回收
在Linux中,用malloc申請(qǐng)一塊1G的內(nèi)存空間,不用free釋放也可以,不會(huì)發(fā)生內(nèi)存泄漏,因?yàn)檫M(jìn)程終止之后,所申請(qǐng)的內(nèi)存空間就會(huì)被回收,但是當(dāng)進(jìn)程運(yùn)行的時(shí)間長(zhǎng)時(shí),也是需要用free來(lái)釋放的。在C語(yǔ)言中,malloc分配一段內(nèi)存空間之后必須用free釋放掉這塊內(nèi)存空間,不然會(huì)發(fā)生內(nèi)存泄露。但是,我們一般在使用malloc之后是需要通過(guò)free釋放空間的。
(2)malloc能申請(qǐng)多大的內(nèi)存空間
①當(dāng)物理內(nèi)存剩余的內(nèi)存空間大于要申請(qǐng)的內(nèi)存空間的時(shí)候是可以申請(qǐng)成功的。
比如現(xiàn)在物理內(nèi)存剩余的內(nèi)存空間為1.8G,要用malloc申請(qǐng)1G的內(nèi)存空間是可以申請(qǐng)成功的。
②當(dāng)前物理內(nèi)存剩余的空間加虛擬內(nèi)存剩余的空間能否滿足申請(qǐng)要求。
當(dāng)malloc申請(qǐng)內(nèi)存2G內(nèi)存空間,當(dāng)物理內(nèi)存剩余的空間加虛擬內(nèi)存剩余的空間大于2G,就可以申請(qǐng)成功。如果分配在虛擬內(nèi)存的空間不去使用,那么它就一直在虛擬內(nèi)存,不會(huì)被調(diào)用回物理內(nèi)存。如果物理內(nèi)存的剩余空間加上虛擬內(nèi)存的剩余空間不能滿足申請(qǐng)內(nèi)存空間的要求,那就申請(qǐng)失敗,這里的滿足還要考慮自身的特性,自身最多只能申請(qǐng)接近3G。如果沒(méi)有虛擬內(nèi)容就會(huì)申請(qǐng)失敗。
③當(dāng)前物理內(nèi)存剩余的空間加虛擬內(nèi)存剩余的空間比所申請(qǐng)的空間大,但是申請(qǐng)失敗。
當(dāng)malloc申請(qǐng)3G的內(nèi)存空間,雖然物理內(nèi)存和虛擬內(nèi)存加起來(lái)超過(guò)了3G,但是不會(huì)申請(qǐng)成功,因?yàn)橛脩艨梢允褂玫膬?nèi)存空間為3G,除去代碼段、數(shù)據(jù)段之后留給堆區(qū)的內(nèi)存空間是不夠3G的。用戶最多只能申請(qǐng)接近3G
④malloc 與 fork,父進(jìn)程堆區(qū)申請(qǐng)的空間復(fù)制后,子進(jìn)程也會(huì)有一份,也需要釋放嗎?
父子進(jìn)程對(duì)申請(qǐng)的堆空間都沒(méi)有操作,代碼如下:
父進(jìn)程在堆區(qū)申請(qǐng)了5個(gè)字節(jié)大小為int型的內(nèi)存,通過(guò)fork復(fù)制之后,產(chǎn)生一個(gè)子進(jìn)程,并在父進(jìn)程和子進(jìn)程結(jié)束前都執(zhí)行了free。
編譯以上代碼,并運(yùn)行,編譯運(yùn)行并沒(méi)有出錯(cuò):
所以,我們可以知道,父進(jìn)程在堆區(qū)申請(qǐng)的內(nèi)存空間復(fù)制一份給子進(jìn)程之后,子進(jìn)程并不共享父進(jìn)程的內(nèi)存空間,父子進(jìn)程在堆區(qū)都會(huì)有一份內(nèi)存空間。因?yàn)槿绻@段內(nèi)存空間是共享的,那么父進(jìn)程對(duì)這段內(nèi)存空間free一次,子進(jìn)程再對(duì)這段內(nèi)存空間free一次,對(duì)同一個(gè)內(nèi)存空間free兩次,編譯運(yùn)行會(huì)出現(xiàn)錯(cuò)誤。而此時(shí)編譯運(yùn)行并沒(méi)有出錯(cuò),所以父子進(jìn)程堆空間不共享(這里指的是每個(gè)進(jìn)程的堆空間),哪怕父子進(jìn)程對(duì)申請(qǐng)的堆空間都沒(méi)有操作。
現(xiàn)在父子進(jìn)程對(duì)申請(qǐng)的堆空間進(jìn)行操作,代碼如下:
編譯并運(yùn)行以上代碼,結(jié)果如下:
結(jié)果分析:輸出的結(jié)果中,第一行是父進(jìn)程輸出的結(jié)果,第二行是子進(jìn)程輸出的結(jié)果,可以看出父子進(jìn)程對(duì)堆空間里的值進(jìn)行修改,父進(jìn)程對(duì)堆空間的值進(jìn)行修改并沒(méi)有導(dǎo)致對(duì)應(yīng)子進(jìn)程堆空間的值被修改,子進(jìn)程對(duì)堆空間的值進(jìn)行修改也沒(méi)有導(dǎo)致對(duì)應(yīng)父進(jìn)程堆空間的值被修改。更加可以說(shuō)明,父子進(jìn)程是不共享堆上的內(nèi)存空間的。子進(jìn)程也需要釋放從父進(jìn)程復(fù)制過(guò)來(lái)的堆上的內(nèi)存空間。
【注意】
如果一個(gè)函數(shù)沒(méi)有被主函數(shù)調(diào)用也會(huì)給該函數(shù)分配內(nèi)存空間。
因篇幅問(wèn)題不能全部顯示,請(qǐng)點(diǎn)此查看更多更全內(nèi)容
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號(hào)-2
違法及侵權(quán)請(qǐng)聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬(wàn)商天勤律師事務(wù)所王興未律師提供法律服務(wù)