1.函数接口:
1.waitpid
pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:
回收指定的子进程空间
参数:
pid:想要回收的进程的PID号
wstatus:回收子进程结束的状态
options:
0 阻塞回收
WNOHANG 非阻塞回收
返回值:
成功返回回收到的子进程的PID
失败返回-1
没有回收到子进程空间返回0
注意:
1.wait可以回收任一子进程空间
2.waitpid可以回收指定的子进程空间
3.waitpid可以设定为非阻塞IO回收
2.exec函数族:
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);
int execlp(const char *file, const char *arg, ...
/* (char *) NULL */);
int execle(const char *path, const char *arg, ...
/*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
功能:
利用进程空间执行另外一份代码
l:执行新代码时,参数以列表形式传递
v:执行新代码时,参数以指针数组形式传递
p:执行新代码时,代码在系统路径PATH下查找
fork创建子进程空间
exec利用子进程空间执行一段新的代码
fork + exec:可以启动一个新的软件代码
3.线程
线程是一个轻量级的进程,包括创建、调度和回收的整个过程
4.线程的创建:
1.线程被创建后,独享栈区,共享进程中的文本段、数据段和堆区
进程是独享 0 - 4G虚拟内存空间,包括文本段、数据段和系统数据段
线程是独享 8M 栈区空间,其余进程中文本段、数据段、堆区与其余线程共享
5.线程的调度:
1.宏观并行,微观串行
6.线程的回收
1.线程执行结束后,回收线程空间,避免产生僵尸线程
7.线程和进程有哪些区别?
1.进程是系统资源分配的最小单元
2.线程是CPU任务调度的最小单元
8.多线程和多进程的对比:
执行效率:
1.多线程 > 多进程
多线程位于一个进程空间内部,调度任务时不需要切换进程空间
多进程空间是独立的,任务调度时CPU需要在不同的进程空间切换,增大系统的资源开销
通信效率:
1.多线程 > 多进程
多线程位于同一个进程空间内部,共享文本段、数据段、堆区,全局变量、静态变量、字符串常量、malloc空间都是共享的
多进程空间独立,没有共享空间,多进程间通信需要依赖第三方的文件才能实现通信
安全性:
1.多进程 > 多线程
多进程空间独立,一个进程异常结束,不会影响其余进程的执行
多线程共享同一进程空间,一个线程异常结束,会导致进程结束,其余线程均无法执行
通信复杂度:
1.多进程 > 多线程
多线程操作共享空间会引发资源竞争,需要使用互斥锁来解决资源竞争
多进程空间独立,没有共享空间,不会引发资源竞争,不需要考虑加锁
9.fork
pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:
在进程空间内部创建一个线程
参数:
thread:存放线程ID空间的首地址
attr:线程的属性空间首地址 (默认传NULL)
start_routine:线程要执行的函数的地址
arg:对线程函数传递的参数
返回值:
成功返回0
失败返回非0
注意:
1.编译时需要加-lpthread链接线程库
gcc filename.c -lpthread
exit
pthread_exit
wait
pthread_join
pthread_self