1.进程:一个正在运行中的程序;
2.PCB:进程控制块
进程控制块是用一个结构体struct task_struct来实现;
3.进程的状态:
就绪,阻塞,运行
4.并发与运行
fork是把已有的进程复制一份,当然把PCB也复制了一份,然后申请一个PID,子进程的 PID(父进程的)+1;
子进程的PID=父进程的PID+1; 如果父子进程想要做不同的事情,那么我们通过返回值来判断;
1 #include <stdio.h>
2 #include <assert.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <stdlib.h>
6
7 int main()
8 {
9 char *s=NULL;
10 int n=0;//控制父子进程执行的次数
11
12 pid_t id=fork();
13 assert(id!=-1);
14
15 if(id==0)//子进程
16 {
17 s="child";
18 n=3;
19
20 }
21 else
22 {
23 s="parent";
24 n=7;
25 }
26 //父子进程一起运行
27 int i=0;
28 for(;i<n;i++)
29 {
30 printf("s=%s\n",s);
31 sleep(1);
32 }
33 exit(0);
34 }
getppid:得到一个进程的父进程的PID;
getpid:得到当前进程的PID;
写时拷贝技术
在进行 fork 复制进程时,并不马上进行父进程的地址空间的完全拷贝。而是使用 了写时拷贝(Copy-On-Write)技术,即就是让父进程和子进程共享父进程的页面,当父进程或子进程中任意一个进程试图修改某个页面时,再将其拷贝一份给子进程。这样可以延迟页面拷贝,提高 fork 复制的效率。另外,通常 Linux 中的新进程都是通过 fork+exec 实现的,如果 fork 后需要执行 exec 那么直接就不需要拷贝了。