进程与程序的核心概念
进程是程序执行的动态实例,包含内存分配、CPU调度等资源管理。程序是静态存储在硬盘上的代码和数据集合。
- 区别:
- 程序永久存储,进程临时存在
- 进程有状态变化(创建、运行、终止),程序无状态
- 进程可并发执行,程序不可并发
- 进程间竞争资源(CPU、内存)
- 一个程序可生成多个进程,一个进程可执行多个程序
进程控制块(PCB)
PCB是操作系统描述进程的核心数据结构,包含以下信息:
- PID:唯一进程标识符
- 工作路径:进程当前目录(
chdir相关) - umask:默认文件权限掩码(如
0002) - 文件列表:进程打开的文件描述符
- 信号处理:异步I/O事件响应配置
- 用户/组ID:权限控制标识
- 资源限制:如最大打开文件数(默认1024)、栈大小(如8MB)
进程的内存与隔离性
- 虚拟内存:
- 隔离性:进程间内存空间不可直接访问
- 安全性:通过权限控制防止非法访问内核空间
- 进程内存布局:包括代码段、数据段、堆、栈等
进程分类
- 交互式进程:需用户输入后输出(如命令行工具)
- 批处理进程:批量执行命令(如Shell脚本)
- 守护进程:后台自动运行,响应特定事件(如系统服务)
进程调度与并发
- 调度算法:
- 时间片轮转:每个进程分配固定CPU时间
- 短任务优先:优先执行耗时短的进程
- CFS(完全公平调度):基于权重分配CPU时间
- 并发本质:
- 宏观并行:多进程同时运行(时间段内)
- 微观串行:任一时刻仅一个进程占用CPU
进程上下文切换
当CPU时间片耗尽时:
- 当前进程状态(PCB、寄存器值)保存到内存/硬盘
- 新进程状态从存储加载到内存
- CPU切换到新进程执行
Linux进程管理命令
ps aux:列出所有进程详细信息top:动态查看进程资源占用kill:发送信号控制进程kill -9 PID:强制终止进程killall -9 a.out:终止所有同名进程
进程创建函数(fork)
pid_t fork(void);- 行为:
- 克隆父进程的地址空间和PCB,生成子进程
- 子进程从
fork()后开始执行,与父进程共享代码逻辑
- 返回值:
- 父进程:返回子进程PID(>0)
- 子进程:返回0
- 失败:返回-1
获取进程ID的函数
pid_t getpid(void); // 获取当前进程PID pid_t getppid(void); // 获取父进程PID- 用途:明确进程关系,用于调试或资源管理
关键注意事项
- 父子进程独立性:变量不共享,修改互不影响
- 执行顺序:父子进程运行顺序由调度器决定,非固定
- 资源释放:子进程终止后需由父进程回收(避免僵尸进程)
通过上述机制,操作系统实现多进程的高效管理和资源分配。