fork、內存泄漏、進程

1.系統調用  fork:複製進程
Pid_t  fork(void);
Pid_t:int    pid:進程的編號(id標識符)
父子進程併發運行
並行:一種特殊的併發,不是交替,我在執行的同時,你也在執行。兩個處理器
併發運行:一個處理器。在一段時間內交替運行,從長遠角度看是同時運行。
fork:
先複製PCB,再把實體複製一份;
父進程返回的fork值是子進程的pid,子進程返回的fork值是0,子進程複製過來的fork不再對子進程起作用。
2.寫時拷貝:爲了提高效率,以頁爲單位拷貝,如果全部複製,那麼會延時拷貝。在複製時,將修改的頁面拷貝,不修改的,不拷貝,與原來的共享。
3.問題
(1)阿里面試題:
int  main()
{
fork()  ||  fork();
printf(“a\n”);


exit(0);
}
問:有幾個進程?(a打印幾次?)   3次
(2)int main()
{
int i = 0;
for(i = 0;i<2;i++)
{
fork();
printf(“A\n”);
}
}
問:A打印幾次?6次
(3)int main()
{
int i = 0;
for(i = 0;i<2;i++)
{
fork();
printf(“A”);
}
}
問: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。

一點感悟:

 free釋放內存是指在程序結束前釋放的內存,如果用malloc在堆上申請的內存沒有用free釋放掉,那麼在程序結束後,系統自動回收。在一個App中有很多進程,試想一下,如果都沒有用free釋放掉的話,那麼在程序(也就是app)沒有結束時,內存就會越用越小,可能不夠用了。balabala……所以要用free釋放掉呀! 

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章