多任务
-
单任务 vs 多任务
-
并发(单个CPU) vs 并行(多个CPU)
-
进程
-
进程的特点:每个进程都有自己独立的虚拟地址空间,大小为4G(互不干扰,相互独立)
-
进程虚拟地址空间的构成:
栈空间:先进后出;系统管理;生命周期由所在函数决定;生命周期:局部 堆空间:先进先出;用户管理(malloc,free);用户决定;生命周期:局部或全局 数据段:系统管理;生命周期:全局
-
进程id(getpid(), getppid())
-
所有进程创建都是由父进程创建的,父进程创建的进程称为子进程;
-
Linux系统下所有的进程的父进程:init 0
fork
pid_t fork( void);
-
概念: 复刻(英语:fork,又译作派生、分支)是UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
-
返回值:它不需要参数并返回一个整数值。下面是fork()返回的不同值。
负值:创建子进程失败。
零:返回到新创建的子进程。
正值:返回父进程或调电者。该值包含新创建的子进程的进程ID -
头文件:
#include<unistd.h>/*#包含<unistd.h>*/ #include<sys/types.h>/*#包含<sys/types.h>*/
-
僵尸进程的处理:当父进程先于子进程结束时,子进程就变成了一个僵尸程序。
wait() // waitpid()
#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);
status是一个传出参数。 waitpid的pid参数选择: < -1 回收指定进程组内的任意子进程 = -1 回收任意子进程 = 0 回收和当前调用waitpid一个组的所有子进程 > 0 回收指定ID的子进程
在父进程中调用wait和waitpid可以避免僵尸进程的出现