进程
一、基本概念
1. 进程定义
-
进程:程序执行的过程,需要分配内存资源和CPU资源
-
程序:静态存储在硬盘中的代码和数据的集合
2. PCB(进程控制块)
-
结构体:process control block
-
系统用于描述正在运行的进程的所有信息
-
包含内容:
-
PID(进程标识符)
-
当前工作路径 chdir
-
umask(默认0002)
-
进程打开的文件列表
-
信号相关设置(处理异步IO)
-
用户ID、组ID
-
其他状态信息
-
3. 进程资源限制
-
打开文件个数:1024
-
栈大小:8M
二、进程与程序的区别
| 方面 | 程序 | 进程 |
|---|---|---|
| 状态 | 静态(硬盘存储) | 动态(执行过程) |
| 存在时间 | 永久 | 暂时 |
| 状态变化 | 无 | 有创建、调度、消亡 |
| 并发性 | 无 | 可以并发执行 |
| 资源竞争 | 无 | 存在竞争计算机资源 |
| 对应关系 | 可运行多次→多个进程 | 可运行一个或多个程序 |
执行流程:
.c文件 → 编译 → a.out(可执行文件) → 执行 → process(进程,有PID)
三、虚拟内存与进程空间
1. 虚拟内存作用
-
隔离性:A进程不能访问B进程的内存空间
-
安全性:通过权限控制访问内核(Linux系统运行在内存上)
2. 进程分类
-
交互式进程:需要用户输入,给出对应输出
-
批处理进程:Shell脚本,批量执行命令
-
守护进程:自动运行,默认不需输入,休眠状态,特定条件触发运行
- 示例:更新进程、杀毒软件
四、并发与进程调度
1. 并发
-
定义:在一个时间段内同时运行多个任务的能力
-
宏观并行:时间段内每个进程都在运行
-
微观串行:某一时刻只有一个进程在运行
2. 进程调度
-
原因:多个进程想运行,但CPU只有一个
-
常见调度算法:
-
时间片轮转
-
短任务优先
-
进程优先级
-
完全公平调度算法(CFS)
-
3. 进程上下文切换
-
场景:A进程CPU时间片耗尽,需运行B进程
-
过程:
-
A进程将状态信息(PCB、寄存器、PC、内存数据)缓存到硬盘
-
A进程释放内存
-
B进程将缓存数据读入内存
-
B进程开始运行
-
五、Linux进程相关命令
| 命令 | 功能 |
|---|---|
ps aux |
显示所有进程相关信息 |
top |
Linux任务管理器 |
kill -9 pid |
强制关闭指定PID的进程 |
killall -9 a.out |
关闭所有名为a.out的进程 |
六、进程相关函数
1. fork() 函数
pid_t fork(void);
-
功能:从当前进程克隆一个同名新进程(子进程)
-
特点:
-
一次调用,返回两次
-
执行顺序不确定(子进程或父进程可能先运行)
-
变量不共享(各自独立的内存空间)
-
子进程复制父进程的0-3G空间和PCB(PID不同)
-
子进程从fork()之后开始执行
-
-
返回值:
-
父进程中:成功返回子进程PID(>0),失败返回-1
-
子进程中:成功返回0
-
2. getpid() 函数
pid_t getpid(void);
-
功能:获得调用进程的PID
-
返回值:进程PID
3. getppid() 函数
pid_t getppid(void);
-
功能:获得调用进程的父进程PID
-
返回值:父进程PID
七、重要概念总结
-
进程状态:包括创建、就绪、运行、阻塞、终止等状态
-
进程关系:父子进程关系,一个父进程可以有多个子进程
-
进程独立性:每个进程有独立的地址空间,互不干扰
-
进程复制:fork()创建的子进程是父进程的拷贝
-
进程生命周期:从创建到终止的完整过程
八、理解要点
-
进程是动态的,程序是静态的
-
PCB是进程的核心,记录了进程的所有信息
-
并发是通过调度实现的,不是真正的并行
-
父子进程共享代码段,但数据段是独立的
-
进程调度是操作系统的核心功能,确保系统高效运行