什么是fork:
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。
上面的话通俗理解就是: fork是复制进程的函数,程序一开始就会产生一个进程,当这个进程(代码)执行到fork()时,fork就会复制一份原来的进程即就是创建一个新进程,我们称子进程,而原来的进程我们称为父进程,此时父子进程是共存的,他们一起向下执行代码。
注意的一点:就是调用fork函数之后,一定是两个进程同时执行fork函数之后的代码,而之前的代码以及由父进程执行完毕。
fork的特点:
首先明白linux中:
PID表示的进程号,是唯一的,一个PID只标识一个进程
PCB:进程控制块,进程控制块是用一个结构体struct task_struct来实现
————————————————
版权声明:本文为CSDN博主「Oorik」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51609435/article/details/124849719
父进程的返回值是子进程的PID,子进程的返回值是0;
进程释放如果顺序不对等问题,可能出现僵死(僵尸)进程;
size_t 其实就是 int ,size_t是个表示大小的整型
pid_t 是整型,只不过是表示pid的整型;
#include
#include
int main()
{
char *s=NULL;
int n=0;//控制父子进程执行的次数
pid_t id=fork();
assert(id!=-1);
if(id==0)//子进程
{
s="child";
n=3;
}
else//父进程
{
s="parent";
n=7;
}
//父子进程一起执行
int i=0;
for(;i<n;i++)
{
printf("s=%s\n",s);
sleep(1);
}
exit(0);
}
fork方法调用成功后,就会有两个进程存在,调用fork的进程称为父进程,新复制的进程
称为子进程;
swap(交换)
虚拟内存提供的三个重要的能力:
1) 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动
区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进
程。
2) 它为每个进程提供了一致的地址空间,从而简化了存储器管理;
3) 它保护每个进程的地址空间不被其他进程破坏 ;
不采用写时拷贝技术,第一,复制开销比较大;第二,占用内存空间;
所以我们对fork复制进程的过程做了一个优化:-------写时拷贝技术;
引入了写时拷贝技术,就可以延迟页面的拷贝,甚至免除页面的拷贝
还有一个需要注意的地方:写时拷贝是以页为单位的,哪怕这个页中只有一个字节被修
改了,我们也需要将整个页面都复制出来一份.