1. 程式人生 > >fork、記憶體洩漏、程序

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)已經把子程序複製出來了,那麼子程序就不會存在記憶體洩露啦~