进程线程的创建、退出、回收
1. 进程相关知识点
1.1 进程创建
-
fork()
:-
功能:创建一个子进程。
-
返回值:
-
父进程中返回子进程的 PID。
-
子进程中返回 0。
-
失败返回 -1。
-
-
特点:子进程是父进程的副本,拥有独立的内存空间。
-
-
vfork()
:-
功能:创建一个子进程。
-
返回值:
-
父进程中返回子进程的 PID。
-
子进程中返回 0。
-
失败返回 -1。
-
-
特点:子进程与父进程共享内存空间,直到子进程调用
exec()
或exit()
。
-
1.2 进程退出
-
exit()
:-
功能:刷新缓存区,并让进程结束。
-
参数:
status
(进程结束状态)。 -
返回值:无。
-
-
_exit()
:-
功能:直接终止进程,不刷新缓存区。
-
参数:
status
(进程结束状态)。 -
返回值:无。
-
1.3 进程回收
-
wait()
:-
功能:回收任意一个子进程的空间。
-
参数:
wstatus
(存放子进程结束状态的指针)。 -
返回值:
-
成功返回回收到的子进程的 PID。
-
失败返回 -1。
-
-
特点:阻塞调用,直到子进程结束。
-
-
waitpid()
:-
功能:回收指定的子进程的空间。
-
参数:
-
pid
:要回收的子进程的 PID(-1 表示任意子进程)。 -
wstatus
:存放子进程结束状态的指针。 -
options
:回收选项(如WNOHANG
表示非阻塞)。
-
-
返回值:
-
成功返回回收到的子进程的 PID。
-
失败返回 -1。
-
没有回收到子进程返回 0。
-
-
-
状态检查宏:
-
WIFEXITED(wstatus)
:检查子进程是否正常结束。 -
WEXITSTATUS(wstatus)
:获取子进程的退出状态。 -
WIFSIGNALED(wstatus)
:检查子进程是否被信号终止。 -
WTERMSIG(wstatus)
:获取终止子进程的信号编号。
-
1.4 进程执行新程序
-
exec
函数族:-
功能:在当前进程空间中执行新的程序。
-
常见函数:
-
execl()
:参数以列表形式传递。 -
execlp()
:在环境变量$PATH
中查找文件。 -
execv()
:参数以指针数组形式传递。 -
execvp()
:在环境变量$PATH
中查找文件。 -
execle()
和execvpe()
:支持自定义环境变量。
-
-
特点:不创建新进程,直接替换当前进程的代码。
-
2. 线程相关知识点
2.1 线程创建
-
pthread_create()
:-
功能:在调用函数的进程中创建一个线程。
-
参数:
-
thread
:存放线程 ID 的指针。 -
attr
:线程属性(可选)。 -
start_routine
:线程函数的入口。 -
arg
:传递给线程函数的参数。
-
-
返回值:
-
成功返回 0。
-
失败返回错误码。
-
-
2.2 线程退出
-
pthread_exit()
:-
功能:线程退出。
-
参数:
retval
(线程退出的值)。 -
返回值:无。
-
2.3 线程回收
-
pthread_join()
:-
功能:回收线程空间。
-
参数:
-
thread
:要回收的线程的 ID。 -
retval
:存放线程结束状态的指针。
-
-
返回值:
-
成功返回 0。
-
失败返回错误码。
-
-
特点:阻塞调用,直到线程结束。
-
3. 进程与线程的区别
3.1 进程
-
定义:程序动态执行的过程,包括创建、调度和消亡。
-
特点:
-
是操作系统资源分配的最小单元。
-
包括文本段、数据段、系统数据段等。
-
进程切换需要映射到不同的物理地址空间,资源开销较大。
-
3.2 线程
-
定义:线程是一个轻量级的进程。
-
特点:
-
是 CPU 任务调度的最小单元。
-
线程位于进程空间内部,共享进程的文本段、数据段和堆区。
-
线程切换在进程空间内部完成,资源开销较小。
-
3.3 区别
-
执行效率:
-
多线程 > 多进程。
-
线程切换在进程空间内部完成,资源开销小。
-
-
通信实现:
-
多线程 > 多进程。
-
线程共享进程空间,通信更方便。
-
-
通信机制复杂程度:
-
多进程 > 多线程。
-
线程操作全局变量可能引入资源竞争,需要加锁。
-
-
安全性:
-
多进程 > 多线程。
-
线程异常崩溃可能导致整个进程崩溃。
-
4. 僵尸进程
-
定义:子进程已经结束,但父进程尚未读取子进程的状态信息时,子进程的状态信息仍然保留在系统中。
-
产生原因:父进程没有及时调用
wait()
或waitpid()
回收子进程。 -
避免方法:
-
父进程及时调用
wait()
或waitpid()
。 -
使用信号处理函数(如
SIGCHLD
)自动回收子进程。
-
5. 线程空间划分
-
栈区:每个线程独立拥有栈空间(默认 8MB)。
-
共享区:文本段、数据段、堆区与进程及进程内的其他线程共享。
6. 进程状态
-
运行态:正在运行或等待运行。
-
就绪态:准备好运行,但等待 CPU 调度。
-
阻塞态:等待某些事件(如 I/O 操作)完成。
-
终止态:进程结束,等待回收。
7. 进程调度算法
-
常见算法:
-
先来先服务(FCFS)。
-
短作业优先(SJF)。
-
时间片轮转(RR)。
-
优先级调度。
-
多级反馈队列调度。
-
8. 常见命令
-
ps
:显示当前系统中的进程信息。 -
top
:实时显示系统中占用资源最多的进程。 -
kill
:发送信号给进程(如终止进程)。 -
nice
:设置进程的优先级。
9. 线程相关函数
-
pthread_create()
:创建线程。 -
pthread_exit()
:线程退出。 -
pthread_join()
:回收线程空间。 -
pthread_detach()
:分离线程,使其结束后自动释放资源。
10. 多进程 vs 多线程
-
执行效率:多线程 > 多进程。
-
通信实现:多线程 > 多进程。
-
通信机制复杂程度:多进程 > 多线程。
-
安全性:多进程 > 多线程。