## 1. 进程基础概念
### 1.1 程序与进程
- **程序**:存储在硬盘上的静态可执行文件(如QQ安装包)
- **进程**:程序被加载到内存中执行的动态实例(如运行中的QQ)
```bash
# 编译生成可执行程序
gcc main.c -o main
# 运行程序创建进程
./main
```
### 1.2 进程特征
- 动态性:生命周期包括创建、运行、消亡
- 并发性:多个进程可同时存在于内存
- 独立性:拥有独立的内存空间和系统资源
- 结构性:由代码段、数据段、PCB等组成
## 2. 进程管理核心
### 2.1 进程组成
| 组成部分 | 描述 |
|---------------|-------------------------------|
| 代码段(text) | 存储可执行指令 |
| 数据段(data) | 已初始化的全局/静态变量 |
| BSS段 | 未初始化的全局/静态变量 |
| 堆(Heap) | 动态分配的内存区域 |
| 栈(Stack) | 函数调用时的临时数据存储 |
| PCB | 进程控制块(核心管理结构) |
### 2.2 进程状态
```bash
# 查看进程状态示例
ps -aux | grep chrome
STAT状态码说明:
R : 运行中/可运行
S : 可中断睡眠
D : 不可中断睡眠
Z : 僵尸进程
T : 已停止
```
## 3. 进程管理实践
### 3.1 常用命令
```bash
# 查看进程树
pstree -sp [PID]
# 动态监控进程
top
# 终止进程
kill -9 [PID]
```
### 3.2 进程创建(fork)
```c
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t pid = fork();
if(pid > 0) {
// 父进程
printf("Parent PID: %d\n", getpid());
} else if(pid == 0) {
// 子进程
printf("Child PID: %d\n", getpid());
} else {
perror("fork failed");
}
return 0;
}
```
## 4. 进程特性深入
### 4.1 地址空间隔离
父子进程拥有独立的内存空间,修改互不影响:
```c
int global = 1; // 全局变量
int main() {
int stack = 2; // 栈变量
int *heap = malloc(sizeof(int));
*heap = 3;
pid_t pid = fork();
if(pid == 0) {
global += 1;
stack += 1;
*heap += 1;
} else {
sleep(1); // 确保子进程先执行
printf("Parent: %d %d %d\n", global, stack, *heap);
}
free(heap);
return 0;
}
```
### 4.2 特殊进程类型
- **僵尸进程**:子进程终止但未被父进程回收
- **孤儿进程**:父进程先于子进程终止,由init进程接管
## 5. 进程应用场景
### 5.1 并发服务器模型
```c
while(1) {
int client_sock = accept(...);
pid_t pid = fork();
if(pid == 0) {
// 子进程处理客户端请求
handle_client(client_sock);
exit(0);
} else {
close(client_sock);
}
}
```
### 5.2 执行新程序(fork+exec)
```c
pid_t pid = fork();
if(pid == 0) {
execlp("ls", "ls", "-l", NULL);
perror("exec failed");
exit(1);
}
```
## 6. 进程创建模式
### 6.1 创建N个子进程
```c
int create_n_processes(int n) {
for(int i=0; i<n; i++) {
pid_t pid = fork();
if(pid == 0) {
printf("Child %d created\n", i+1);
exit(0); // 子进程立即退出
}
}
// 等待所有子进程结束
while(wait(NULL) > 0);
return 0;
}
```
## 7. 进程管理最佳实践
1. 及时回收子进程资源
2. 使用进程池限制并发数量
3. 善用进程间通信机制(管道、共享内存等)
4. 监控进程资源使用情况
5. 处理信号确保程序健壮性
## 结语
理解进程管理是掌握操作系统和多任务编程的基础。通过合理使用fork、exec等系统调用,可以构建高效的并发程序。需要注意僵尸进程和资源泄漏问题,后续可进一步学习线程编程和进程间通信(IPC)技术。

被折叠的 条评论
为什么被折叠?



