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)已经把子进程复制出来了,那么子进程就不会存在内存泄露啦~


你可能感兴趣的:(Linux)