Linux 进程管理笔记

✅ 进程基础

🔹定义:​进程是正在执行的程序实例,是操作系统资源分配的基本单位。​

🔹进程控制块(PCB):​操作系统用来管理进程的核心数据结构,包含进程状态、程序计数器、寄存器、内存管理信息、调度信息等。​

🔹进程状态:

就绪(Ready):​等待 CPU 分配时间片。

运行(Running):​正在执行。

阻塞(Blocked):​等待某事件(如 I/O)完成。

终止(Terminated):​执行完成或被终止。


✅ 进程生命周期

🔹创建:​通过系统调用(如 fork())创建新进程。​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
switch (pid) {
case -1:
perror("fork error");
exit(-1);
case 0:
printf("这是子进程打印信息<pid: %d, 父进程 pid: %d>\n",
getpid(), getppid());
_exit(0); //子进程使用_exit()退出
default:
printf("这是父进程打印信息<pid: %d, 子进程 pid: %d>\n",
getpid(), pid);
exit(0);
}
}

🔹执行:​进程被调度执行。​

🔹终止:​通过 exit()、_exit() 或父进程调用 wait() 等方式终止。​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
int main(void)
{
int status;
int ret;
int i;
/* 循环创建 3 个子进程 */
for (i = 1; i <= 3; i++) {
switch (fork()) {
case -1:
perror("fork error");
exit(-1);
case 0:
/* 子进程 */
printf("子进程<%d>被创建\n", getpid());
sleep(i);
_exit(i);
default:
/* 父进程 */
break;
}
}
sleep(1);
printf("~~~~~~~~~~~~~~\n");
for (i = 1; i <= 3; i++) {
ret = wait(&status);
if (-1 == ret) {
if (ECHILD == errno) {
printf("没有需要等待回收的子进程\n");
exit(0);
}
else {
perror("wait error");
exit(-1);
}
}
printf("回收子进程<%d>, 终止状态<%d>\n", ret,
WEXITSTATUS(status));
}
exit(0);
}

🔹清理:​父进程回收子进程资源,防止僵尸进程。


✅ 进程间通信(IPC)

🔹管道(Pipe):​用于父子进程间的单向数据传输。​

🔹命名管道(FIFO):​用于无亲缘关系进程间的单向数据传输。​

🔹消息队列(Message Queue):​允许进程间以消息的形式交换数据。​

🔹共享内存(Shared Memory):​多个进程共享一块内存区域,效率高。​

🔹信号量(Semaphore):​用于进程间同步与互斥控制。​

🔹信号(Signal):​用于进程间的异步通知机制。


✅ 进程间通信(IPC)

🔹进程组(Process Group):

​一组相关进程,共享同一进程组 ID(PGID)。​

🔹会话(Session):

​由一个或多个进程组组成,包含一个控制终端。​

🔹控制终端(Control Terminal):

​用于与会话中的前台进程组进行交互的终端。​

🔹前台进程组:

​当前会话中正在控制终端上运行的进程组。​

🔹后台进程:

​不与控制终端交互的进程。


✅ 其他重要概念

🔹僵尸进程(Zombie Process):

​子进程已终止,但父进程未调用 wait(),导致其资源未被回收。​

🔹孤儿进程(Orphan Process):

​父进程已终止,子进程被 init 进程收养。​

🔹进程优先级(Priority):

​影响进程调度的因素,通常由操作系统根据进程类型和状态动态调整。


Linux 进程管理笔记
https://chrisy0618.github.io/2025/04/19/process/
作者
Chris.Y
发布于
2025年4月19日
许可协议